Theo mặc định, điều này là không thể. Có cách giải quyết nếu bạn làm theo cách OOP.
Bạn có thể tạo một lớp để lưu trữ các giá trị bạn muốn sử dụng sau này.
Thí dụ:
/**
* 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 )
)
);
}
}
Bây giờ bạn có thể gọi lớp với bất kỳ hàm nào bạn muốn - nếu hàm tồn tại ở đâu đó, nó sẽ được gọi với các tham số được lưu trữ của bạn.
Hãy tạo một chức năng demo
/**
* 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>';
}
Tập và sử dụng nó một lần
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
'wpse_45901_add_numbers'
)
);
… Và một lần nữa …
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
'wpse_45901_add_numbers'
)
);
Đầu ra:
Chìa khóa là khả năng sử dụng lại : Bạn có thể sử dụng lại lớp (và trong các ví dụ của chúng tôi cũng là hàm).
PHP 5.3 trở lên
Nếu bạn có thể sử dụng phiên bản PHP 5.3 hoặc các lần đóng mới hơn sẽ giúp việc đó dễ dàng hơn nhiều:
$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>";
}
Nhược điểm là bạn không thể viết bài kiểm tra đơn vị cho việc đóng cửa.