Intereting Posts
Сортировка wp_nav_menu () по меню страница не перенаправляет В каких запросах SQL / WordPress потребуется nonce? ограничение пользовательской перезаписи только одним пользовательским типом сообщения Вставка сообщений, заголовков и настраиваемых полей с помощью wp_insert_post Ошибка при отправке формы с использованием AJAX и php Как преобразовать функциональные возможности вкладки в wordpress, используя только один запрос? Исчезающее всплывающее окно для соединения Linkedin Как получить полный контент, включая шаблон HTML Более быстрый способ wp_insert_post & add_post_meta навалом Я хочу создать разбивку на страницы для моего настраиваемого архива типа сообщения, который я показываю с помощью цикла Несколько экземпляров TinyMCE удаляют тег <p> Добавление мастера в мой плагин Как влиять на информацию, отображаемую в виджетах внутри wp-admin Получение списка категорий, а затем использование их в качестве пользовательских ссылок для формы

Передача параметра для фильтрации и действий

Является способом передать свои собственные параметры функции в add_filter или add_action . Например, посмотрите в следующем коде:

 function my_content($content, $my_param) { do something... using $my_param here ... return $content; } add_filter('the_content', 'my_content', 10, 1); 

Могу ли я передать свой собственный параметр? что-то вроде:

 add_filter('the_content', 'my_content($my_param)', 10, 1) 

или

 add_filter('the_content', 'my_content', 10, 1, $my_param) 

По умолчанию это невозможно. Есть способы обхода пути, если вы делаете это способом ООП.
Вы можете создать класс для хранения значений, которые вы хотите использовать позже.

Пример:

 /** * 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>"; } 

Недостатком является то, что вы не можете писать модульные тесты для закрытия.

Создайте функцию с необходимыми аргументами, которые возвращают функцию. Передайте эту функцию (анонимная функция, также называемая закрытием) на wp-hook.

Показан здесь для уведомления администратора в wordpress backend.

 public function admin_notice_func( $message = '') { $class = 'error'; $output = sprintf('<div class="%s"><p>%s</p></div>',$class, $message); $func = function() use($output) { print $output; }; return $func; } $func = admin_notice_func('Message'); add_action('admin_notices', $func); 

Я знаю, что прошло время, но у меня возникла проблема с передачей моего собственного параметра, пока я не обнаружил, что 4-й параметр в add_filter – это количество переданных параметров, включая контент для изменения. Поэтому, если вы передаете 1 дополнительный параметр, число должно быть 2, а не 1 в вашем случае

 add_filter('the_content', 'my_content', 10, 2, $my_param) 

и использование

 function my_content($content, $my_param) {...} 

если вы создаете свой собственный крючок, вот пример.

 // lets say we have three parameters [ https://codex.wordpress.org/Function_Reference/add_filter ] add_filter( 'filter_name', 'my_func', 10, 3 ); my_func( $first, $second, $third ) { // code } 

затем установите hook:

 // [ https://codex.wordpress.org/Function_Reference/apply_filters ] echo apply_filters( 'filter_name', $first, $second, $third ); 

Использовать анонимные функции php:

 $my_param = 'my theme name'; add_filter('the_content', function ($content) use ($my_param) { //$my_param is available for you now if (is_page()) { $content = $my_param . ':<br>' . $content; } return $content; }, 10, 1); 

Вы всегда можете использовать глобальный, не так ли?

  global $my_param; 

Я надеялся сделать то же самое, но поскольку это невозможно, я думаю, что простым обходным add_filter('the_content', 'my_content_filter', 10, 1); является вызов другой функции, такой как add_filter('the_content', 'my_content_filter', 10, 1);

то my_content_filter () может просто вызвать my_content (), передавая любой аргумент, который он хочет.