Добавление действия (add_action) к wp cron?

23 апр. 2012 г., 12:09:27
Просмотры: 16.3K
Голосов: 7

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

Спасибо!

3
Комментарии

Что именно вы пытаетесь сделать? Я не думаю, что то, о чем вы спрашиваете, возможно — но если мы поймем, что вы пытаетесь достичь, возможно, найдется альтернативное решение...

Stephen Harris Stephen Harris
23 апр. 2012 г. 12:19:44

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

FLX FLX
23 апр. 2012 г. 12:32:18

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

FLX FLX
23 апр. 2012 г. 13:02:42
Все ответы на вопрос 5
5

По сути, при каждой загрузке страницы проверяется, есть ли запланированные задачи для выполнения. Таким образом, 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() {
    // Ваш код здесь
}
23 апр. 2012 г. 12:16:13
Комментарии

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

FLX FLX
23 апр. 2012 г. 12:32:57

Хорошо, я обновлю свой вопрос с ответом. Дайте мне минуту.

Scott Scott
23 апр. 2012 г. 12:38:02

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

FLX FLX
23 апр. 2012 г. 13:02:35

ПЛОХО: current_time( 'timestamp' ) / ХОРОШО: time()

Falselight Falselight
28 июн. 2022 г. 23:52:04

Обратите внимание, что если вы используете хук wp для запуска функций по расписанию, это может быть слишком поздно для плагина WP Crontrol. Этот плагин не сможет отобразить ваш хук в управлении расписанием. Рекомендую использовать хук wp_loaded вместо этого.

vee vee
25 янв. 2023 г. 11:17:17
0

После этого замечания от автора вопроса:

Чтобы было понятнее, у меня есть запланированные публикации на будущее, и я хочу, чтобы кэш очищался, когда они публикуются через триггер 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, вероятно, ближе всего к тому, чего можно добиться в этом случае.

23 апр. 2012 г. 13:23:04
1

Недавно мне пришлось делать то же самое с 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(){

    //здесь выполняйте очистку кеша


}
22 авг. 2012 г. 19:02:51
Комментарии

для ясности, я не уверен, будет ли это выполняться при КАЖДОМ событии, так как !wp_next_scheduled() может быть истинным в некоторых случаях. Возможно, стоит попробовать без условной проверки вокруг функции wp_schedule_event().

rfair404 rfair404
22 авг. 2012 г. 19:05:13
0

Для очистки кеша страницы только в момент, когда запланированная запись фактически меняет свой статус на "опубликовано", рекомендуется использовать хук '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();
    }
  }
}
14 сент. 2012 г. 19:58:40
0

Для тех, кто попал на эту страницу, существует способ выполнять некоторый код каждый раз при вызове 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'] возможно можно опустить, но это не критично.

28 сент. 2017 г. 13:45:07