do_action() WP 1.2.0

Створює подію (можливість запустити php функції у потрібний момент роботи коду). Підключати php функцію до події за допомогою add_action() .

Також дивіться аналогічну функцію: do_action_ref_array() .

ВАЖЛИВО: Якщо не передати жоден параметр у хук, то функція хука все одно отримає один параметр зі значенням ''(порожній рядок).

add_action( 'action_name', function( $first ){
	var_dump($first);
} );

do_action( 'action_name'); // виведе> string(0) ""

Не передавайте масив з одним об’єктом

При виклику do_action, якщо переданий $arg є масивом з одним об’єктом, замість нього буде переданий саме цей об’єкт, а не масив. Однак, якщо єдиний елемент масиву не є об’єктом, такої заміни не станеться.

Приклад:

function my_callback( $should_be_an_array ){
   print_r ($ should_be_an_array);
}

add_action( 'my_action', 'my_callback');

do_action( 'my_action', array( new stdclass() ) );

/*
stdClass Object()
*/

do_action( 'my_action', array( 'array_item_thats_not_an_object') );

/*
Array (
	[0] => array_item_thats_not_an_object
)
*/

Зверніть увагу, що вперше ми передали масив із класом stdclass, але функція зворотного виклику отримала лише клас stdclass, а не масив!

Крім подій WP також є фільтри – apply_filters() . Принцип роботи у них такий самий – створюємо фільтр і прикріплюємо до нього функцію php яка спрацює під час роботи фільтра.

Різниця між фільтрами та подіями у цьому, що фільтр отримує якісь дані і має повернути ці дані після їх обробки, тобто. він фільтрує (змінює) дані, а подія тільки запускає прикріплені до нього функції в потрібний момент, передавши в них якісь параметри.

Основа для:
wp_footer() ,
wp_head()
1 раз – 0.00007 сек
(дуже швидко) | 50000 разів – 0.03 сек
(швидкість світла)

Хуків немає.

Повертає

null. Нічого не вертає.

Використання

do_action( $tag, $arg_a, $arg_b, ...);
$tag
(рядок) (обов’язковий)
Назва хука, що створюється.
$arg_a
(рядок/масив/число/об’єкт/логічний)
Значення аргументу, який буде передано.


За замовчуванням аргумент не існує
$arg_b
(рядок/масив/число/об’єкт/логічний)
Значення ще одного аргументу…


За замовчуванням аргумент не існує
$arg_с
(рядок/масив/число/об’єкт/логічний)
Функції можна передавати безліч аргументів.

Приклади

0

#1 Приклад використання

Цю функцію можна використовувати в плагінах, темах і т.д., коли потрібно впровадитись у процес виконання коду, звідкись з іншого місця. Наприклад, “зачіпку” (хук) (do_action) ми встановили в плагіні, а “чіплятися” за неї будемо з файлу functions.php в той момент, коли спрацьовуватиме наша “зачіпка”.

Допустимо, ми використовували такий код у плагіні:

<?php
// Визначаємо аргументи для хука action
$a = $defined; // $defined якась динамічна логічна змінна
$b = 'А це значення другої змінної';

// Включаємо хук. Тут він виконуватиметься
do_action( 'my_hook', $a, $b);

Тепер ми можемо зробити якусь дію в момент спрацьовування функції do_action і при цьому описати нашу дію можна, наприклад, з файлу functions.php, розмістивши в ньому такий код:

function do_my_hook( $a, $b ){
	// якщо передана змінна $a дорівнює true,
	// то, наприклад, видалимо запис 10
	if( $a===true )
		wp_delete_post(10);
	// а тут просто виведемо змінну на екран
	echo '<br />'.$b; // виведе значення другої змінної
}
// Реєструємо хук через
// add_action($tag, $function_to_add, $priority, $accepted_args);
add_action( 'my_hook', 'do_my_hook', 10, 2);

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

0

#2 Приклад використання 2

Десь у (mu-)плагіні, темі чи ядрі. Наприклад, у файлі functions.php:

/**
 * У вас може бути стільки аргументів, скільки ви хочете,
 * але ваша функція зворотного виклику та виклик add_action повинні бути узгоджені за кількістю аргументів.
 * Примітка: `add_action` вище має 2, а 'i_am_hook' приймає 2.
 * Ви знайдете подібні хуки дій у багатьох темах та плагінах та у багатьох місцях @core.
 * @see: https://codex.wordpress.org/Plugin_API/Action_Reference
 */

/**
 * Визначаємо функцію зворотного виклику
 * Всередині цієї функції ви можете робити все, що вам заманеться.
 * Зі змінними, які завантажені у викликі do_action() вище.
 */
function who_is_hook( $a, $b ) {

	print_r($a); // `print_r` дані масиву всередині 1-го аргументу

	echo $b; // Виводимо символ перекладу рядка та значення 2-го аргументу
}

// потім додати його в хук дії, зіставивши певну кількість (2) аргументів у do_action
// див. [https://codex.wordpress.org/Function_Reference/add_action] у Кодексі

// add_action($tag, $function_to_add, $priority, $accepted_args);
add_action( 'i_am_hook', 'who_is_hook', 10, 2);

// Define the arguments for the action hook
$a = array(
	'eye patch' => 'yes',
	'parrot' => true,
	'wooden leg' => 1
);

$b = 'And Hook said: "I ate ice cream with Peter Pan."';

// Executes the action hook named 'i_am_hook'
do_action( 'i_am_hook', $a, $b);

Результат:

Array (
	['eye patch'] => 'yes'
	['parrot'] => true
	['wooden leg'] => 1
)
And hook said: "I ate ice cream with Peter Pan."

нотатки

  • Global. WP_Hook[]. $wp_filter Stores all of the filters and actions.
  • Global. int[]. $wp_actions Stores number of times each action був triggered.
  • Global. Рядок[]. $wp_current_filter Stores список поточних filtrів з поточним одним останнім.

список змін

З версії 1.2.0Введено.
З версії 5.3.0Formalizated existing and already documented …$arg parameter by adding it to the функція signature.

Код do_action() WP 6.0.2

function do_action( $hook_name, ...$arg ) {
	Global $wp_filter, $wp_actions, $wp_current_filter;

	if ( ! isset ( $wp_actions [ $ hook_name ] ) ) {
		$wp_actions[ $hook_name ] = 1;
	} else {
		++$wp_actions[ $hook_name ];
	}

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

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

	if (empty($arg)) {
		$arg[] = '';
	} elseif ( is_array( $arg[0] ) && 1 === count( $arg[0] ) && isset( $arg[0][0] ) && is_object( $arg[0][0] ) ) {
		// Backward compatibility for PHP4-style passing of `array(&$this)` as action `$arg`.
		$arg[0] = $arg[0][0];
	}

	$wp_filter[ $hook_name ]->do_action( $arg );

	array_pop($wp_current_filter);
}

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

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