it-swarm.com.de

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

Wenn mein Filter oder Aktions-Hook alle anderen überschreiben soll, wird ihm die Priorität 999 zugewiesen. In letzter Zeit habe ich jedoch festgestellt, dass einige Benutzer extreme Werte für die Priorität verwenden, z. B. 20000 und sogar 99999.

Abgesehen von der Tatsache, dass es lächerlich ist, Prioritäten so hoch zu setzen, funktionieren sie dann tatsächlich? Gibt es eine Grenze 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 vor bei Stack Overflow dass die Anzahl durch PHP_INT_MAX begrenzt ist

8
shea

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

Zuallererst müssen Sie verstehen, wo alle Haken gespeichert sind und wie sie es tun. Alle Hooks für Filter und Aktionen werden in der globalen Variablen wp_filter gespeichert. Yes yes Aktions-Hooks werden auch in dieser Variablen gespeichert. Diese Variable ist ein assoziiertes 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 diesem Stadium sehen wir folgende Struktur:

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

Dieses Unterarray enthält numerische Schlüssel und Werte als Arrays. Zifferntasten sind unsere Prioritäten. Arrays, die mit Zifferntasten verknüpft sind, enthalten eine Liste von Hooks mit derselben Priorität. Wenn wir also add_action( 'init', 'wpse8170_my_first_init', 20 ) aufrufen, dann add_action( 'init', 'wpse8170_my_second_init', 20 ) aufrufen und schließlich add_action( 'init', 'wpse8170_my_third_init', 10 ) aufrufen, 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 die Aktion init ausgelöst wird, werden alle Hooks mit der Funktion ksort 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'.

Sie können also sehen, dass es keine Beschränkungen und Strafen gibt, und Sie können jeden Wert verwenden, der von Ihrer PHP -Umgebung als Schlüssel für das zugeordnete Array akzeptiert wird.

13
Eugene Manuilov

Es ist eine Ganzzahl, daher ist sie auf einem 32-Bit-System PHP auf -2147483648 bis 2147483647 und auf einem 64-Bit-System PHP auf -9223372036854775808 bis 9223372036854775807 beschränkt.

Edit: Keine Performance-Einbußen, es ist eine ganze Zahl.

Aber ernsthaft? :)

6
webaware

@shea - WordPress-Aktionen funktionieren genau so, wie Sie es angenommen haben. Eine höhere Prioritätszahl überschreibt KEINE anderen und die Verwendung von PHP_INT_MAX ist KEIN "extremer" Versuch, diese Aktion/diesen Filter dazu zu zwingen, vor anderen ausgeführt zu werden.

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

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

0
Andy Schmidt

Keine Begrenzung und es gibt keine Leistungsminderung. Von der Überprüfung des Codes können Sie sogar Zeichenfolgen als Prioritäten verwenden, obwohl ich das nicht empfehlen würde;)

Wenn Ihre Aktion zuletzt ausgeführt werden muss, können Sie die zugewiesenen Pririties überprüfen, indem Sie beim Aufrufen Ihrer Aktion die Indizes des globalen Codes $wp_actions[your hook] prüfen und ihn bei Bedarf mit höherer Priorität erneut hinzufügen. Ich kann jedoch keinen Grund dafür feststellen Art von Dingen.

0
Mark Kaplun

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

In Wirklichkeit wird die Array-Größe jedoch durch die für die Ausführung des Skripts zugewiesene Speichermenge begrenzt.

Ich denke also, dass das Setzen einer lächerlich großen Prioritätszahl - die sich nur in einen numerischen Index im Array umsetzt, in dem die verknüpften Funktionen gespeichert sind - WordPress nicht zum Absturz bringen sollte.

0
WP Themes