Gibt es eine Begrenzung für die Hook-Priorität?


9

Wenn ich möchte, dass mein Filter oder Aktions-Hook alle anderen überschreibt, werde ich ihm eine Priorität von zuweisen 999. In letzter Zeit habe ich jedoch gesehen, dass einige Leute Extremwerte für die Priorität verwenden, wie z. B. 20000und sogar99999

Abgesehen von der Tatsache, dass es lächerlich ist, so hohe Prioritäten zu setzen, werden sie tatsächlich funktionieren? Gibt es eine Begrenzung für die Hook-Priorität? Was passiert, wenn das Limit überschritten wird? Gibt es einen Leistungsunterschied bei der Verwendung extremer Prioritäten?

Update: @harke schlägt bei Stack Overflow vor, dass die Anzahl durch begrenzt istPHP_INT_MAX


Haben Sie nicht auf eine Antwort von @hakre verlinkt , die darüber gesprochen hat? Es sollte Teil des Q sein und mehr, folgen Sie der Führung, die er gegeben hat, ich vermute, er weiß ernsthaft ein oder zwei Dinge ...
brasofilo

Auf welche Antwort beziehen Sie sich?
Shea

Antworten:


13

Es gibt keine Grenzen und keine Leistungseinbußen. Um zu verstehen, warum, müssen Sie verstehen, wie alle Hooks im WP-Ökosystem gespeichert sind.

Zunächst müssen Sie verstehen, wo und wie alle Hooks gespeichert sind. Alle Hooks für Filter und Aktionen werden in einer globalen Variablen namens " wp_filteryes yes" gespeichert. Aktions-Hooks werden auch in dieser Variablen gespeichert. Diese Variable ist ein zugeordnetes Array, wobei key der Name der Aktion oder des Filters ist und value ein anderes assoziatives Array ist. Schauen wir uns zum Beispiel die Aktion 'init' an. In dieser Phase sehen wir folgende Struktur:

$wp_filter = array(
    'init' => array(...),
);

Dieses Unterarray verfügt über numerische Schlüssel und Werte als Arrays. Zifferntasten sind unsere Prioritäten. Mit Zifferntasten verknüpfte Arrays enthalten eine Liste von Hooks mit derselben Priorität. Wenn wir also anrufen add_action( 'init', 'wpse8170_my_first_init', 20 ), dann anrufen add_action( 'init', 'wpse8170_my_second_init', 20 )und schließlich anrufen add_action( 'init', 'wpse8170_my_third_init', 10 ), sieht unser Beispiel folgendermaßen aus:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

Wenn nun eine initAktion ausgelöst wird, werden alle Hooks unter Verwendung der ksortFunktion sortiert und unser Array sieht jetzt so aus:

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

Und alle Hooks werden in dieser Warteschlange ausgeführt: zuerst 'wpse8170_my_third_init', dann 'wpse8170_my_first_init'und schließlich 'wpse8170_my_second_init'.

So können Sie sehen, dass es keine Grenzen und Strafen gibt, und Sie können jeden Wert verwenden, der von Ihrer PHP-Umgebung als Schlüssel für das zugehörige Array akzeptiert wird.


2
max( $priorities ) + 1schlägt fehl, wenn die letzte Zahl gleich ist PHP_INT_MAX. In diesem Fall müssen Sie den Wert in eine Zeichenfolge konvertieren und etwas hinzufügen.
Fuxia

@toscho Ja, stimme zu. Das Bonus-Snippet wurde aktualisiert.
Eugene Manuilov

2
Der "Bonus" ist eine schlechte Idee, falls sich die Definition für $wp_filterjemals ändert. Es ist nicht dazu gedacht, direkt von Plugins verwendet zu werden. Wir haben in der Vergangenheit Änderungen vorgenommen (übrigens hauptsächlich aus Leistungsgründen).
Andrew Nacin

@ AndrewNacin ok, ich habe es entfernt, da es zu viele Fragen verursacht :)
Eugene Manuilov

6

Da es sich um eine Ganzzahl handelt, ist sie auf einem 32-Bit-PHP-System auf -2147483648 bis 2147483647 und auf 64-Bit-PHP auf -9223372036854775808 bis 9223372036854775807 beschränkt.

Bearbeiten: keine Leistungseinbußen, es ist eine ganze Zahl.

Aber ernsthaft? :) :)


Ich verstehe, dass es eine ganze Zahl ist, aber ich habe über den eigentlichen Hakenmechanismus gesprochen. Ich habe Leute sagen hören, dass ein zu großer Haken dazu führt, dass der Haken vollständig ausfällt und der Rückruf nicht ausgeführt wird
shea

WHO? Wann? Es ist nur ein Index in ein Array und noch dazu ein spärliches Array, daher gibt es vernachlässigbare Auswirkungen. Aber ehrlich gesagt sind große Zahlen so ziemlich ein Indikator dafür, dass man ein Problem nicht versteht (z. B. hektisch alles zu versuchen, was funktionieren könnte!)
webaware

1

@shea - WordPress-Aktionen funktionieren genau so, wie Sie es angenommen haben. Eine Zahl mit höherer Priorität überschreibt NICHT andere, und die Verwendung von PHP_INT_MAX ist KEIN "extremer" Versuch, diese Aktion / diesen Filter vor anderen auszuführen.

Um Ihre Aktion / Ihren Filter an die Spitze der Ausführungsreihenfolge zu setzen, müssen Sie eine Priorität von 0 verwenden.

PHP_INT_MAX befindet sich einfach am anderen Ende. Es wird verwendet, wenn Ihre Aktion / Ihr Filter ausgeführt werden soll, nachdem alle anderen Hooks (mit normaler Priorität) abgeschlossen wurden.


1
Ja, das ist genau die Idee. Der letzte Filter, der an einem Hook ausgeführt wird, kann die Variable ändern, ohne sich um weitere Änderungen
kümmern zu müssen

Negative Ganzzahlwerte können ebenfalls verwendet werden $priority, sodass Rückrufe mit Priorität 0nicht unbedingt ganz oben in der Ausführungsreihenfolge stehen.
Dave Romsey

0

Kein Limit und es gibt keine Leistungseinbußen. Wenn Sie den Code überprüfen, können Sie sogar Zeichenfolgen als Prioritäten verwenden, obwohl ich dies nicht empfehlen würde;)

Wenn Ihre Aktion die letzte sein muss, können Sie die zugewiesenen Pririties überprüfen, indem Sie sich die Indizes der globalen $wp_actions[your hook]Aktion ansehen, wenn Ihre Aktion aufgerufen wird, und sie bei Bedarf erneut mit höherer Priorität hinzufügen, aber ich sehe keinen Grund, dies tatsächlich zu tun von Sachen.


0

Es gibt "praktisch" keine Begrenzung, da Hooks tatsächlich als Arrays gespeichert werden und die Priorität der numerische Index ist.

In der Realität wird die Arraygröße jedoch durch die für die Ausführung des Skripts zugewiesene Speichermenge begrenzt.

Ich denke also, das Setzen einer lächerlich großen Prioritätszahl - die sich nur in einem numerischen Index in dem Array niederschlägt, in dem die Hook-Funktionen gespeichert sind - sollte WordPress nicht zum Absturz bringen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.