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. 20000
und 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
Antworten:
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_filter
yes 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: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 anrufenadd_action( 'init', 'wpse8170_my_second_init', 20 )
und schließlich anrufenadd_action( 'init', 'wpse8170_my_third_init', 10 )
, sieht unser Beispiel folgendermaßen aus:Wenn nun eine
init
Aktion ausgelöst wird, werden alle Hooks unter Verwendung derksort
Funktion sortiert und unser Array sieht jetzt so aus: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.
quelle
max( $priorities ) + 1
schlägt fehl, wenn die letzte Zahl gleich istPHP_INT_MAX
. In diesem Fall müssen Sie den Wert in eine Zeichenfolge konvertieren und etwas hinzufügen.$wp_filter
jemals ä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).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? :) :)
quelle
@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.
quelle
$priority
, sodass Rückrufe mit Priorität0
nicht unbedingt ganz oben in der Ausführungsreihenfolge stehen.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.quelle
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.
quelle