Y a-t-il une limite pour accrocher la priorité?

9

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

karité
la source
N'avez-vous pas lié à une réponse de @hakre qui en parlait? Cela devrait faire partie du Q, et plus, suivez l'exemple qu'il a donné, je soupçonne qu'il sait sérieusement une ou deux choses ...
brasofilo
À quelle réponse faites-vous référence?
shea

Réponses:

13

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:

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

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 appelons add_action( 'init', 'wpse8170_my_second_init', 20 )et finalement appelons add_action( 'init', 'wpse8170_my_third_init', 10 ), notre exemple ressemblera à:

$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(...),
        ),
    ),
);

Maintenant, lorsque l' initaction est déclenchée, tous les crochets seront triés avec l'utilisation de la ksortfonction et notre tableau ressemble maintenant:

    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(...),
        ),
    ),

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.

Eugene Manuilov
la source
2
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.
fuxia
@toscho Oui, d'accord. Mise à jour de l'extrait de bonus.
Eugene Manuilov
2
Le "bonus" est une mauvaise idée, au cas où la définition $wp_filterchange à 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).
Andrew Nacin
@AndrewNacin ok, je l'ai supprimé, car cela pose trop de questions :)
Eugene Manuilov
6

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? :)

connaissance du Web
la source
Je comprends que c'est un entier, mais je parlais du mécanisme de crochet réel. J'ai entendu des gens dire que le fait d'avoir un crochet trop gros entraînerait une défaillance complète du crochet et le rappel ne serait pas exécuté
shea
Qui? Quand? C'est juste un index dans un tableau et un tableau clairsemé, donc l'impact est négligeable. Mais honnêtement, les gros chiffres sont à peu près un indicateur de ne pas comprendre un problème (par exemple, essayer frénétiquement tout ce qui pourrait fonctionner!)
Webaware
1

@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).

Andy Schmidt
la source
1
Oui, c'est exactement l'idée. Le filtre final qui est exécuté sur un crochet pourra modifier la variable sans se soucier de tout autre changement
karité
Les valeurs entières négatives peuvent également être utilisées pour $priority, donc les rappels accrochés avec priorité 0ne seront pas nécessairement en haut de l'ordre d'exécution.
Dave Romsey
0

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.

Mark Kaplun
la source
0

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.

Thèmes WP
la source