Как я могу изменить частоту запланированного события?


Я объявил запланированное событие в плагине, подобном этому:

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'hourly', 'send_email_alerts_hook');
    }
}

Затем я хотел изменить частоту на "ежедневно", сделав это, заменив исходную функцию на:

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'daily', 'send_email_alerts_hook');
    }
}

Но, похоже, мое событие все еще запускается каждый час. Я использую плагин Core control для мониторинга задач CRON, и он по-прежнему отображается как "один раз в час"

Author: kaiser, 2011-05-23

3 answers

Мне кажется, что вы добавляете это событие только тогда, когда еще не запланировано такое событие "send_email_alerts_hook". Попробуйте что-нибудь подобное и дайте мне знать, сработает ли это.

function shedule_email_alerts() {
    if ( !wp_next_scheduled( 'send_email_alerts_hook' ) ) {
        wp_schedule_event(time(), 'daily', 'send_email_alerts_hook');
    } else {
        wp_reschedule_event(time(), 'daily', 'send_email_alerts_hook');
    } 
}

Дело в том, что вы будете "переписывать" это событие все время, поэтому было бы неплохо отключить эту функцию при ее первом запуске.

Лучшим решением было бы проверить, как собираются эти задания, и проверить, добавлено ли уже это событие. Если да, то проверьте, является ли повторение другой - если так, перенесите. Вы можете найти эту функцию в wp-includes/cron.php строка ~63

function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {
    $crons = _get_cron_array();
    $schedules = wp_get_schedules();

    if ( !isset( $schedules[$recurrence] ) )
        return false;

    $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
    $event = apply_filters('schedule_event', $event);

    // A plugin disallowed this event
    if ( ! $event )
        return false;

    $key = md5(serialize($event->args));

    $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval );
    uksort( $crons, "strnatcasecmp" );
    _set_cron_array( $crons );
}

Удачи!

 5
Author: Marek Tuchalski, 2011-05-23 17:24:42

Хорошо, я мог бы решить проблему с помощью wp_clear_scheduled_hook()

Я прокомментировал свое объявление расписания и добавил wp_clear_scheduled_hook('send_email_alerts_hook') в конце. Затем деактивируйте - повторно активируйте мой плагин, который удалил мой запланированный крюк. Затем удалил wp_clear_scheduled_hook() и раскомментировал мой код, теперь расписание было настроено правильно.

Нашел подсказку здесь.

 1
Author: mike23, 2011-05-23 19:51:18

Попробуйте выполнить отладку с помощью этого плагина, который я написал: Ссылка на Github/Gist. Это немного халтурно, но это служит своей цели.

Обратите внимание, что крючок wp_footer() должен присутствовать в вашей теме. Иначе вам придется зацепить его где-нибудь в другом месте.

 0
Author: kaiser, 2011-05-23 17:41:56