Хуки и их очереди выполнения функций-хуков в Wordpress и Woocommerce

Я новичок в Wordpress/WooCommerce и PHP, хотя у меня есть опыт работы с другими веб-платформами и языками. Я искал, но не нашел ответа на свой вопрос, который...

Являются ли хуки, созданные с помощью «add_action», «добавлены» в список действий, вызываемых этим конкретным хуком, или они переопределяют любые существующие хуки этого действия?

Например, если я добавлю хук woocommerce_thankyou, используя:

add_action( 'woocommerce_thankyou', 'order_created_get_skus',#);

Вопрос: переопределяет ли это какие-либо другие обработчики для woocommerce_thankyou или вызывается в дополнение к любым другим обработчикам, установленным для woocommerce_thankyou?


person Eric B    schedule 11.10.2018    source источник


Ответы (1)


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

Они добавляются в своего рода "очередь ловушек" с порядком выполнения, основанным на правилах приоритета:

  • Если указан приоритет, они будут упорядочены в очереди сначала по приоритету ловушки и по приоритету объявления.
  • Если приоритет не указан, они получают приоритет по умолчанию 10 и будут упорядочены в очереди по объявлению.

Таким образом, у вас может быть много подключенных функций на одном хуке, например, в файле шаблона Woocommerce content-single-product.php

Иллюстрированный пример:

В приведенном ниже примере кода с комментариями вы можете увидеть порядок выполнения в очереди ловушек для каждой перехваченной функции для ловушки действия woocommerce_thankyou:

// No defined priority (default priority is 10)
add_action( 'woocommerce_thankyou', 'first_custom_function_no_priority' );
function first_custom_function_no_priority( $order_id ) {
    // ==> Triggered in third position ==> [3]
}

## Default Hook "woocommerce_order_details_table" (default priority is 10)
    // ==> Triggered in second position ==> [2]

// Defined priority is 10
add_action( 'woocommerce_thankyou', 'order_created_get_skus', 10 );
function order_created_get_skus( $order_id ) {
    // ==> Triggered in Fourth position ==> [4] 
}

// Defined priority is 5
add_action( 'woocommerce_thankyou', 'third_custom_function', 5 );
function third_custom_function( $order_id ) {
    // ==> Triggered in first position ==> [1]
}

// Defined priority is 20
add_action( 'woocommerce_thankyou', 'fourth_custom_function', 20 );
function fourth_custom_function( $order_id ) {
    // ==> Triggered at last (sixth) ==> [6]
}

// No defined priority (default priority is 10)
add_action( 'woocommerce_thankyou', 'last_custom_function_no_priority' );
function last_custom_function_no_priority( $order_id ) {
    // ==> Triggered in fifth position ==> [5]
}

Низкий приоритет выполняется (или инициируется) раньше, более высокий приоритет выполняется (или инициируется) после. Если приоритет не указан, приоритет по умолчанию равен 10.

Подключенные функции можно удалить только с помощью remove_action() или remove_filter() с обязательным установленным приоритетом.

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

global $wp_filter;

// HERE below you define the targeted hook name
$hook_name = 'woocommerce_widget_shopping_cart_buttons';

if( isset($wp_filter[$hook_name]) ) {
    echo '<pre>';
    print_r($wp_filter[$hook_name]);
    echo '</pre>';
} else {
    echo '<p>Hook "'.$hook_name.'" is not used yet!</p>';
}

Как вы уже заметили, есть 2 вида хуков: хуки-фильтры и хуки-действия.

  1. Хук действия:

    • Action hook execution point (trigger): with do_action()
    • Присоединение функции к хуку действия (срабатывает): с add_action(): функция выполняется и может иметь необязательные аргументы.
  2. Крюк фильтра:

    • Filter hook execution point (trigger): with apply_filters()
    • Присоединение функции к обработчику фильтра (фильтрация/активация): с помощью add_filter(): обязательный аргумент (переменная) фильтруется и возвращается из "перехваченной" функции

Хуки и связанные с ними функции могут быть расположены в любом месте, например, в файле function.php вашей активной дочерней темы (или активной темы), а также в любых плагинах. сильные> php-файлы.


Связанный:

person LoicTheAztec    schedule 11.10.2018
comment
LoicTheAztec, большое спасибо за объяснение. - person Eric B; 12.10.2018