Как узнать, какой приоритет использовать с add_action ()?

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

add_action('admin_bar_menu', 'remove_toolbar_items', 999); 

Без 999 код не удаляет элементы в моей функции remove_toolbar_items , и с ним он отлично работает:

 function remove_toolbar_items( $wp_admin_bar ) { if ( !current_user_can( 'manage_options' ) ) { $wp_admin_bar->remove_node('new-post'); $wp_admin_bar->remove_node('comments'); } } 

Документы для состояния приоритета:

Используется для указания порядка, в котором выполняются функции, связанные с конкретным действием. Более низкие номера соответствуют более раннему исполнению, а функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены в действие. Значение по умолчанию: 10

Однако я не нашел ничего, что объясняет, как вы должны определять, какой приоритет использовать. Как вы определяете, когда использовать приоритет, и какой приоритет использовать? Мне кажется, что я мог часами царапать себе голову, если бы не играл с параметром приоритета.

Кроме того, я вижу, что приоритет по умолчанию – 10, но есть ли известный диапазон значений приоритета?

Solutions Collecting From Web of "Как узнать, какой приоритет использовать с add_action ()?"

диапазон значений приоритета? диапазон значений приоритета?

Вообще говоря, вы не можете знать априори, какой приоритет что-то связано. Необходимый приоритет зависит от того, как другие обратные вызовы подключаются. Часто это значение по умолчанию 10, но оно может быть где-то между 1 и PHP_INT_MAX и нет никакого способа убедиться, кроме эксперимента и, если это возможно (как в случае с Core и любые темы или плагины, к которым вы конкретно относитесь), изучив источник.

WordPress помещает ваши действия в массив с индексированными приоритетами. Вы можете это увидеть, распечатав (в админ-панели admin_init ) $wp_filter :

* Примечание *, как указывает @s_ha_dum в комментариях ниже, admin_init не может поймать все добавленные крючки в действие, более надежная распечатка может быть связана с shutdown .

 function filter_print() { global $wp_filter; print_r( $wp_filter['admin_bar_menu'] ); die(); } add_action( 'admin_init', 'filter_print' ); 

Это дает нам аккуратный массив, который выглядит примерно так: (упрощенный)

 Array( [admin_bar_menu] => Array ( [0] => Array ( [wp_admin_bar_my_account_menu] => Array ( [function] => wp_admin_bar_my_account_menu [accepted_args] => 1 ) [wp_admin_bar_sidebar_toggle] => Array ( [function] => wp_admin_bar_sidebar_toggle [accepted_args] => 1 ) ) [4] => Array ( [wp_admin_bar_search_menu] => Array ( [function] => wp_admin_bar_search_menu [accepted_args] => 1 ) ) [7] => Array ( [wp_admin_bar_my_account_item] => Array ( [function] => wp_admin_bar_my_account_item [accepted_args] => 1 ) ) [10] => Array ( [wp_admin_bar_wp_menu] => Array ( [function] => wp_admin_bar_wp_menu [accepted_args] => 1 ) ) [20] => ... ) ) 

0, 4, 7, 10 и т. Д. Являются приоритетами действий, когда добавляется новое действие, оно по умолчанию равно 10, подобно индексу 0 в приведенном выше примере, они просто складываются в один и тот же индекс массива , Учитывая, что в это конкретное действие добавлено много крючков, вы хотели бы в самом конце или, наконец, после выполнения определенного действия (например, меню). 1 из двух приоритетов также может работать так же эффективно: 81 или 201 .

По большей части приоритет по умолчанию 10 достаточно. В других случаях вы хотите добавить свой крючок прямо за другим (возможно, аннулировать его цель или удалить определенный элемент), в этом случае вы можете использовать global $wp_filter; выяснить, куда он должен идти.