Добавление действия (add_action) к wp cron?
Я хочу выполнять некоторый код каждый раз, когда запускается мой WordPress cron, независимо от временного интервала. Можно ли создать для этого add_action? Я просмотрел список фильтров, но не нашел ничего подходящего.
Спасибо!

По сути, при каждой загрузке страницы проверяется, есть ли запланированные задачи для выполнения. Таким образом, cron проверяется и потенциально может запускаться при каждой загрузке страницы.
Можно предположить, что вы хотите запланировать выполнение чего-либо с определённой периодичностью. В таком случае вам следует изучить функцию wp_schedule_event().
Ниже приведён код для выполнения задачи каждый час:
add_action('my_hourly_event', 'do_this_hourly');
// Действие будет срабатывать при посещении вашего сайта на 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() {
// выполняем что-то каждый час
}
Если вы хотите запускать свой код, когда выполняется cron другого плагина, вам нужно привязаться к его действию. Допустим, приведённый выше код принадлежит чужому плагину, и вы хотите выполнять свой код каждый раз, когда срабатывает их задача.
Они создали действие следующим образом:
add_action('my_hourly_event', 'do_this_hourly');
Всё, что вам нужно сделать — это подключить свою функцию к этому действию:
add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
// Ваш код здесь
}

Спасибо за ответ, но я хочу, чтобы это конкретно перехватывало существующие события cron, срабатывая после выполнения cron. Я хочу очищать мой W3 Total Cache (flush_pgcache()) каждый раз, когда запускается cron.

А, спасибо! Чтобы было понятнее: у меня есть запланированные посты на будущее, и я хочу, чтобы кеш очищался, когда они публикуются через триггер wp-cron. Возможно, есть лучший способ?

После этого замечания от автора вопроса:
Чтобы было понятнее, у меня есть запланированные публикации на будущее, и я хочу, чтобы кэш очищался, когда они публикуются через триггер wp-cron. Возможно, есть лучший способ?
Я не знаю, очищает ли плагин W3 Total Cache кэш автоматически при публикации записей. Я думал, что да. Если нет — в этом случае я бы использовал хук перехода статуса записи (см. связанный вопрос) и очищал кэш тогда. Таким образом, всякий раз, когда статус записи меняется (через wp-cron или иначе) — кэш обновляется, чтобы отразить это.
//Запускается при изменении статуса записи
add_action('transition_post_status','wpse49927_transition_post_status',10,3);
function wpse49927_transition_post_status($new_status,$old_status,$post){
//Очистка кэша
flush_pgcache();
}
Исходная проблема
Отвечая на исходный вопрос: вызов функции при каждом запуске wp-cron — я не думаю, что это возможно программно, и решение, предложенное @Brady, вероятно, ближе всего к тому, чего можно добиться в этом случае.

Недавно мне пришлось делать то же самое с w3 total cache, вот как я реализовал это (упрощено для ответа на вопрос автора)
<?php
/**
* fac_all_crons позволяет прикрепить функцию ко всем wp-cron, зарегистрированным на сайте WordPress
* @author Russell Fair
* @uses wp_get_schedules для получения списка зарегистрированных крон-заданий
*/
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 выполняет фактическую очистку кеша
* @author Russell Fair
*/
function fac_cache_clear(){
//здесь выполняйте очистку кеша
}

Для очистки кеша страницы только в момент, когда запланированная запись фактически меняет свой статус на "опубликовано", рекомендуется использовать хук 'publish_future_post'. Добавьте этот фрагмент кода в ваш файл functions.php.
Не используйте хук 'transition_post_status', который также срабатывает. В ходе отладки я обнаружил, что иногда необходимый класс 'W3_PgCacheFlush' из плагина W3TC не может быть создан при использовании этого хука.
/**
* Эта функция очищает весь кеш W3TC при публикации запланированной записи.
* 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();
}
}
}

Для тех, кто попал на эту страницу, существует способ выполнять некоторый код каждый раз при вызове URL крона, и это можно легко сделать с помощью следующего кода:
add_action( 'init', 'my_function_on_each_cron_call' );
function my_function_on_each_cron_call() {
if ( isset( $_GET[ 'doing_wp_cron' ] ) && $_SERVER['REQUEST_URI'] == '/wp-cron.php?doing_wp_cron' ) {
// ВСТАВЬТЕ СВОЙ КОД ЗДЕСЬ
}
}
Где $_SERVER['REQUEST_URI'] возможно можно опустить, но это не критично.
