Lorsque je souhaite que mon filtre ou crochet d'action remplace tous les autres, je lui attribue une priorité de 999
. Cependant, récemment, j'ai vu certaines personnes utiliser des valeurs extrêmes pour la priorité, telles que 20000
, et même99999
Outre le fait que l'utilisation de priorités aussi élevées est ridicule, fonctionnera-t-elle réellement? Y a-t-il une limite pour accrocher la priorité? Que se passera-t-il si la limite est dépassée? Existe-t-il une différence de performances lors de l'utilisation de priorités extrêmes?
Mise à jour: @harke suggère sur Stack Overflow que le nombre est limité parPHP_INT_MAX
Réponses:
Il n'y a aucune limite et aucune pénalité de performance. Pour comprendre pourquoi, vous devez comprendre comment tous les crochets sont stockés dans l'écosystème WP.
Tout d'abord, vous devez comprendre où sont stockés tous les crochets et comment ils le font. Tous les hooks pour les filtres et les actions sont stockés dans une variable globale appelée
wp_filter
, oui oui les hooks d'action sont également stockés dans cette variable. Cette variable est un tableau associé, où clé est le nom de l'action ou du filtre et la valeur est un autre tableau associatif. Par exemple, regardons l'action 'init', à ce stade, nous verrons la structure suivante:Ce sous-tableau a des clés numériques et des valeurs sous forme de tableaux. Les touches numériques sont nos priorités. Les tableaux, associés à des touches numériques, contiennent une liste de crochets avec la même priorité. Donc, si nous appelons
add_action( 'init', 'wpse8170_my_first_init', 20 )
, puis appelonsadd_action( 'init', 'wpse8170_my_second_init', 20 )
et finalement appelonsadd_action( 'init', 'wpse8170_my_third_init', 10 )
, notre exemple ressemblera à:Maintenant, lorsque l'
init
action est déclenchée, tous les crochets seront triés avec l'utilisation de laksort
fonction et notre tableau ressemble maintenant:Et tous les hooks seront exécutés dans cette file d'attente: d'abord
'wpse8170_my_third_init'
, puis'wpse8170_my_first_init'
et enfin'wpse8170_my_second_init'
.Ainsi, vous pouvez voir qu'il n'y a pas de limites et de pénalités et vous pouvez utiliser n'importe quelle valeur acceptable comme clé pour le tableau associé par votre environnement PHP.
la source
max( $priorities ) + 1
échouera si le dernier nombre est égal àPHP_INT_MAX
. Dans ce cas, vous devez convertir la valeur en chaîne et y ajouter quelque chose.$wp_filter
change à jamais. Il n'est pas destiné à être utilisé directement par les plugins. Nous avons apporté des modifications dans le passé (principalement pour des raisons de performances, soit dit en passant).C'est un entier, donc sur un système PHP 32 bits, il sera limité à -2147483648 à 2147483647, et sur PHP 64 bits, il sera limité à -9223372036854775808 à 9223372036854775807.
Edit: pas de pénalité de performance, c'est un entier.
Mais sérieusement? :)
la source
@shea - Les actions WordPress fonctionnent exactement de la manière opposée que vous supposiez. Un chiffre de priorité plus élevée ne remplacera PAS les autres, et l'utilisation de PHP_INT_MAX n'est PAS une tentative "extrême" de forcer cette action / ce filtre à s'exécuter avant les autres.
Pour placer votre action / filtre en haut de l'ordre d'exécution, vous devez utiliser une priorité de 0.
PHP_INT_MAX est simplement à l'extrémité opposée; il est utilisé lorsque vous souhaitez que votre action / filtre s'exécute APRÈS la fin de tous les autres hooks (de priorité normale).
la source
$priority
, donc les rappels accrochés avec priorité0
ne seront pas nécessairement en haut de l'ordre d'exécution.Aucune limite et aucune pénalité de performance. En inspectant le code, vous pouvez même utiliser des chaînes comme priorités, bien que je ne recommanderais pas de le faire;)
Si votre action doit être la dernière, vous pouvez inspecter les priorités attribuées en regardant les index du global
$wp_actions[your hook]
lorsque votre action est appelée, et l'ajouter à nouveau avec une priorité plus élevée si nécessaire, mais je ne vois pas de raison de faire réellement ce genre de choses.la source
Il n'y a "pratiquement" aucune limite car les crochets sont en fait stockés sous forme de tableaux et la priorité est l'index numérique.
Mais, en réalité, la taille du tableau sera limitée par la quantité de mémoire allouée pour l'exécution du script.
Donc, je suppose que définir un numéro de priorité ridiculement élevé - qui se traduit simplement par un index numérique dans le tableau où les fonctions accrochées sont stockées - ne devrait pas planter wordpress.
la source