WP CRON запускается только в первый раз


Вот мой код

function cron_add_weekly( $schedules ) {

   $schedules['seconds'] = array(
       'interval' => 5,
       'display' => __( '5 Seconds' )
   );
   return $schedules;
 }

add_filter( 'cron_schedules', 'cron_add_weekly' );

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
    if ( ! wp_next_scheduled( 'my_hook' ) ) {
    wp_schedule_event( time(), 'seconds', 'my_hook' );
    }

}
add_action( 'my_hook', 'my_exec' );

register_deactivation_hook(__FILE__, 'my_deactivation');
    function my_deactivation() {
        wp_clear_scheduled_hook('my_hook');
    }

function my_exec() {
    $value = 91;
    update_user_meta($value + 1, 'from_cron', 'updated');
}

Мета пользователя должна обновляться каждые 5 секунд после обновления страницы. Но cron запускается только в первый раз

Author: fuxia, 2018-12-19

2 answers

Хорошо, итак, я протестировал ваш код и почти уверен, что он не сможет запуститься ни разу... И вот почему...

Если вы взглянете на wp_schedule_event вы увидите эту проверку в верхней части функции:

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

Это означает, что вы не можете запланировать событие с неизвестным повторением.

Итак, давайте вернемся к вашему коду... Что он делает, так это:

  • добавляет ваше пользовательское повторение (с помощью крючка cron_schedules),
  • планирует событие с таким повторением во время плагина активация.

Все выглядит хорошо, верно? Ну, нет - это не так.

Активационный крючок срабатывает во время активации плагина. Таким образом, этот плагин не работает до запуска активации. Таким образом, ваше пользовательское повторение не зарегистрировано. Так что... твой крюк не запланирован. Я проверил это, и результат wp_schedule_event в вашем крючке активации является ложным, поэтому событие не запланировано.

Так что же делать?

Просто - не планируйте свое мероприятие на крючке активации, если вы хотите используйте пользовательское повторение.

Итак, вот ваш безопасный код:

register_deactivation_hook(__FILE__, 'my_deactivation');
function my_deactivation() {
    wp_clear_scheduled_hook('cron_every_5_seconds');
}

function add_every_5_seconds_cron_schedule( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'add_every_5_seconds_cron_schedule' );

function schedule_my_cron_events() {
    if ( ! wp_next_scheduled( 'cron_every_5_seconds') ) {
        wp_schedule_event( time(), 'every_5_seconds', 'cron_every_5_seconds' );
    }
}
add_action( 'init', 'schedule_my_cron_events' );

function cron_every_5_seconds_action() {
    $value = 91;
    update_user_meta( $value + 1, 'from_cron', 'updated' );
}
add_action( 'cron_every_5_seconds', 'cron_every_5_seconds_action' );

PS.(но это может быть важно) В вашем коде есть еще один недостаток, но, возможно, это просто вызвано некоторыми изменениями перед публикацией здесь...

Вы не сможете проверить, запускается ли ваш cron только один или несколько раз. Действие вашего события обновляет мету пользователя. Но новое установленное значение всегда равно 91. И поскольку вы используете update_user_meta, в БД будет храниться только одна такая мета.

 0
Author: Krzysiek Dróżdż, 2018-12-19 19:09:09

Предполагая, что ваш приведенный выше код верен (я его не тестировал), важно отметить, что wp-cron будет запускаться только тогда, когда кто-то посещает сайт, поэтому он не будет запускаться каждые 5 секунд в фоновом режиме, как вы, возможно, думаете.

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

Вот хорошая статья на эту тему.

РЕДАКТИРОВАТЬ: Попробуйте добавить его так

function cron_every_5_seconds( $schedules ) {
    $schedules['every_5_seconds'] = array(
        'interval'  => 5,
        'display'   => __( 'Every 5 Seconds', 'textdomain' )
    );
    return $schedules;
}

add_filter('cron_schedules', 'cron_every_5_seconds');

if (! wp_next_scheduled( 'cron_every_5_seconds')) {
    wp_schedule_event(time(), 'every_5_seconds', 'cron_every_5_seconds');
}

add_action('cron_every_5_seconds', 'cron_every_5_seconds_action');
    function cron_every_5_seconds_action() {
        $value = 91;
        update_user_meta($value + 1, 'from_cron', 'updated');
    }
?>
 1
Author: RiddleMeThis, 2018-12-19 18:39:28