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

add_action() WP 1.2.0

Регистрирует хук-событие. При регистрации указывается PHP функция, которая сработает в момент события, которое вызывается с помощью do_action().

Хук на который цепляется функция добавляется с помощью функции do_action().

Действия (actions), в отличии от фильтров (add_filter()), нужны, чтобы выполнить какое-либо действие в нужный момент, тогда как фильтры передают и получают обратно данные, которые затем используются.

Список всех важных событий в порядке их выполнения указан на странице хуки.

Неофициально: фильтры - это те же самые события, работают они точно также и их можно использовать как события (вместо add_filter() можно использовать функцию add_action() и наоборот). Например, можно не изменяя возвращать полученные данные, но помимо этого выполнять какую-нибудь операцию (например запись в БД). Правда это бывает нужно очень редко. Все места где нужно вмешаться в код движка, разработчики, пытаются предусмотреть и вставить в это место событие.

О фильтрах и событиях читайте в этой заметке: как работают хуки в WordPress

Работает на основе: add_filter()
✈ 1 раз = 0.000018с = очень быстро | 50000 раз = 0.07с = скорость света PHP 7.0.8, WP 4.7

Хуков нет.

Возвращает

Всегда true.

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

add_action( $tag, $function_to_add, $priority, $accepted_args );
$tag(строка) (обязательный)
Название действия, к которому будем цеплять функцию.
$function_to_add(строка/замыкание) (обязательный)
Название функции, которая должна быть вызвана во время срабатывания действия, т.е. функция которую цепляем к хуку. Формат передачи функции - обычно строка, подробнее тут.
$priority(число)
Приоритет выполнения функции. Если на этот же хук "прицеплены" еще функции, то приоритет будет решать последовательность их выполнения. Меньше число - раньше выполняется, т.е. 10 будет выполняться раньше чем 20.
По умолчанию: 10
$accepted_args(число)
Число аргументов, которые принимает функция. Разумеется действие должно передавать это число аргументов.
По умолчанию: 1

Примеры

#1 Обычный хук

Будем отправлять письмо друзьям, при публикации нового поста:

function email_friends( $post_ID ){
   $friends = 'bob@example.org, susie@example.org';
   wp_mail( $friends, "sally's blog updated", 'I just put something on my blog: http://blog.example.com' );

   return $post_ID;
}
add_action('publish_post', 'email_friends');

Точно так же можно зарегистрировать этот хук через add_filter():

add_filter('publish_post', 'email_friends');

#2 Получение аргумента

do_action() передает аргумент в функцию и его можно использовать. В предыдущем примере это был ID поста, но мы его не использовали, потому он нам не был нужен. Теперь, пример того, как использовать передаваемый аргумент:

function echo_comment_id( $comment_ID ){
   echo "I just received ". $comment_ID;
}
add_action('comment_id_not_found', 'echo_comment_id', 10, 1 );

#3 Анонимная функция

В качестве колбэк функции можно передавать анонимную функцию, например:

<?php add_action('wp_head', function() { echo 'something';}) ?>

Такие анонимные функции не работают совместно с PHP ускорителями.

Также, важно знать, что такую анонимную функцию в дальнейшем невозможно будет удалить функцией remove_action().

#4 Добавление события из PHP класса

Если для события нужно использовать как-либо метод PHP класса, то во втором аргументе, вместо названия функции, нужно указать массив, где первым аргументом будет название класса, а вторым название метода этого класса.

Для случаев когда событие вызывается внутри класса (чаще всего так и происходит), вместо название класса (первый аргумент массива), указывается $this:

// Подключение метода класса за пределами класса
add_action( 'wp_head', array( 'MyClass', 'mymethod' ) );

class MyClass {
	public function __construct() {
	// Подключение метода класса внутри класса
		add_action( 'save_post', array( $this, 'mymethod' ) );
	}

	public function mymethod() {
		// код функции
	}
}

Заметки

Чтобы узнать сколько аргументов передает действие, найдите его в коде и посмотрите. Например, тут передается 2 аргумента:

do_action( 'save_post', $post_ID, $post );

и для такого хука, код зацепки будет выглядеть так:

add_action( 'save_post', 'my_save_post', 10, 2 );

а функция будет иметь 2 аргумента:

function my_save_post( $post_ID, $post ){
   // здесь код функции
}

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

<?php
function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
	return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

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

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

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

add_action 26 комментариев
Полезные 1 Все
  • Андрей

    add_action( 'save_post', 'my_save_post');
    Добавил в плагин, но функция выполняется всегда 2 раза... с чем это может быть связано?
    в тоже время все add_action() не относящиеся к 'save_post' работают коректно!

    Ответить4.8 года назад #
  • MingONE

    А в случае с изменением произвоольных полей у определённого поста как-то можно запустить экшн

    Ответить4.1 года назад #
    • Kama4464
      add_action( 'updated_postmeta', 'handler_function', 10, 4);
      function handler_function($meta_id, $object_id, $meta_key, $meta_value){
      	// здесь код
      }
      Ответить4.1 года назад #
  • Андрей

    Подскажите, я написал плагин, вывел его в подменю "параметры" через
    add_action('admin_menu', 'my_plugin');
    Как сделать чтобы пункт появился в левой колонке под "Комментарии" или хотя бы в самом низу?

    Ответить3.8 года назад #
  • Otshelnik-fm182 cайт: across-ocean.otshelnik-fm.ru

    Привет.
    Тимур, а подскажи как поймать экшн у ajax плагина?

    Меня интересует wp-postratings например. При выставлении рейтинга чтобы выполнялось условие. С условием то вроде все в порядке.

    add_action ('???', 'reset_rate_page');

    подскажи искусство отлова таких событий smile

    Ответить3.5 года назад #
    • Kama4464

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

      Ответить3.5 года назад #
      • Otshelnik-fm182 cайт: across-ocean.otshelnik-fm.ru

        То-есть зря я в экшны лезу? Надо искать add_filter?

        Ну а потом из functions.php мне просто прописать этот фильтр надо и функцию к нему?

        Ответить3.5 года назад #
        • Kama4464

          add_filter и add_action это по сути одно и тоже - любой add_filter можно использовать как зацепку для события по идее. Ищи то или это, все что найдется может пригодится, зависит от задачи. Совсем не уверен, что в wp-pastratings вообще есть подходящие фильтры.

          Ответить3.5 года назад #
  • petrozavodsky675 cайт: alkoweb.ru

    Давайте добавим использование add_action из класса:

    в кодексе вот что про это пишут

    class MyClass {
    /*Конструктор класса*/
    	public function __construct() {
    	add_action( 'save_post', array( $this, 'mymethod' ) );
    }
    
    public function mymethod() {
    	/*Какой то код*/
    }
    
    }

    ну вобщем нужно массивом передавать первым элементом $this вторым имя метода, подробнее не нашел описания какого то и сам не разбирался еще глубже.

    Ответить3.4 года назад #
  • алекс @

    Я ИМЕЮ ввиду где брать вот это 'wp_head'

    Ответить3.3 года назад #
    • atapys

      ищите в исходниках где зареген этот action или filter.

      function wp_head() {
      	/**
      	 * Print scripts or data in the head tag on the front end.
      	 *
      	 * @since 1.5.0
      	 */
      	do_action( 'wp_head' );
      }
      Ответить3.1 года назад #
  • Vitaly cайт: reklamapilot.ru

    Добавил событие

    add_action( 'user_register', wpjc_add_new_user_in_group_justclick );

    На локальной машине работает, на хостинге нет. Какая причина может быть?

    Ответить3.3 года назад #
  • chiffenok

    Я ни как не могу понять принцип работы do_action и add_action. Если в футоре есть строка do_action( 'catchbox_before_footer_sidebar' ); , где я смотреть что она выполняет? нету ни одного add_function( 'catchbox_before_footer_sidebar' ) в файлах темы

    Ответить3 года назад #
    • Kama4464

      Не факт, что вообще что-то выполняется... Ищите такую строку

      add_action('catchbox_before_footer_sidebar', ...

      если её нет, то ничего не выполняется вообще.

      Ответить3 года назад #
      • chiffenok

        Ни чего такого не нашла, а если ни чего нету то почему тогда стоит do_action( 'catchbox_before_footer_sidebar' ); ? что оно делает не может же быть просто так?

        Ответить3 года назад #
        • Kama4464

          Попробуйте удалить эту строку, если ничего не произойдет, то она скорее всего ничего не делает... Такое может быть, хук есть, но к нему ничего не подцеплено, но зато может быть подцеплено, когда понадобится...

          Ответить2.10 года назад #
  • ZarazZzko cайт: marketsiting.ru

    Здравствуйте, использовала функцию

    add_action( 'init', 'slider');
    function slider(){
    register_post_type ('slider',array(
    'public'=>true,
    	));
    }

    выдает ошибку syntax error, unexpected T_STRING ,
    подскажите, пожалуйста, что не так

    Ответить2.9 года назад #
    • Kama4464

      Ошибка в написании кода, но в коде все так, у вас точно на этот код ошибка указывает?

      Ответить2.9 года назад #
      • ZarazZzko cайт: marketsiting.ru

        да, когда я этот кусок комментирую, сайт в целом работает.

        Ответить2.9 года назад #
        • Kama4464

          Странно. Попробуйте переписать этот код снова, без копирования. Может так символ какой-то неправильный есть. У меня такой глюк был как-то раз...

          Ответить2.9 года назад #
    • Уберите запятую в данной строке:

      'public'=>true,

      PS: после последнего элемента массива НЕ должно быть запятой... и все у Вас получится.

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

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

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