Como saber qual prioridade usar com add_action ()?

12

Eu estava escrevendo um pequeno plug-in para remover alguns itens de menu para usuários não administradores do back-end e descobri que meu plug-in não fazia nada a menos que eu especificasse uma prioridade no meu código:

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

Sem o 999, o código não remove os itens da minha remove_toolbar_itemsfunção e com ele funciona muito bem:

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');
    }
}

Os documentos para o estado do parâmetro de prioridade:

Usado para especificar a ordem na qual as funções associadas a uma ação específica são executadas. Os números mais baixos correspondem à execução anterior e as funções com a mesma prioridade são executadas na ordem em que foram adicionadas à ação. Valor padrão: 10

No entanto, não encontrei nada que explique como você deve determinar qual prioridade usar. Como você determina quando usar a prioridade e qual prioridade usar? Sinto como se estivesse coçando a cabeça por horas se não tivesse brincado com o parâmetro priority.

Além disso, vejo que a prioridade padrão é 10, mas existe um intervalo conhecido de valores de prioridade?

j08691
fonte

Respostas:

6

intervalo de valores de prioridade? intervalo de valores de prioridade?

De um modo geral, você não pode saber a priori com que prioridade algo está relacionado. A prioridade necessária depende de como outros retornos de chamada foram conectados. Geralmente, esse é o valor padrão 10, mas pode estar em qualquer lugar entre PHP_INT_MIN(números inteiros negativos ainda são números inteiros) PHP_INT_MAXe não há como ter certeza, exceto pelo experimento e, se possível ( como no Core e em todos os temas ou plugins com os quais você se preocupa especificamente), examinando a fonte.

s_ha_dum
fonte
1
Obrigado. Parece que o núcleo deve ter um pequeno utilitário interno para fornecer essas informações.
J08691
Essa informação não está correta e não pode ser respondida. Mohammed Asif respondeu corretamente. has_filter ('init', 'some_hook') permite saber qual é a ação prioritária.
Юра Косяк
5

O WordPress coloca suas ações em uma matriz com prioridades indexadas. Você pode ver isso imprimindo (no painel do administrador admin_init) $wp_filter:

* Nota *, como @s_ha_dum aponta nos comentários abaixo, admin_initpode não pegar todos os ganchos adicionados à ação, a impressão mais confiável pode estar sendo conectada shutdown.

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

Isso nos dá uma matriz elegante que se parece com isso: (simplificado)

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 e assim por diante são as prioridades das ações; quando uma nova ação é adicionada, ela é padronizada para 10, semelhante ao índice 0 no exemplo acima, elas são apenas empilhadas no mesmo índice da matriz . Considerando que muitos ganchos foram adicionados a essa ação específica, você desejaria no final ou, finalmente, após a execução de uma ação específica (como menus). Uma das duas prioridades também poderia funcionar com a mesma eficácia: 81ou 201.

Na maior parte, a prioridade padrão 10 é suficiente. Outras vezes, você deseja adicionar seu gancho diretamente após o outro (para talvez anular seu objetivo ou remover um item específico). Nesse caso, você pode usar o global $wp_filter;para descobrir para onde ele precisa ir.

Howdy_McGee
fonte
Pensei sobre isso, mas ele só mostrará coisas ligadas antes ou depois admin_init e apenas coisas ligadas à instalação atual. Ele não diz nada sobre o que um plugin ou tema ainda não desinstalado pode fazer. +1 de qualquer maneira.
s_ha_dum
@s_ha_dum Esse é um bom ponto, imagino que você também possa usar algo como, admin_footercerto? Ou isso seria o mesmo problema?
Howdy_McGee
1
O shutdowngancho seria sua melhor aposta, mas apenas para o código instalado e, mesmo assim, as coisas podem ser conectadas condicionalmente, para que seja possível perder algumas de qualquer maneira.
s_ha_dum