Поддержка Проблемы и решения Не срабатывает планировщик заданий (wp_schedule_event)

  • Здравствуйте.
    Ни как не могу совладать с wp_schedule_event

    Есть код (см.ниже), который должен делать запись текущей даты в log.txt

    Но почему-то этого не происходит.

    // Устанавливаем свой интервал времени - код в function.php
    function add_every_ten_seconds( $schedules ) {
        $schedules['every_ten_seconds'] = array(
        'interval'  => 10,
        'display' =>  'Every 10 Seconds'
        );
    
        return $schedules;
    }
    add_filter( 'cron_schedules', 'add_every_ten_seconds' );
    
    // Активируем плагин и запускаем задачу
    register_activation_hook( __FILE__, 'install_plugin' );
    function install_plugin() {
        // Очищаем крон, на всякий случай
        wp_clear_scheduled_hook( 'write2file' );
    
        // добавим новую задачу
        wp_schedule_event( time(), 'every_ten_seconds', 'write2file');
    
        add_action('write2file', 'do_this_every_ten_seconds');
    
        function do_this_every_ten_seconds() {
            file_put_contents( "log.txt", date( 'd-m-Y H:i:s' ) . "\n", FILE_APPEND );
        }
    
    }
    
    // Декативация плагина
    register_deactivation_hook( __FILE__, 'deactivate_plugin');
    function deactivate_plugin() {
        wp_clear_scheduled_hook( 'write2file' );
    }

    PS Если «повесить» запись в log.txt на кнопку(submit) — все работает.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Модератор Yuri

    (@yube)

    Что-то мне кажется, что нужно немного наоборот: кастомный интервал создавать в коде активации, а обработку события декларировать в «тельце» плагина.

    Поправьте, если я ошибаюсь:

    1. При активации плагина:

    • 1.1 Смотрим если запущена наша задача — убиваем ее wp_clear_scheduled_hook( 'write2file' );
    • 1.2 Запускаем задачу на выполнение

    При уже активированном плагине

    • Должен быть доступен кастомный интервал времени
    • Должен быть досупен обработчик (add_action)

    Таким образом, код получается таким:

    //  ТЕЛО ПЛАГИНА
    function add_every_ten_seconds( $schedules ) {
        $schedules['every_ten_seconds'] = array(
        'interval'  => 10,
        'display' =>  'Every 10 Seconds'
        );
        return $schedules;
    }
    add_filter( 'cron_schedules', 'add_every_ten_seconds' );
    
    add_action('write2file', 'do_this_every_ten_seconds');
    function do_this_every_ten_seconds() {
       file_put_contents( "log.txt", date( 'd-m-Y H:i:s' ) . "\n", FILE_APPEND );
    }
    
    // АКТИВАЦИЯ ПЛАГИНА
    register_activation_hook( __FILE__, 'install_plugin' );
    function install_plugin() {
        wp_clear_scheduled_hook( 'write2file' );
        wp_schedule_event( time(), 'every_ten_seconds', 'write2file');
    }
    
    // Декативация плагина
    register_deactivation_hook( __FILE__, 'deactivate_plugin');
    function deactivate_plugin() {
        wp_clear_scheduled_hook( 'write2file' );
    }

    Вроде бы все работает, но ЛОГ ПИШЕТСЯ ТОЛЬКО КОГДА ОБНОВЛЯЕТСЯ СТРАНИЦА!!!

    Плагин Advanced Cron Manager пишет: Next execution: At next page refresh
    т.е. следующее выполнение: при первом же обновлении страницы.

    КАК СДЕЛАТЬ, ЧТОБЫ ЗАПИСЬ В ФАЙЛ ШЛА КАЖДЫЙ 10 СЕКУНД ?

    Нашел на stackoverflow
    «Yes, wp-cron relies on visits to your website. You can disable it and use triggering of wp-cron.php via system cron 🙂 «
    wp-cron полаается на посещения вашего сайта. Вы должны отключить это и использоваться срабатывание с помощью системы

    Как это реализоваться?

    Модератор Yuri

    (@yube)

    Вроде бы все работает, но ЛОГ ПИШЕТСЯ ТОЛЬКО КОГДА ОБНОВЛЯЕТСЯ СТРАНИЦА!!!

    Естественно. Это же ПСЕВДОхрон. По сути это обычный php-скрипт, которого «дергает» движок, если есть зачем.

    Модератор Yuri

    (@yube)

    Hooking WP-Cron into the system task scheduler

    Только не ждите, что системный хрон будет дергать хук каждые 10 секунд — у него минимальный интервал 1 минута.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «Не срабатывает планировщик заданий (wp_schedule_event)» закрыта для новых ответов.