Cuando deseo que mi filtro o gancho de acción anule todos los demás, le asignaré una prioridad 999
. Sin embargo, últimamente he visto a algunas personas usar valores extremos para la prioridad, como 20000
, e incluso99999
Además del hecho de que usar prioridades tan altas es ridículo, ¿funcionarán realmente? ¿Hay un límite para enganchar la prioridad? ¿Qué pasará si se supera el límite? ¿Existe una diferencia de rendimiento al usar prioridades extremas?
Actualización: @harke sugiere en Stack Overflow que el número está limitado porPHP_INT_MAX
Respuestas:
No hay límites ni sanciones de rendimiento. Para comprender por qué, debe comprender cómo se almacenan todos los ganchos en el ecosistema de WP.
En primer lugar, debe comprender dónde se almacenan todos los ganchos y cómo lo hacen. Todos los ganchos para filtros y acciones se almacenan en una variable global llamada
wp_filter
, sí, sí, los ganchos de acción también se almacenan en esta variable. Esta variable es una matriz asociada, donde clave es el nombre de la acción o filtro y el valor es otra matriz asociativa. Por ejemplo, echemos un vistazo a la acción 'init', en esta etapa veremos la siguiente estructura:Esta submatriz tiene claves numéricas y valores como matrices. Las teclas numéricas son nuestras prioridades. Las matrices, asociadas con teclas numéricas, contienen una lista de ganchos con la misma prioridad. Entonces, si llamamos
add_action( 'init', 'wpse8170_my_first_init', 20 )
, luego llamamosadd_action( 'init', 'wpse8170_my_second_init', 20 )
y finalmente llamamosadd_action( 'init', 'wpse8170_my_third_init', 10 )
, nuestro ejemplo se verá así:Ahora, cuando
init
se activa la acción, todos los ganchos se ordenarán con el uso de laksort
función y nuestra matriz se verá ahora:Y todos los ganchos se ejecutarán en esta cola: primero
'wpse8170_my_third_init'
, luego'wpse8170_my_first_init'
y finalmente'wpse8170_my_second_init'
.Por lo tanto, puede ver que no hay límites ni penalizaciones, y puede usar cualquier valor que sea aceptable como clave para la matriz asociada de su entorno PHP.
fuente
max( $priorities ) + 1
fallará si el último número es igual aPHP_INT_MAX
. En ese caso, debe convertir el valor en una cadena y agregarle algo.$wp_filter
alguna vez cambie. No está destinado a ser utilizado directamente por complementos. Hemos realizado modificaciones en el pasado (principalmente por razones de rendimiento, por cierto).Es un número entero, por lo que en un sistema PHP de 32 bits estará limitado a -2147483648 a 2147483647, y en PHP de 64 bits estará limitado a -9223372036854775808 a 9223372036854775807.
Editar: sin penalización de rendimiento, es un número entero.
¿Pero en serio? :)
fuente
@shea: las acciones de WordPress funcionan exactamente de la manera OPUESTA que asumiste. Una cifra de mayor prioridad NO anulará otras, y el uso de PHP_INT_MAX NO es un intento "extremo" de forzar esta acción / filtro para que se ejecute antes que cualquier otra.
Para poner su acción / filtro en la parte SUPERIOR del orden de ejecución, necesitará usar una prioridad de 0.
PHP_INT_MAX está simplemente en el extremo opuesto; se usa cuando desea que su acción / filtro se ejecute DESPUÉS de que se hayan completado todos los demás ganchos (prioridad normal).
fuente
$priority
, por lo que las devoluciones de llamada enganchadas con prioridad0
no estarán necesariamente en la parte superior del orden de ejecución.No hay límite y no hay penalización de rendimiento. Al inspeccionar el código, incluso puede usar cadenas como prioridades, aunque no recomendaría hacerlo;)
Si su acción tiene que ser la última, puede inspeccionar las prioridades asignadas mirando los índices de lo global
$wp_actions[your hook]
cuando se llama a su acción, y agregarla nuevamente con mayor prioridad si es necesario, pero no veo una razón para hacerlo realmente. de cosas.fuente
"Prácticamente" no hay límite ya que los ganchos se almacenan realmente como matrices y la prioridad es el índice numérico.
Pero, en realidad, el tamaño de la matriz estará limitado por la cantidad de memoria asignada para la ejecución del script.
Entonces, supongo que establecer un número de prioridad ridículamente grande, que solo se traduce en un índice numérico en la matriz donde se almacenan las funciones enganchadas, no debería bloquear WordPress.
fuente