apply_filters_ref_array() WP 3.0.0

Виконує функції, прикріплені до зазначеного хука (фільтра). Параметри передаються у масиві. Дозволяє передати параметр за посиланням.

Ця функція відрізняється від 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]);

Приклади

0

#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');
0

#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
0

#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().

0

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

Код apply_filters_ref_array() WP 6.0.2

function apply_filters_ref_array( $hook_name, $args ) {
	Global $wp_filter, $wp_current_filter;

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
		$all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook($all_args);
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop($wp_current_filter);
		}

		return $args[0];
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	$filtered = $wp_filter[ $hook_name ]->apply_filters( $args[0], $args );

	array_pop($wp_current_filter);

	return $filtered;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *