web-dev-qa-db-fra.com

Comment savoir quelle priorité utiliser avec add_action ()?

J'écrivais un petit plugin pour supprimer certains éléments de menu pour les utilisateurs non-administrateurs du backend, et j'ai découvert que mon plugin ne faisait rien à moins que je spécifie une priorité dans mon code:

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

Sans le 999, le code ne supprime pas les éléments de ma fonction remove_toolbar_items et fonctionne très bien avec:

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

Le docs pour l’état du paramètre prioritaire:

Utilisé pour spécifier l'ordre dans lequel les fonctions associées à une action particulière sont exécutées. Les nombres inférieurs correspondent aux exécutions antérieures et les fonctions ayant la même priorité sont exécutées dans l'ordre dans lequel elles ont été ajoutées à l'action. Valeur par défaut: 10

Cependant, je n'ai rien trouvé qui explique comment vous êtes censé déterminer quelle priorité utiliser. Comment déterminez-vous quand utiliser la priorité et quelle priorité utiliser? Je sens que je pourrais me gratter la tête pendant des heures si je n'avais pas joué au paramètre de priorité.

De plus, je vois que la priorité par défaut est 10, mais existe-t-il une plage connue de valeurs de priorité?

8
j08691

gamme de valeurs prioritaires? gamme de valeurs prioritaires?

En règle générale, vous ne pouvez pas savoir a priori avec quelle priorité une chose est dépendante. La priorité requise dépend de la manière dont les autres rappels sont pris en charge. Il s’agit souvent de la valeur par défaut de 10, mais elle peut être comprise entre 1 et PHP_INT_MAX et il n’ya aucun moyen d’en être sûr sauf par expérience et, si possible thèmes ou plugins qui vous intéressent plus particulièrement), en examinant la source.

5
s_ha_dum

WordPress place vos actions dans un tableau avec des priorités indexées. Vous pouvez le voir en imprimant (dans le panneau d'administration admin_init) $wp_filter:

* Note * _ Comme @s_ha_dum le souligne dans les commentaires ci-dessous, admin_init peut ne pas capturer tous ajouts de crochets dans l'action, l'impression la plus fiable peut être un accrochage dans shutdown à la place.

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

Cela nous donne un tableau soigné qui ressemble à ceci: (simplifié)

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] => ...
    )
)

Les priorités 0, 4, 7, 10, etc., sont les priorités des actions. Lorsqu'une nouvelle action est ajoutée, sa valeur par défaut est 10, similaire à l'indice 0 dans l'exemple ci-dessus, elles sont simplement empilées dans le même index du tableau. . Étant donné que de nombreux points d'ancrage sont ajoutés à cette action particulière, vous souhaiterez le faire à la toute fin ou enfin après l'exécution d'une action spécifique (telle que les menus). L'une des deux priorités pourrait également fonctionner aussi efficacement: 81 ou 201.

Pour la plupart, la priorité par défaut de 10 est suffisante. D'autres fois, vous souhaitez ajouter votre crochet directement après l'autre (pour éventuellement annuler son objectif ou supprimer un élément spécifique), auquel cas vous pouvez utiliser le global $wp_filter; pour déterminer où il doit aller.

4
Howdy_McGee

Eh bien, il y a un moyen de trouver la priorité d'une action.

nous pouvons utiliser le code suivant has_action( $tag, $function_to_check ) qui retourne éventuellement la priorité sur ce hook pour la fonction spécifiée.

Réf.: https://codex.wordpress.org/Function_Reference/has_action

1
Mohammed Asif