По умолчанию это невозможно. Есть обходные пути, если вы делаете это ООП способом.
Вы можете создать класс для хранения значений, которые вы хотите использовать позже.
Пример:
/**
* 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'
)
);
Выход:
Ключом является возможность повторного использования : вы можете повторно использовать класс (и в наших примерах также функцию).
PHP 5.3+
Если вы можете использовать PHP версии 5.3 или более новые замыкания, это сделает это намного проще:
$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>";
}
Недостатком является то, что вы не можете писать модульные тесты для замыканий.
$func = function() use ( $param1 ) { $param1; };
иadd_action( $func, 11);
), вы можете удалить ее с помощьюremove_action( $func, 11 );
Создайте функцию с необходимыми аргументами, которая возвращает функцию. Передайте эту функцию (анонимная функция, также известная как замыкание) на хук wp.
Показано здесь для уведомления администратора в WordPress Backend.
источник
Используйте php анонимные функции :
источник
Я знаю, что время прошло, но у меня были некоторые проблемы с передачей моего собственного параметра, пока я не обнаружил, что 4-й параметр в add_filter - это количество переданных параметров, включая содержимое, которое нужно изменить. Таким образом, если вы передаете 1 дополнительный параметр, число должно быть 2, а не 1 в вашем случае
и используя
источник
Правильно, очень короткий и наиболее эффективный путь прохождения независимо от количества аргументов WP фильтров и действий от @Wesam Alalem здесь , который использует замыкание.
Я бы только добавил, что вы можете сделать его еще более понятным и гораздо более гибким, отделив реальный метод делателя от анонимного закрытия. Для этого вы просто вызываете метод из замыкания следующим образом (модифицированный пример из ответа @Wesam Alalem).
Таким образом, вы можете написать настолько длинную или сложную логику, сколько пожелаете, за пределами замыкания, которое вы используете для вызова фактического делателя.
источник
если вы создаете свой собственный хук, вот пример.
затем реализовать крюк:
источник
3
?Вы всегда можете использовать глобальный, не так ли?
источник
Несмотря на прямой вызов функции, сделайте это более элегантным способом: передайте анонимную функцию в качестве обратного вызова.
Например:
У меня есть одна функция для перевода заголовка, содержания и выдержки из моих сообщений. Итак, мне нужно передать этой основной функции несколько аргументов, говорящих о том, кто звонит.
Итак, основная функция
translate_text
получает столько параметров, сколько я хочу, только потому, что я передала анонимную функцию в качестве обратного вызова.источник
Я надеялся сделать то же самое, но так как это невозможно, я думаю, что простой обходной путь - это вызвать другую функцию, такую как
add_filter('the_content', 'my_content_filter', 10, 1);
тогда my_content_filter () может просто вызвать my_content (), передавая любой аргумент, который он хочет.
источник