¿Hay un límite para la prioridad de enlace?

8

Cuando deseo que mi filtro o gancho de acción anule todos los demás, le asignaré una prioridad de 999 . Sin embargo, últimamente he visto que algunas personas utilizan valores extremos para la prioridad, como 20000 e incluso 99999

Además del hecho de que usar prioridades tan altas es ridículo, ¿realmente funcionarán? ¿Hay un límite para enganchar la prioridad? ¿Qué pasará si se supera el límite? ¿Hay una diferencia de rendimiento cuando se utilizan prioridades extremas?

Actualización: @harke sugiere en Stack Overflow que el número está limitado por PHP_MAX_INT

    
pregunta shea 09.01.2013 - 10:41

5 respuestas

12

No hay límites ni penalizaciones de rendimiento. Para comprender por qué, debe comprender cómo se almacenan todos los enganches en el ecosistema WP.

En primer lugar, debe comprender dónde están almacenados todos los enganches 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 matriz secundaria tiene claves numéricas y valores como matrices. Las claves numéricas son nuestras prioridades. Las matrices, asociadas con las teclas numéricas, contienen una lista de enlaces con la misma prioridad. Entonces, si llamamos a add_action( 'init', 'wpse8170_my_first_init', 20 ) , llamamos a add_action( 'init', 'wpse8170_my_second_init', 20 ) y finalmente llamamos a 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 se activa la acción init , todos los ganchos se ordenarán con el uso de ksort y nuestra matriz se ve 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' .

Para que pueda ver que no hay límites y penalizaciones, y puede usar cualquier valor que sea aceptable como clave para la matriz asociada en su entorno PHP.

    
respondido por el Eugene Manuilov 09.01.2013 - 11:34
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? :)

    
respondido por el webaware 09.01.2013 - 10:50
0

Sin límite y no hay penalización de rendimiento. Desde la inspección del código, incluso puede utilizar 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 del $wp_actions[your hook] global cuando se llama a su acción, y agregarla de nuevo con mayor prioridad si es necesario, pero no veo una razón para hacer este tipo de cosas.

    
respondido por el Mark Kaplun 09.01.2013 - 11:04
0

"Prácticamente" no hay límite, ya que los enganches se almacenan como matrices y la prioridad es el índice numérico.

Pero, en realidad, el tamaño del arreglo estará limitado por la cantidad de memoria asignada para la ejecución del script.

Por lo tanto, supongo que establecer un número de prioridad ridículamente grande, que simplemente se traduce en un índice numérico en la matriz donde se almacenan las funciones enganchadas, no debería bloquear Wordpress.

    
respondido por el WP Themes 09.01.2013 - 12:00
0

@shea - Las acciones de WordPress funcionan exactamente de la manera OPUESTA que asumiste. Una cifra de prioridad más alta NO anulará a 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 tu acción / filtro en el TOP de la orden de ejecución, deberías usar una prioridad de 0.

PHP_INT_MAX está simplemente en el extremo opuesto; se utiliza cuando desea que su acción / filtro se ejecute DESPUÉS de que se hayan completado todos los demás enlaces (prioridad normal).

    
respondido por el Andy Schmidt 12.03.2018 - 23:44

Lea otras preguntas en las etiquetas