plugin-development – ¿Cuántas veces se ejecutará este código? (o, ¿qué tan rica es la abuela?)

Pregunta:

Ejemplo hipotético pero aplicabilidad en el mundo real (para alguien que está aprendiendo, como yo).

Dado este código:

<?php

function send_money_to_grandma() {
     internetofThings("send grandma","$1");
}

add_action('init','send_money_to_grandma');
add_action('init','send_money_to_grandma');

ok, ahora abro mi sitio WP e inicio sesión. Recorro algunas páginas en Admin. La acción 'init' se dispara un total de 100 veces antes de que se agote la batería de mi computadora portátil.

Primeras preguntas: ¿Cuánto dinero le enviamos a la abuela? ¿Es $ 1, $ 2, $ 100 o $ 200 (o algo más?)

Si también pudiera explicar su respuesta, sería fantástico.

Segundas preguntas: si queremos asegurarnos de que solo le enviamos $ 1 a la abuela, ¿cuál es la mejor manera de hacerlo? Variable global (semáforo) que se establece como 'verdadera' la primera vez que enviamos $ 1? ¿O hay alguna otra prueba para ver si una acción ya sucedió y evitar que se dispare varias veces?

Tercera pregunta: ¿Es esto algo de lo que se preocupan los desarrolladores de complementos? Me doy cuenta de que mi ejemplo es tonto, pero estaba pensando tanto en problemas de rendimiento como en otros efectos secundarios inesperados (por ejemplo, si la función se actualiza / inserta en la base de datos).

Respuesta:

Aquí hay algunos pensamientos aleatorios sobre esto:

Pregunta 1

¿Cuánto dinero le enviamos a la abuela?

Para cargas de 100 páginas, le enviamos 100 x $ 1 = $ 100.

Aquí realmente nos referimos a 100 x do_action( 'init' ) .

No importó que lo agregamos dos veces con:

add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );

porque las devoluciones de llamada y las prioridades (por defecto 10) son idénticas .

Podemos comprobar cómo add_action es solo un contenedor para add_filter que construye la matriz $wp_filter global:

function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
        global $wp_filter, $merged_filters;

        $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
        $wp_filter[$tag][$priority][$idx] = array(
            'function'      => $function_to_add, 
            'accepted_args' => $accepted_args
        );
        unset( $merged_filters[ $tag ] );
        return true;
}

Sin embargo, si cambiamos la prioridad:

add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );

luego le enviaríamos 2 x $ 1 por carga de página o $ 200 por 100 cargas de página.

Lo mismo si las devoluciones de llamada fueron diferentes:

add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );

Pregunta 2

Si queremos asegurarnos de que solo le enviamos a la abuela $ 1

Si solo queremos enviarlo una vez por carga de página , entonces esto debería hacerlo:

add_action( 'init','send_money_to_grandma' );

porque el gancho de init solo se dispara una vez. Es posible que tengamos otros enlaces que se activen muchas veces por carga de página.

Llamemos:

add_action( 'someaction ','send_money_to_grandma' );

pero ¿qué sucede si someaction 10 veces por carga de página?

Podríamos ajustar la función send_money_to_grandma() con

function send_money_to_grandma() 
{
    if( ! did_action( 'someaction' ) )
        internetofThings("send grandma","$1");
}

o use una variable estática como contador:

function send_money_to_grandma() 
{
    static $counter = 0;
    if( 0 === $counter++ )
        internetofThings("send grandma","$1");
}

Si solo queremos ejecutarlo una vez (¡nunca!), Entonces podríamos registrar una opción en la tabla wp_options través de la API de opciones :

function send_money_to_grandma() 
{
    if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
    {
        update_option( 'sent_grandma_money', 'yes' );
        internetofThings( "send grandma","$1" );
    }
}

Si queremos enviarle dinero una vez al día, podemos usar la API transitoria.

function send_money_to_grandma() 
{
    if ( false === get_transient( 'sent_grandma_money' ) ) )
    {
        internetofThings( "send grandma","$1" );
        set_transient( 'sent_grandma_money', 'yes', DAY_IN_SECONDS );
    }
}

o incluso use el wp-cron.

Tenga en cuenta que es posible que tenga llamadas ajax. también.

Hay formas de verificarlos, por ejemplo, con DOING_AJAX

También puede haber redirecciones que podrían interrumpir el flujo.

Entonces podríamos desear restringir a sólo el back-end, is_admin() o no: ! is_admin() .

Pregunta 3

¿Es esto algo de lo que se preocupan los desarrolladores de complementos?

sí, esto es importante.

Si queremos hacer muy feliz a nuestra abuela, haríamos:

add_action( 'all','send_money_to_grandma' );

pero esto sería muy malo para el rendimiento … y nuestra billetera 😉

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım