¿Cómo saber qué prioridad usar con add_action()?

23 jun 2015, 19:45:03
Vistas: 39.9K
Votos: 18

Estaba escribiendo un pequeño plugin para eliminar algunos elementos del menú para usuarios no administradores desde el backend, y descubrí que mi plugin no hacía nada a menos que especificara una prioridad en mi código:

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

Sin el 999, el código no elimina los elementos en mi función remove_toolbar_items, y con él funciona perfectamente:

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

La documentación para el parámetro de prioridad indica:

Se utiliza para especificar el orden en el que se ejecutan las funciones asociadas a una acción particular. Los números más bajos corresponden a una ejecución más temprana, y las funciones con la misma prioridad se ejecutan en el orden en que fueron agregadas a la acción. Valor predeterminado: 10

Sin embargo, no encontré nada que explique cómo se supone que debes determinar qué prioridad usar. ¿Cómo determinas cuándo usar la prioridad y qué prioridad usar? Siento que podría haber estado rascándome la cabeza durante horas si no hubiera experimentado con el parámetro de prioridad.

Además, veo que la prioridad predeterminada es 10, pero ¿hay un rango conocido de valores de prioridad?

0
Todas las respuestas a la pregunta 4
2

¿Rango de valores de prioridad? ¿Rango de valores de prioridad?

Generalmente hablando, no puedes saber a priori con qué prioridad está enganchado algo. La prioridad necesaria depende de cómo otros callbacks fueron enganchados. A menudo es el valor por defecto de 10, pero podría estar en cualquier lugar entre PHP_INT_MIN (los enteros negativos siguen siendo enteros) y PHP_INT_MAX y no hay forma de estar seguro excepto mediante experimentación y, si es posible (como con el Core y cualquier tema o plugin que te preocupe específicamente), examinando el código fuente.

23 jun 2015 20:01:25
Comentarios

Gracias. Parece que el núcleo debería tener alguna pequeña utilidad incorporada para darte esta información.

j08691 j08691
24 jun 2015 22:34:06

Esa no es la información correcta y no puede ser la respuesta. Mohammed Asif respondió correctamente. has_filter('init', 'some_hook') permite saber qué prioridad tiene la acción.

Yurii Kosiak Yurii Kosiak
27 abr 2020 10:05:05
3

WordPress organiza tus acciones en un array con prioridades indexadas. Puedes ver esto imprimiendo (en el panel de administración admin_init) $wp_filter:

*Nota* como @s_ha_dum señala en los comentarios a continuación, admin_init puede no capturar todos los hooks añadidos a la acción, una impresión más confiable podría ser enlazando a shutdown en su lugar.

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

Esto nos da un array ordenado que se ve algo así: (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] => ...
    )
)

Los números 0, 4, 7, 10, y así sucesivamente son las prioridades de las acciones, cuando una nueva acción es añadida por defecto es 10, similar al índice 0 en el ejemplo anterior, simplemente se agrupan en el mismo índice del array. Considerando que muchos hooks son añadidos a esta acción particular, querrías estar al final o justo después de que una acción específica se ejecute (como los menús). 1 de las dos prioridades podría funcionar igual de efectivamente: 81 o 201.

En la mayoría de los casos, la prioridad por defecto de 10 es suficiente. Otras veces querrás añadir tu hook directamente después de otro (para quizás anular su propósito o eliminar un elemento específico) en cuyo caso puedes usar global $wp_filter; para averiguar dónde necesita ir.

23 jun 2015 20:13:06
Comentarios

Pensé en esto, pero solo mostrará cosas enganchadas antes o en admin_init y solo cosas enganchadas en la instalación actual. No dice nada sobre lo que un plugin o tema aún no instalado podría hacer. +1 de todas formas.

s_ha_dum s_ha_dum
23 jun 2015 20:29:44

@s_ha_dum Ese es un buen punto, imagino que también podrías usar algo como admin_footer, ¿verdad? ¿O sería el mismo problema?

Howdy_McGee Howdy_McGee
23 jun 2015 20:31:13

El hook shutdown sería tu mejor opción, pero solo para código instalado e incluso así, las cosas pueden engancharse condicionalmente, por lo que es posible que se pierdan algunas de todas formas.

s_ha_dum s_ha_dum
23 jun 2015 20:34:33
0

Bueno, hay una manera de encontrar la prioridad de una acción.

Podemos usar el siguiente código has_action( $tag, $function_to_check ) que opcionalmente devuelve la prioridad en ese hook para la función especificada.

Ref: https://codex.wordpress.org/Function_Reference/has_action

26 dic 2017 08:58:50
0

Por si alguien está buscando la lista de prioridad/referencia de acciones de WordPress, el enlace completo de los hooks está aquí:

https://codex.wordpress.org/Plugin_API/Action_Reference/

4 oct 2019 16:44:58