Crochet, ligne e contre – coulée: La nuova class wp \ \ u Hook di WordPress
NDI appelle le WP _ Hook:: Add filter () correspondant. Cette comparaison avec la version précédente: fonction add _ filter ($$tag, $$function to add, $$Priority = 10, $$accepted args = 1) {global $WP filter, $$Merged filter; $$idx = WP Filter Build Unique ID ($$tag, $$function to Add, $$Priority = 10, $$accepted args = 1) {global $WP filter, $$Merged filter; $$idx = WP filter; $$idx = WP Filter Build Unique ID ($$tag, $$function to add, $$pririty = 10, $$accepted args = 1) {global $WP filter, $$merpriorité); $WP _ Filter [$tag] [$Priority] [$idx] = array (‘FUNCTION’ = > $function to add, $accepted args;); unset ($Merged filters [$tag]); return true;} La partie clé ici est que les versions précédentes de la fonction 4.7 ont créé un tableau multidimensionnel ($WP _ filter) pour contenir tous les filtres en file d’attente. Dans la nouvelle version, une partie de cette logique a été déplacée vers la classe WP _ Hook, mais comme nous l’avons vu, le filtre global $WP n’est plus un tableau profondément imbriqué, mais un tableau d’objets.
Afin de maintenir la compatibilité avec les versions précédentes et d’éviter d’interrompre le Code des gens, la classe WP _ Hook implémente les interfaces arrayaccess et Itérateur. En termes simples, ces deux interfaces permettent à la classe WP _ Hook d’accéder et de fonctionner comme un tableau tout en maintenant toutes les fonctionnalités de l’objet. La performance est la principale préoccupation de la nouvelle fonctionnalité du filtre. L’ancien système de crochet est extrêmement rapide et la plupart des sites y ont accès des milliers de fois par demande. Il est important de maintenir la performance, alors pourquoi les systèmes de crochet mis à jour devraient – ils utiliser des implémentations basées sur des objets plus abstraites et peut – être plus lentes? La réponse est comment un pointeur de tableau fonctionne avec une boucle do – while.
Jonathan brinly a résolu les principaux problèmes du système Hooks (et a donc conçu la plupart des solutions). En fin de compte, l’ancienne implémentation add _ action () utilise la boucle foreach dans la boucle do – While et appelle ensuite ($WP Filter [$tag]) dans la clause while: do {BEFORE)
ACH ((Array) Current ($WP _ Filter [$tag]) as $the) if (! Is null ($Function]) {$args [1] = $Value; $value = call user func array ($Function]), Array slice ($args, 1, (int) $the accepted args]); While (Next ($WP _ Filter [$tag]) = Faux); La première phrase de la Feuille de route trac décrit les principaux problèmes de cette logique:
Lorsque vous appelez un crochet spécifique à partir d’une fonction appelée par le même crochet, les autres fonctions de crochet de la première itération sont supprimées. Ce problème est causé par la récursion, en particulier lorsque le rappel est lié à la même opération. Jonathan a un bon exemple dans son post: la fonction my _ First Callback ($$post ID, $$post) {if ($$post – > post type = = ‘post’) {WP insert Post ($post type = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = utype ‘,);}} Fonction my _ second Callback ($post ID, $post) {\/ \/ perform Other actions} add action (‘Save post’, ‘My First Callback’, 10, 2) \/ Ajouter _ action (‘Save post’, ‘My Second Callback’, 15, 2) n’a jamais été appelé; Notez l’emplacement de la fonction WP _ insert Post ()? Cet appel de fonction déclenche une autre opération Save _ post pour créer une boucle de rappel récursive imbriquée.
Cet appel imbriqué WP _ insert Post () active Do Action (‘Save post’) et génère la fonction Do Action via le filtre $WP Filter [‘Save post’). Cela se produit avant qu’un appel à la fonction PHP next () ne soit déclenché dans une clause while. En raison d’un appel d’action do _ imbriqué, le pointeur de tableau se déplace maintenant vers la fin du filtre $WP Filter [‘Save post’, boucle terminée. Dans ce scénario, n’appelez jamais add _ action (‘Save post’, ‘My Second Callback’, 15, 2). Si vous vous rappelez comment $WP _ Filter a été construit, vous verrez pourquoi cela s’est produit:
$WP _ Filter [$tag] [$Priority] [$idx] = array (‘FUNCTION’ = > $function to add, ‘accepted args’ = > $accepted args); Dans ce cas,
$WP _ Filter $WP Filter [‘Save post’] Internal until next () est appelé en déplaçant le pointeur du tableau à la fin du tableau interne. À la fin de la boucle, toutes les opérations futures amarrées au niveau supérieur du tableau de filtres $WP _ avec une priorité plus élevée ne sont pas effectuées. C’est parce que WordPress pense que le tableau $WP _ Filter est entièrement circulaire. Utilisez {foreach ((Array) Current ($$WP _ Filter [$$tag]) comme $the {if (! Is null ($$the [‘FUNCTION’)) {$$args [1] = $Value; $$value = call user func array ($$the \ [‘FUNCTION’, Array file ($$WP Filter [$$tag]) comme $the {if (! Is null ($$the Function ‘) {$args [1] = $Value; $$value = call \ \ user func array ($$the Function’, Array slice ($$args, 1, (1, (int) $$the \\’)}}} While (Next ($WP _ Filter [$tag]) = Faux \/ \/ Ce problème est peut – être un peu marginal, mais il met en évidence la vulnérabilité des systèmes de base liés à la dépendance à des tableaux multidimensionnels. La solution principale est de suivre l’itération actuelle lorsque la méthode hook est activée. La partie centrale de la nouvelle classe WP _ hook est de suivre l’itération actuelle pour contourner ce problème récursif. De plus, en changeant la variable globale $WP _ Filter en un tableau d’objets, add filter () et ses fonctions stockent maintenant la fonction Hook dans l’attribut $callbacks class.
La nouvelle version de l’add _ filter () est disponible en format PDF existing = isset ($this – > callbacks [$Priority]); $this – > callbacks [$Priority] [$idx] = array (‘FUNCTION’ = > $Function _ to add, ‘accepted args’ = > $ \/ \/ Si vous voulez ajouter une nouvelle priorité à la liste, allez à (! $Priority _ existed & & count ($this – > callbacks) > 1) {ksort ($this – > callbacks, sort Numeric);} Si ($this – > nesting _ level > 0) {$this – > rest active it ($Priority, $priority existing);}} Ancienne fonction add _ filter ():
Rupiah, $WP _ Current Filter… Si (! Is _ null (\