добавить действие в wp cron?


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

Спасибо!

 5
Author: FLX, 2012-04-23

5 answers

В основном каждая загрузка страницы проверяет, есть ли что-то запланированное для запуска, поэтому по этой логике cron проверяется и, возможно, может запускаться при каждой загрузке страницы.

Я могу только предположить, что вы хотите запланировать что-то для запуска так часто. Если это так, вам нужно посмотреть на wp_schedule_event()

Ниже приведен код, чтобы заставить некоторый код работать каждый час:

add_action('my_hourly_event', 'do_this_hourly');

// The action will trigger when someone visits your WordPress site
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() {
    // do something every hour
}

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

Ну, они создали действие, подобное этому:

add_action('my_hourly_event', 'do_this_hourly');

Итак, все, что вам нужно сделать, это перенести свою функцию на это:

add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
    // Do your code here
}
 8
Author: Scott, 2012-04-23 09:41:49

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

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

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

 //Runs whenever a post changes status
 add_action('transition_post_status','wpse49927_transition_post_status',10,3);
 function wpse49927_transition_post_status($new_status,$old_status,$post){
     //Flush cache
     flush_pgcache();
 }

Исходная проблема

В ответ на первоначальный вопрос: запуск функции всякий раз, когда запускается wp-cron - я не думаю, что это возможно программно - и решение, данное @Brady, вероятно, ближе всего к этому вы подойдете.

 4
Author: Stephen Harris, 2017-04-13 12:37:54

Недавно мне пришлось сделать то же самое с общим кэшем w3, вот как я это реализовал (упрощено для ответа на вопрос OP)

<?php
/**
* fac_all_crons allows you to attach a function to all wp-cron's registered in a WordPress site
* @author Russell Fair
* @uses wp_get_schedules to get a list of registered crons
*/
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 does the actual cache clearing
* @author Russell Fair
*/
function fac_cache_clear(){

    //do your cache clearing here


}
 1
Author: rfair404, 2012-08-22 16:02:51

Чтобы очистить кэш страницы только тогда, когда будущая запланированная публикация действительно изменит свой статус на публикацию, рекомендуется использовать хук "publish_future_post". Добавьте фрагмент кода в свой functions.php .

Не используйте хук "transition_post_status", который тоже выполняется. Моя отладка показала, что иногда необходимый класс "W3_PGCACHEFLUSH" из плагина W3TC не может быть создан с помощью этого крючка.

/**
 * This function clears the complete W3TC cache when a future post is published.
 * 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();
    }
  }
}
 1
Author: jot, 2012-09-14 16:58:40

Для тех, кто прибывает сюда, есть способ выполнять некоторый код при каждом вызове URL-адреса cron, и это можно просто сделать с помощью следующего кода:

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' ) {
        // YOUR CODE GOES HERE
    }
}

Где $_SERVER['REQUEST_URI'], вероятно, можно опустить, но это не опасно.

 1
Author: Mauro Mascia, 2017-09-28 10:45:07