Поиск…


Синтаксис

  • add_action (tag, function_to_call, priority, num_of_args);
  • add_filter (tag, function_to_call, priority, num_of_args);

параметры

параметр объяснение
$ тег (строка) (обязательно) Имя действия, к которому подключена функция $.
функция $ (вызываемый) (обязательно) Требуется строка, содержащая имя функции или анонимную функцию. См. Примеры добавления функций в классы.
$ приоритет (int) default = 10. Функции, прикрепленные к крючкам / фильтрам, будут выполняться в приоритете. Возможно, у вас может быть ситуация, когда вы хотите работать с кодом перед любыми другими действиями, установить приоритет = 1 или после всех остальных подключенных функций priority = 100 и т. Д. Как и во всех php-функциях, вы можете использовать эту функцию, не передавая значение переменной где установлено значение по умолчанию, но если вы хотите изменить количество возвращаемых параметров, вы должны указать!
параметры $ (int) default = 1. Количество параметров, возвращаемых вашей присоединенной функции. Возвращенные параметры будут зависеть от числа, приложенного к тому месту, где был создан крючок. Подробнее см. apply_filters() и do_action() .

замечания

Крючки для Wordpress

Что-то, что часто путает разработчиков при работе с WordPress, это использование apply_filters() и add_action() . Вы часто увидите плагины / темы, использующие их в коде, и если вы не понимаете концепцию, вам будет трудно работать с ними.

Вкратце (очень кратко, посмотрите блок-схему загрузки WordPress для процесса подробно), WordPress загружается следующим образом:

  1. wp-load.php - функции и т. д.
  2. mu-plugins - любые файлы, найденные в папке mu-plugins - часто используются для обслуживания кешированных объектов
  3. Плагины - нет определенного порядка, любые установленные и активированные плагины будут загружены
  4. Активная дочерняя тема / родительская тема
  5. init - остаток данных
  6. шаблон

Если вы являетесь разработчиком и работаете с файлом функций, вы можете видеть, что оба они загружаются ранее в процессе, чем файлы, с которыми вы работаете. Это означает, что вы не можете изменять процессы (обратите внимание, что вы не можете перезаписывать функции) или переменные, которые запускаются позже или еще не определены. Кроме того, разработчики темы могут размещать крючки в своем коде, чтобы плагины могли подключаться или плагины могли позволить другим плагинам перезаписывать свои переменные. Теперь это может запутать до сих пор, но висеть там.

Чтобы понять add_filter() и add_action() нам нужно посмотреть, как создаются крючки в первую очередь.

$arga= 'hello';
do_action('im_a_hook', $arga );

Когда вы столкнетесь с вышеизложенным в WordPress, он вызовет любые функции, прикрепленные к крюку im_a_hook (найдите информацию о $wp_filter для получения информации о процессе). В вашей прилагаемой функции $arga будет доступна для присоединенной функции для работы.

add_action('im_a_hook', 'attached_function');

function attached_function($arga){
     echo $arga;
}

Это открывает новые возможности для изменения переменных в определенных точках процесса загрузки. Помните, мы уже говорили, что шаблоны загружаются после плагинов / тем? Один общий плагин - WooCommerce, который создает экраны позже в этом процессе, я не буду документировать, как пример примера do_action можно найти в плагине.

do_action( 'woocommerce_after_add_to_cart_button' );

Здесь у нас есть созданный крюк, который не возвращает никаких переменных, но мы все равно можем с ним повеселиться:

add_action( 'woocommerce_after_add_to_cart_button', 'special_offer');

function special_offer(){
    echo '<h1>Special Offer!</h1>;
}

Вышеупомянутое add_action будет echo заголовком специального предложения, где находится do_action('woocommerce_after_add_to_cart_button') который создается при создании экрана WooCommerce. Поэтому мы можем использовать этот крючок для вставки html. Другие виды использования могут включать перенаправление на другой экран вообще и т. Д.

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

add_action('custom_hook', 'attached_function', 10, 3);

function attached_function($a,$b,$c){
    
    var_dump($a);
    var_dump($b);
    var_dump($c);
    
}
    

$arga = 1;
$argb = 2;
$argc = 3;

do_action('custom_hook', $arga, $argb, $argc);
exit;

Существует еще один тип крюка WP, называемый фильтром. Фильтр отличается от действия в его использовании, действие может принимать только переменные, очевидно, что эти переменные находятся в пределах области функций (вы должны знать, что такое область php, если не Google). Фильтры возвращают возвращенные данные, поэтому вы можете использовать для изменения переменных.

$filter_me= apply_filters('im_a_filter', $variable_to_filter);

Там, где вы видите вышеизложенное, вы можете изменить значение $filter_me как любые возвращаемые вами данные будут значением, хранящимся в переменной. Так, например (обратите внимание, что мы изменяем $variable_to_filter на $filter_me в примере):

add_filter('im_a_filter', 'attached_function', 100);

function attached_function($filter_me){
    
    $filter_me= 'ray';
    
    return $filter_me;
    
}


$filter_me = 'bob';
$filter_me= apply_filters('im_a_filter', $filter_me);

$filter_me теперь будет содержать «луч», а не «bob» , мы установили приоритет 100, поэтому мы уверены, что никто не меняет значение после использования (на одном и том же крюке может быть несколько фильтров). Таким образом, мы теперь могут изменять переменные, используемые позже в процессе, если присутствует apply_filters() .

Вы также можете передать несколько параметров, но вы можете изменить значение только одного. Вы также должны вернуть значение, иначе ваша переменная не будет содержать ничего. Если вы понимаете, как вы используете php для присвоения переменных / массивов / объектов переменным, это будет очевидно для вас, например:

add_filter('im_a_filter', 'attached_function', 100, 3);

function attached_function($filter_me, $arga, $argb){
    
    $filter_me= 'ray'.$arga.$argb;

    $arga= 'you fool';
    
    return $filter_me;
    
}

$filter_me = 'bob';

$arga = ' middlename';
$argb = ' surname';

$filter_me= apply_filters('im_a_filter', $filter_me, $arga, $argb);

В переменной $filter_me теперь содержится имя луча middlameame . Но как насчет $arga ? Это все еще содержит «middlename» , меняя $arga на «вас, дурак» внутри нашей функции, не влияет на определенное значение за пределами его области (есть способы, глобальные переменные google и т. Д.),

add_action ($ hook_name, $ function, $ priority, $ parameters)

add_filter ($ hook_name, $ function, $ priority, $ parameters);

add_action - init

add_action('init', 'process_post');

function process_post(){
   if($_POST)
     var_dump($_POST);
}

add_action - init - анонимная функция

add_action('init' , function(){
    echo 'i did something';
});

add_action - init - внутри объекта класса

 class sample{

     public function __construct(){
         add_action('init', array($this, 'samp') );
     }


     public function samp(){ // must be public!!
         echo 'i did something';
     }
 }

 new sample();   

add_action - init - внутри статического класса

 class sample{

     public static function add_action_func(){
         //note __CLASS__ will also include any namespacing
         add_action('init', array(__CLASS__, 'samp') );
     }

     public static function samp(){
         echo 'i did something';
     }
     
 }

 sample::add_action_func();


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow