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

12

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

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, но есть ли известный диапазон значений приоритетов?

j08691
источник

Ответы:

6

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

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

s_ha_dum
источник
1
Спасибо. Похоже, ядро ​​должно иметь небольшую встроенную утилиту, чтобы дать вам эту информацию.
j08691
Это неверная информация и не может быть ответа. Мухаммед Асиф ответил правильно. has_filter ('init', 'some_hook') позволяет узнать, какое приоритетное действие имеет.
Юра Косяк
5

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;чтобы выяснить, куда он должен идти.

Howdy_McGee
источник
Я думал об этом, но он только покажет вещи, подключенные до или после, admin_init и только вещи, подключенные к текущей установке. В нем ничего не говорится о том, что может сделать еще неустановленный плагин или тема. +1 в любом случае.
s_ha_dum
@s_ha_dum Это хороший вопрос, я думаю, вы могли бы использовать что-то вроде, admin_footerхотя, верно? Или это будет та же проблема?
Howdy_McGee
1
shutdownКрюк будет лучшим выбором, но только для установленного кода и даже тогда, вещи могут быть условно зацепила так что это может быть возможно пропустить некоторые так или иначе.
s_ha_dum
3

Ну, есть способ найти приоритет действия.

мы можем использовать следующий код, has_action( $tag, $function_to_check )который при желании возвращает приоритет этой ловушки для указанной функции.

Ссылка: https://codex.wordpress.org/Function_Reference/has_action

Мохаммед Асиф
источник