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


12

Estaba escribiendo un pequeño complemento para eliminar algunos elementos de menú para usuarios no administradores del backend, y descubrí que mi complemento 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 remove_toolbar_itemsfunción, y con él funciona muy bien:

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

Los documentos para el estado del parámetro de prioridad:

Se utiliza para especificar el orden en que se ejecutan las funciones asociadas con una acción particular. Los números más bajos corresponden a la ejecución anterior, y las funciones con la misma prioridad se ejecutan en el orden en que se agregaron 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 se determina cuándo usar la prioridad y qué prioridad usar? Siento que podría haber estado rascándome la cabeza durante horas si no hubiera jugado con el parámetro de prioridad.

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

Respuestas:


6

rango de valores de prioridad? rango de valores de prioridad?

En términos generales, no se puede saber a priori con qué prioridad se engancha algo. La prioridad necesaria depende de cómo se engancharon otras devoluciones de llamada. A menudo, ese es el valor predeterminado de 10, pero podría estar en cualquier lugar entre PHP_INT_MIN(los enteros negativos siguen siendo enteros) PHP_INT_MAXy no hay forma de estar seguro excepto por experimento y, si es posible ( al igual que con el Core y cualquier tema o complemento que le interese específicamente), examinando la fuente.


1
Gracias. Parece que el núcleo debería tener una pequeña utilidad incorporada para brindarle esta información.
j08691

Esa no es información correcta y no se puede responder. Mohammed Asif respondió correctamente. has_filter ('init', 'some_hook') permite saber qué acción prioritaria tiene.
Юра Косяк

5

WordPress pone sus acciones en una matriz con prioridades indexadas. Puede 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_initpuede que no capte todos los ganchos agregados en la acción, la impresión más confiable puede estar enganchándose en su shutdownlugar.

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

Esto nos da una matriz ordenada que se parece a esto: (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] => ...
    )
)

El 0, 4, 7, 10, y así sucesivamente son las prioridades de las acciones, cuando se agrega una nueva acción, su valor predeterminado es 10, similar al índice 0 en el ejemplo anterior, simplemente se apilan en el mismo índice de la matriz . Teniendo en cuenta que muchos ganchos se agregan a esta acción en particular que desearía al final o al final después de ejecutar una acción específica (como menús). 1 de las dos prioridades también podría funcionar con la misma eficacia: 81o 201.

En su mayor parte, la prioridad predeterminada de 10 es suficiente. Otras veces, desea agregar su gancho directamente después de otro (para anular su propósito o eliminar un elemento específico), en cuyo caso puede usar el global $wp_filter;para averiguar a dónde debe ir.


Pensé en esto, pero solo mostrará las cosas enganchadas antes o después admin_init y solo las cosas enganchadas en la instalación actual. No dice nada sobre lo que podría hacer un plugin o tema aún desinstalado. +1 de todos modos.
s_ha_dum

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

1
El shutdowngancho sería su mejor opción, pero solo para el código instalado e incluso entonces, las cosas se pueden enganchar condicionalmente, por lo que es posible que se pierda algo de todos modos.
s_ha_dum


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.