¿Cómo usar add_action con wp cron?
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!

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í
}

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.

¡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?

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.

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í
}

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();
}
}
}

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.
