Woher wissen Sie, welche Priorität mit add_action () verwendet werden soll?

11

Ich habe ein kleines Plugin geschrieben, um einige Menüelemente für Benutzer ohne Administratorrechte aus dem Backend zu entfernen, und festgestellt, dass mein Plugin nichts getan hat, es sei denn, ich habe in meinem Code eine Priorität angegeben:

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

Ohne das entfernt 999der Code die Elemente in meiner remove_toolbar_itemsFunktion nicht und funktioniert damit hervorragend:

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

Die Dokumente für den Prioritätsparameterstatus:

Wird verwendet, um die Reihenfolge anzugeben, in der die einer bestimmten Aktion zugeordneten Funktionen ausgeführt werden. Niedrigere Zahlen entsprechen einer früheren Ausführung, und Funktionen mit derselben Priorität werden in der Reihenfolge ausgeführt, in der sie der Aktion hinzugefügt wurden. Standardwert: 10

Ich habe jedoch nichts gefunden, was erklärt, wie Sie bestimmen sollen, welche Priorität verwendet werden soll. Wie bestimmen Sie, wann und welche Priorität verwendet werden soll? Ich habe das Gefühl, ich hätte mir stundenlang am Kopf kratzen können, wenn ich nicht mit dem Prioritätsparameter herumgespielt hätte.

Ich sehe auch, dass die Standardpriorität 10 ist, aber gibt es einen bekannten Bereich von Prioritätswerten?

j08691
quelle

Antworten:

6

Bereich der Prioritätswerte? Bereich der Prioritätswerte?

Im Allgemeinen kann man nicht a priori wissen, mit welcher Priorität etwas verbunden ist. Die erforderliche Priorität hängt davon ab, wie andere Rückrufe eingebunden wurden. Oft ist dies der Standardwert von 10, er kann jedoch irgendwo dazwischen liegen PHP_INT_MIN(negative Ganzzahlen sind immer noch Ganzzahlen), PHP_INT_MAXund es gibt keine Möglichkeit, sicher zu sein, außer durch Experimente und, wenn möglich ( wie beim Core und allen Themen oder Plugins, mit denen Sie sich speziell befassen), indem Sie die Quelle untersuchen.

s_ha_dum
quelle
1
Vielen Dank. Scheint, als ob der Kern ein kleines eingebautes Dienstprogramm haben sollte, um Ihnen diese Informationen zu geben.
j08691
Das sind keine korrekten Informationen und können nicht beantwortet werden. Mohammed Asif antwortete richtig. Mit has_filter ('init', 'some_hook') können Sie feststellen, welche Priorität die Aktion hat.
27ра Косяк
4

WordPress fügt Ihre Aktionen in ein Array mit indizierten Prioritäten ein. Sie können dies durch Ausdrucken (im Admin-Bereich admin_init) sehen $wp_filter:

* Hinweis * Wie @s_ha_dum in den Kommentaren unten ausführt, werden admin_initmöglicherweise nicht alle hinzugefügten Hooks in die Aktion einbezogen, sondern der zuverlässigere Ausdruck wird möglicherweise shutdownverwendet.

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

Dies gibt uns ein ordentliches Array, das ungefähr so ​​aussieht: (vereinfacht)

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

Die Werte 0, 4, 7, 10 usw. sind die Prioritäten der Aktionen. Wenn eine neue Aktion hinzugefügt wird, wird standardmäßig 10 verwendet, ähnlich wie bei Index 0 im obigen Beispiel. Sie werden nur in denselben Index des Arrays gestapelt . In Anbetracht der Tatsache, dass dieser bestimmten Aktion viele Hooks hinzugefügt werden, möchten Sie diese ganz am Ende oder zuletzt nach dem Ausführen einer bestimmten Aktion (z. B. Menüs) ausführen. Eine der beiden Prioritäten könnte ebenso effektiv funktionieren: 81oder 201.

Zum größten Teil ist die Standardpriorität von 10 ausreichend. In anderen Fällen möchten Sie Ihren Hook direkt nach dem anderen hinzufügen (um möglicherweise seinen Zweck aufzuheben oder ein bestimmtes Element zu entfernen). In diesem Fall können Sie mithilfe des global $wp_filter;Hooks herausfinden, wohin er gehen muss.

Howdy_McGee
quelle
Ich habe darüber nachgedacht, aber es werden nur Dinge angezeigt, die zuvor oder später angeschlossen waren, admin_init und nur Dinge, die bei der aktuellen Installation angeschlossen waren. Es sagt nichts darüber aus, was ein noch deinstalliertes Plugin oder Theme tun könnte. +1 sowieso.
s_ha_dum
@s_ha_dum Das ist ein guter Punkt, ich kann mir vorstellen, dass Sie auch so etwas verwenden könnten, admin_footeroder? Oder wäre das das gleiche Problem?
Howdy_McGee
1
Der shutdownHook wäre die beste Wahl, aber nur für installierten Code, und selbst dann können die Dinge bedingt verknüpft werden, so dass es möglich sein kann, einige zu verpassen.
s_ha_dum
3

Nun, es gibt eine Möglichkeit, die Priorität einer Aktion zu finden.

Wir können den folgenden Code verwenden, has_action( $tag, $function_to_check )der optional die Priorität für diesen Hook für die angegebene Funktion zurückgibt.

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

Mohammed Asif
quelle