默认情况下,这是不可能的。如果你用面向对象的方法来做的话,还有一些变通方法
您可以创建一个类来存储以后要使用的值。
示例:
/**
* Stores a value and calls any existing function with this value.
*/
class WPSE_Filter_Storage
{
/**
* Filled by __construct(). Used by __call().
*
* @type mixed Any type you need.
*/
private $values;
/**
* Stores the values for later use.
*
* @param mixed $values
*/
public function __construct( $values )
{
$this->values = $values;
}
/**
* Catches all function calls except __construct().
*
* Be aware: Even if the function is called with just one string as an
* argument it will be sent as an array.
*
* @param string $callback Function name
* @param array $arguments
* @return mixed
* @throws InvalidArgumentException
*/
public function __call( $callback, $arguments )
{
if ( is_callable( $callback ) )
return call_user_func( $callback, $arguments, $this->values );
// Wrong function called.
throw new InvalidArgumentException(
sprintf( \'File: %1$s<br>Line %2$d<br>Not callable: %3$s\',
__FILE__, __LINE__, print_r( $callback, TRUE )
)
);
}
}
现在,您可以使用任何想要的函数调用该类–如果该函数存在于某个位置,则将使用存储的参数调用该类。
让我们创建一个演示函数…
/**
* Filter function.
* @param array $content
* @param array $numbers
* @return string
*/
function wpse_45901_add_numbers( $args, $numbers )
{
$content = $args[0];
return $content . \'<p>\' . implode( \', \', $numbers ) . \'</p>\';
}
…并使用一次…
add_filter(
\'the_content\',
array (
new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
\'wpse_45901_add_numbers\'
)
);
…再一次…
add_filter(
\'the_content\',
array (
new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
\'wpse_45901_add_numbers\'
)
);
输出:
关键是reusability: 您可以重用该类(在我们的示例中还可以重用该函数)。
PHP 5.3+
如果可以使用PHP 5.3或更新版本
closures 将使这更容易:
$param1 = \'<p>This works!</p>\';
$param2 = \'This works too!\';
add_action( \'wp_footer\', function() use ( $param1 ) {
echo $param1;
}, 11
);
add_filter( \'the_content\', function( $content ) use ( $param2 ) {
return t5_param_test( $content, $param2 );
}, 12
);
/**
* Add a string to post content
*
* @param string $content
* @param string $string This is $param2 in our example.
* @return string
*/
function t5_param_test( $content, $string )
{
return "$content <p><b>$string</b></p>";
}
缺点是不能为闭包编写单元测试 ;