¿Hay un límite para enganchar la prioridad?


9

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


¿No vinculó a una Respuesta de @hakre que habló sobre esto? Debería ser parte de la Q, y más, seguir el ejemplo que dio, sospecho que él sabe en serio una o dos cosas ...
brasofilo

¿A qué respuesta te refieres?
shea

Respuestas:


13

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:

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

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 llamamos add_action( 'init', 'wpse8170_my_second_init', 20 )y finalmente llamamos add_action( 'init', 'wpse8170_my_third_init', 10 ), nuestro ejemplo se verá así:

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

Ahora, cuando initse activa la acción, todos los ganchos se ordenarán con el uso de la ksortfunción y nuestra matriz se verá ahora:

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

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.


2
max( $priorities ) + 1fallará si el último número es igual a PHP_INT_MAX. En ese caso, debe convertir el valor en una cadena y agregarle algo.
fuxia

@toscho Sí, de acuerdo. Se actualizó el fragmento de bonificación.
Eugene Manuilov el

2
El "bono" es una mala idea, en caso de que la definición de $wp_filteralguna vez cambie. No está destinado a ser utilizado directamente por complementos. Hemos realizado modificaciones en el pasado (principalmente por razones de rendimiento, por cierto).
Andrew Nacin

@AndrewNacin ok, lo he eliminado, ya que causa demasiadas preguntas :)
Eugene Manuilov

6

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


Entiendo que es un número entero, pero estaba hablando sobre el mecanismo de gancho real. He escuchado a personas decir que tener un gancho que es demasiado grande hará que el gancho falle por completo, y la devolución de llamada no se ejecutará
shea

¿OMS? ¿Cuando? Es solo un índice en una matriz, y una matriz dispersa en eso, por lo que hay un impacto insignificante. Pero honestamente, los números grandes son más o menos un indicador de no entender un problema (por ejemplo, ¡intentar frenéticamente cualquier cosa que funcione!)
webaware

1

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


1
Sí, esa es exactamente la idea. El filtro final que se ejecuta en un gancho podrá modificar la variable sin preocuparse por ningún cambio adicional
Shea

Los valores enteros negativos también se pueden usar para $priority, por lo que las devoluciones de llamada enganchadas con prioridad 0no estarán necesariamente en la parte superior del orden de ejecución.
Dave Romsey

0

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.


0

"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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.