Comment savoir quelle priorité utiliser avec add_action ()?

12

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 sauf si je spécifiais 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 remove_toolbar_itemsfonction, et avec lui cela fonctionne très 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');
    }
}

Les documents 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 à une exécution antérieure et les fonctions de 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 la priorité à utiliser. Comment déterminez-vous quand utiliser la priorité et quelle priorité utiliser? J'ai l'impression que j'aurais pu me gratter la tête pendant des heures si je n'avais pas joué avec le paramètre prioritaire.

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

j08691
la source

Réponses:

6

gamme de valeurs prioritaires? gamme de valeurs prioritaires?

En règle générale, vous ne pouvez pas savoir a priori à quelle priorité quelque chose est accroché. La priorité requise dépend de la façon dont les autres rappels sont connectés. Souvent, c'est la valeur par défaut de 10, mais elle peut être n'importe où entre PHP_INT_MIN(les entiers négatifs sont toujours des entiers) et PHP_INT_MAXet il n'y a aucun moyen d'être sûr, sauf par expérimentation et, si possible ( comme avec le Core et tous les thèmes ou plugins qui vous intéressent spécifiquement), en examinant la source.

s_ha_dum
la source
1
Merci. On dirait que le noyau devrait avoir un petit utilitaire intégré pour vous donner ces informations.
j08691
Ce ne sont pas des informations correctes et ne peuvent pas être répondu. Mohammed Asif a répondu correctement. has_filter ('init', 'some_hook') permet de savoir quelle action prioritaire a.
Юра Косяк
5

WordPress met 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:

* Remarque * comme @s_ha_dum le fait remarquer dans les commentaires ci-dessous, il se admin_initpeut que tous les crochets ajoutés ne soient pas pris en compte dans l'action, l'impression plus fiable peut se connecter à la shutdownplace.

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 0, 4, 7, 10 et ainsi de suite sont les priorités des actions, lorsqu'une nouvelle action est ajoutée, sa valeur par défaut est 10, similaire à l'index 0 dans l'exemple ci-dessus, elles sont simplement empilées dans le même index du tableau . Étant donné que de nombreux crochets sont ajoutés à cette action particulière, vous voudriez tout à la fin ou enfin après l'exécution d'une action spécifique (comme les menus). Une des deux priorités pourrait également fonctionner aussi efficacement: 81ou 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 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.

Howdy_McGee
la source
J'y ai pensé, mais cela ne montrera que les choses accrochées avant ou dessus admin_init et seulement les choses accrochées à l'installation actuelle. Il ne dit rien sur ce qu'un plugin ou un thème non encore installé pourrait faire. +1 de toute façon.
s_ha_dum
@s_ha_dum C'est un bon point, j'imagine que vous pouvez également utiliser quelque chose comme ça, admin_footernon? Ou serait-ce le même problème?
Howdy_McGee
1
Le shutdowncrochet serait votre meilleur pari, mais uniquement pour le code installé et même dans ce cas, les choses peuvent être liées de manière conditionnelle, il peut donc être possible d'en manquer de toute façon.
s_ha_dum