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 | Введено. |