¿Cómo usar add_action con wp cron?

23 abr 2012, 12:09:27
Vistas: 16.3K
Votos: 7

Me gustaría ejecutar algún código cada vez que se ejecute mi cron de WordPress, sin importar el intervalo de tiempo. ¿Es posible crear un add_action para esto? Busqué en la lista de filtros pero no encontré nada relevante.

¡Gracias!

3
Comentarios

¿Qué es exactamente lo que intentas lograr? No creo que lo que estás pidiendo sea posible, pero si sabemos lo que intentas hacer, podría haber una alternativa...

Stephen Harris Stephen Harris
23 abr 2012 12:19:44

Lo que quiero hacer es limpiar mi W3 Total Cache (flush_pgcache()) cada vez que se ejecuta un cron.

FLX FLX
23 abr 2012 12:32:18

Para ser más claro, tengo publicaciones programadas en el futuro y quiero que la caché se limpie cuando se publiquen a través del trigger de wp-cron. ¿Podría haber una mejor manera?

FLX FLX
23 abr 2012 13:02:42
Todas las respuestas a la pregunta 5
5

Básicamente, cada carga de página verifica si hay algo programado para ejecutarse, por lo que, según esa lógica, el cron se verifica y puede ejecutarse potencialmente en cada carga de página.

Solo puedo suponer que deseas programar algo para que se ejecute periódicamente. Si ese es el caso, necesitas mirar wp_schedule_event().

A continuación, se muestra el código para ejecutar algo cada hora:

add_action('my_hourly_event', 'do_this_hourly');

// La acción se activará cuando alguien visite tu sitio WordPress
function my_activation() {
    if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'my_hourly_event');
    }
}
add_action('wp', 'my_activation');

function do_this_hourly() {
    // hacer algo cada hora
}

Si deseas ejecutar tu propio código cuando el cron de otra persona se haya ejecutado, entonces necesitas vincularlo a su acción que se dispara. Así que tomemos el código anterior como si fuera de un plugin de otra persona y quieres ejecutar tu código cada vez que el de ellos se ejecute.

Ellos han creado una acción como esta:

add_action('my_hourly_event', 'do_this_hourly');

así que todo lo que necesitas hacer es enganchar tu función a esto:

add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
    // Coloca tu código aquí
}
23 abr 2012 12:16:13
Comentarios

Gracias por la respuesta, pero quiero que se enganche específicamente a los eventos cron existentes, activándose una vez que el cron se ha ejecutado. Lo que quiero hacer es limpiar mi W3 Total Cache (flush_pgcache()) cada vez que se ejecuta un cron.

FLX FLX
23 abr 2012 12:32:57

Vale, voy a actualizar mi pregunta para responder. Dame un minuto.

Scott Scott
23 abr 2012 12:38:02

¡Ah, gracias! Para ser más claro, tengo posts programados en el futuro, y quiero que la caché se limpie cuando se publiquen a través del trigger wp-cron. ¿Quizás haya una mejor forma?

FLX FLX
23 abr 2012 13:02:35

MAL: current_time( 'timestamp' ) / BIEN: time()

Falselight Falselight
28 jun 2022 23:52:04

Ten en cuenta que si enganchas funciones programadas al hook wp, puede ser demasiado tarde para el plugin WP Crontrol. Ese plugin no podrá listar tu hook para la gestión de programaciones. Recomiendo usar el hook wp_loaded en su lugar.

vee vee
25 ene 2023 11:17:17
0

Después de este comentario del OP:

Para ser más claro, tengo publicaciones programadas en el futuro, y quiero que la caché se borre cuando se publiquen mediante el disparador de wp-cron. ¿Podría haber una mejor manera?

No sé si el plugin W3 Total Cache no vacía automáticamente la caché cuando se publican las entradas. Creía que sí lo hacía. Si no lo hace, en este caso engancharía el hook de transición de publicación (ver pregunta relacionada), y vaciaría la caché en ese momento. De esta forma, cada vez que una publicación cambie de estado (ya sea mediante wp-cron o de otra manera), la caché se actualizará para reflejarlo.

 //Se ejecuta cada vez que una publicación cambia de estado
 add_action('transition_post_status','wpse49927_transition_post_status',10,3);
 function wpse49927_transition_post_status($new_status,$old_status,$post){
     //Vaciar caché
     flush_pgcache();
 }

Problema original

En respuesta a la pregunta original: disparar una función cada vez que se lance wp-cron - no creo que esto sea posible programáticamente - y la solución dada por @Brady es probablemente lo más cercano que podrás conseguir para hacer eso.

23 abr 2012 13:23:04
1

Recientemente tuve que hacer lo mismo con W3 Total Cache, aquí está cómo lo implementé (simplificado para responder a la pregunta del OP)

<?php
/**
* fac_all_crons permite adjuntar una función a todos los wp-cron registrados en un sitio WordPress
* @author Russell Fair
* @uses wp_get_schedules para obtener una lista de crons registrados
*/
function fac_all_crons(){

    $schedules = wp_get_schedules();

    if ( !$schedules )
        return;

    foreach ( $schedules as $key ){

        if ( ! wp_next_scheduled( 'fac_cache_clear' ) ) {
            wp_schedule_event( time(), $key, 'fac_cache_clear' );
        }

    }

}
add_filter('init', 'fac_all_crons');

/**
* fac_cache_clear realiza el borrado real de la caché
* @author Russell Fair
*/
function fac_cache_clear(){

    //haz tu borrado de caché aquí


}
22 ago 2012 19:02:51
Comentarios

para mayor claridad, no estoy seguro de si esto realmente se ejecutaría en CADA evento, ya que el !wp_next_scheduled() podría ser verdadero en algunos casos, podrías intentarlo sin la verificación condicional alrededor de la función wp_schedule_event().

rfair404 rfair404
22 ago 2012 19:05:13
0

Para limpiar la caché de la página solo cuando una publicación programada cambia su estado a publicado, se recomienda el hook 'publish_future_post'. Añade el siguiente fragmento de código a tu archivo functions.php.

No uses el hook 'transition_post_status' que también se ejecuta. Mis pruebas de depuración mostraron que a veces la clase necesaria 'W3_PgCacheFlush' del plugin W3TC no puede ser instanciada usando este hook.

/**
 * Esta función limpia toda la caché de W3TC cuando una publicación programada es publicada.
 * jot 11.09.12
 */
add_action('publish_future_post', 'wpse_49927_clear_w3tc_cache_on_future_to_publish');

function wpse_49927_clear_w3tc_cache_on_future_to_publish( $post_id) {
  if (function_exists('w3_instance') && class_exists('W3_PgCacheFlush')) {
    $w3_pgcache = & w3_instance('W3_PgCacheFlush');
    if (is_object($w3_pgcache) && method_exists($w3_pgcache, 'flush')) {
      $w3_pgcache->flush();
    }
  }
}
14 sept 2012 19:58:40
0

Para alguien que llegue aquí, existe una forma de ejecutar algún código cada vez que se llama a la URL del cron y se puede hacer simplemente con el siguiente código:

add_action( 'init', 'mi_funcion_en_cada_llamada_cron' );
function mi_funcion_en_cada_llamada_cron() {
    if ( isset( $_GET[ 'doing_wp_cron' ] ) && $_SERVER['REQUEST_URI'] == '/wp-cron.php?doing_wp_cron' ) {
        // TU CÓDIGO VA AQUÍ
    }
}

Donde $_SERVER['REQUEST_URI'] probablemente se puede omitir pero no es peligroso.

28 sept 2017 13:45:07