WordPress как на ладони
wordpress jino

do_action() WP 1.2.0

Создает событие (зацепку для произвольной функции). Чтобы функция сработала в момент события её нужно подключить к этому событию с помощью функции add_action().

Кроме событий в WP есть еще фильтры (filters), принцип работы такой же. Разницы лишь в том, что фильтр должен вернуть полученную переменную, т.е. он фильтрует (изменяет) данные, а событие позволяет запустить пользовательскую функцию в момент срабатывания этого события. Фильтры запускаются функцией apply_filters()

Используется в: wp_footer(), wp_head().
✈ 1 раз = 0.00007с = очень быстро | 50000 раз = 0.03с = скорость света

Хуков нет.

Возвращает

Ничего не возвращает.

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

do_action( $tag, $arg_a, $arg_b, ... );
$tag(строка) (обязательный)
Название создаваемого хука.
$arg_a(строка/массив/число/объект/логический)
Значение аргумента, который будет передан.
По умолчанию: аргумент не существует
$arg_b(строка/массив/число/объект/логический)
Значение еще одного аргумента...
По умолчанию: аргумент не существует
$arg_с(строка/массив/число/объект/логический)
Функции можно передавать бесконечно много аргументов...

Примеры

#1. Пример использования

do_action нужно использовать в функциях, плагинах, темах и т.д., где возможно понадобится внедрится в процесс выполнения кода, откуда-нибудь с другого места. Например, "зацепку" (хук) (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 );

Действия отличаются от фильтров, тем что передаваемые действием данные, не возвращаются обратно в функцию и не используются там в дальнейшем, а всего-лишь передаются для использования в функции хука.

Код do action: wp-includes/plugin.php WP 4.8.2

<?php
function do_action($tag, $arg = '') {
	global $wp_filter, $wp_actions, $wp_current_filter;

	if ( ! isset($wp_actions[$tag]) )
		$wp_actions[$tag] = 1;
	else
		++$wp_actions[$tag];

	// Do 'all' actions first
	if ( isset($wp_filter['all']) ) {
		$wp_current_filter[] = $tag;
		$all_args = func_get_args();
		_wp_call_all_hook($all_args);
	}

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

	if ( !isset($wp_filter['all']) )
		$wp_current_filter[] = $tag;

	$args = array();
	if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)
		$args[] =& $arg[0];
	else
		$args[] = $arg;
	for ( $a = 2, $num = func_num_args(); $a < $num; $a++ )
		$args[] = func_get_arg($a);

	$wp_filter[ $tag ]->do_action( $args );

	array_pop($wp_current_filter);
}

Cвязанные функции

Из метки: События (хуки)

Еще из раздела: Хуки: события, фильтры

do_action 6 комментариев
  • Алёна cайт: kaktebe.net

    А что это вообще даёт? Зачем это?

    -3
    Ответить5.5 лет назад #
  • Николай

    Добрый день. Скажите, можно ли создать дополнительную кнопку на странице добавления записей, чтобы отправлять пост, к примеру, на почту. При этом не затрагивая кнопку опубликовать. Я так понимаю это возможно сделать с помощью хука, но использовать стандартные привязки, например чтобы функция отправки на почту срабатывала при публикации поста нельзя. Т.е. необходимо создать собственное действие и првязать к нему функцию. Уже всю голову себе сломал. Можт быть Вы подскажите. Заранее спасибо.

    Ответить5.2 лет назад #
  • Аноним

    Спасибо. Полезная статья без лишней воды, все по делу.

    2
    Ответить3.10 года назад #
  • Николай

    Мое первое, огромное спасибо, не знаю, как бы я выкручивался без Вашего сайта

    Ответить2.3 года назад #
  • Мария

    Здравствуйте, скажите могу ли я через do_action выполнить только одну функцию прицепленную к этому экшну?
    Пример:
    вот экшн со списком хуков

    <?php
    			/**
    			 * woocommerce_single_product_summary hook.
    			 *
    			 * @hooked woocommerce_template_single_title - 5
    			 * @hooked woocommerce_template_single_rating - 10
    			 * @hooked woocommerce_template_single_price - 10
    			 * @hooked woocommerce_template_single_excerpt - 20
    			 * @hooked woocommerce_template_single_add_to_cart - 30
    			 * @hooked woocommerce_template_single_meta - 40
    			 * @hooked woocommerce_template_single_sharing - 50
    			 */
    			do_action( 'woocommerce_single_product_summary' );
    		?>

    а мне нужно вызвать только woocommerce_template_single_title как это сделать?

    Ответить1.6 года назад #
    • artikus73 cайт: wpruse.ru @

      Можете просто функцию woocommerce_template_single_title()в нужном месте вызвать и не обязательно хуком пользоваться.

      1
      Ответить1.5 года назад #

Здравствуйте, !

Ваш комментарий