apply_filters_ref_array()
Виконує функції, прикріплені до зазначеного хука (фільтра). Параметри передаються у масиві. Дозволяє передати параметр за посиланням.
Ця функція відрізняється від apply_filters() тим, що параметри прикріплену функцію передаються в масиві. Це дозволяє передати деякі з параметрів посилання.
Ця функція може бути корисною, коли аргументи, що передаються, вже знаходяться в масиві, або коли потрібно передати додатковий аргумент за посиланням (зауважу, що об’єкти і так передаються за посиланням і для них можна використовувати звичайну функцію для цієї мети).
При передачі аргументів не забудьте переконатися, що вони знаходяться в потрібному порядку.
Хуків немає.
Повертає
Разное
. Відфільтроване значення після того, як всі прикріплені до хука функції опрацюють це значення.
Використання
apply_filters_ref_array($tag, $args);
-
$tag
(рядок) (обов’язковий) - Назва фільтра (хуку).
-
$args
(масив) (обов’язковий) Параметри, які будуть передані до прикріпленої функції. Усі параметри мають бути передані як елементи одного масиву. А прикріплена функція отримає кожен елемент цього масиву як окремий параметр:
// функція, що прикріплюється function my_filter_func( $var, $var2 ){ // $var - 1 // $var2 - 2 return $var; } // 2 - означає, що функція отримає два параметри add_filter('my_filter', 'my_filter_func', 10, 2); // Викликаємо фільтр $one = apply_filters_ref_array('my_filter', [1, 2]);
Приклади
#1 Демонстрація передачі параметрів
$ args = array ( 'arg_1', true, 'foo', 'arg_4'); $arg_1 = apply_filters_ref_array( 'my_filter', $args );
Цей запис рівносильний такий:
$arg_1 = apply_filters( 'my_filter', 'arg_1', true, 'foo', 'arg_4');
#2 Приклад додавання функції до фільтра
// Викликаємо хук $filtered = apply_filters_ref_array( 'my_filter', [10, 2, 3]); //> 10 // тепер, прикріпимо функцію add_filter( 'my_filter', 'my_filter_func', 10, 3); // 3 - отримає 3 параметри function my_filter_func( $var, $var2, $var3 ){ return $var2 + $var3; } // Викликаємо хук ще рас, але тепер до нього прикріплено функцію my_filter_func() $filtered = apply_filters_ref_array( 'my_filter', array( 10, 2, 3 ) ); //> 5
#3 Передача змінних за посиланням
У цьому вся прикладі ми передаємо всі параметри в масиві, у своїй перший параметр працюватиме як і звичайному фільтрі, тобто. прикріплена функцію має повернути саме його, а сам фільтр поверне лише перший параметр масиву, в даному прикладі це змінна $orderby .
Також, у другому параметрі ми передаємо змінну за посиланням та у прикріпленій функції my_filter_func() отримуємо її за посиланням. Таким чином при зміні цієї змінної всередині прикріпленої функції вона також зміниться і за межами функції.
// Прикріпимо функцію до фільтра add_filter( 'my_filter', 'my_filter_func', 10, 2); function my_filter_func( $orderby, & $link ){ // Змінимо параметр $link за посиланням $link = 'new val'; // Змінимо параметр $orderby як для звичайного фільтра return 'DESC'; }
Тепер спробуємо викликати фільтр різними способами:
Виклик 1 (все працює як слід)
Викликаємо через apply_filters_ref_array() та вказуємо посилання на другий параметр.
// Визначимо змінну, яку хочемо передати за посиланням $link = 'old val'; // Викликаємо фільтр echo apply_filters_ref_array( 'my_filter', [ 'ASC', & $link ] ); // DESC // Перевіримо як змінилася змінна за посиланням echo $link; // new val
Виклик 2 (Parse Error)
Пробуємо зробити те саме, що й вище, тільки через apply_filters():
$link = 'old val'; // Parse Error: syntax error, unexpected '&', expecting ')' echo apply_filters( 'my_filter', 'ASC', & $link);
Виклик 3 (Warning)
Пробуємо зробити те саме, що й вище, через apply_filters(), тільки передаємо змінну яка сама є посиланням на іншу змінну:
$link = 'old val'; $create_link = &$link; echo apply_filters( 'my_filter', 'ASC', $create_link); // DESC // Warning: Parameter 2 to my_filter_func() expected to be a reference echo $link; // old val
Як бачимо з усіх викликів правильно відпрацював лише перший, де використовується поточна функція apply_filters_ref_array().
#4 Передача об’єкта у фільтр за посиланням
Цей приклад показує, що передачі класу не обов’язково використовувати apply_filters_ref_array() , а можна використовувати базову функцію apply_filters() коли у фільтр потрібно передати поточний об’єкт $this .
Зверніть увагу, що в функції, що прикріплюється, немає необхідності вказувати посилання (& – просто $class, а не & $class) для одержуваного параметра, тому що об’єкти в PHP завжди передається за посиланням.
class A { var $var = 'один'; function __construct(){ add_filter( 'my_filter', [ $this, 'filter_func' ], 10, 2); } function filter_func( $orderby, $class ){ // у разі не обов'язково вказувати & для $class, // тому що об'єкти завжди передаються за посиланням! // Змінимо об'єкт $class->var = 'one'; // Змінимо параметр $orderby як для звичайного фільтра return 'DESC'; } function apply_filters_and_echo(){ $orderby = apply_filters( 'my_filter', 'ASC', $this ); var_dump($orderby); // string(4) "DESC" var_dump($this->var); // string(3) "one" } } // виклик класу $class = new A(); $class->apply_filters_and_echo(); /* Отримаємо: string(4) "DESC" string(3) "one" */
нотатки
- Дивіться: (hook_name) supplied using an array.
- Global. WP_Hook[]. $wp_filter Stores all of the filters and actions.
- Global. Рядок[]. $wp_current_filter Stores список поточних filtrів з поточним одним останнім.
список змін
З версії 3.0.0 | Введено. |