ворд-пресс.рф
Разработка

WP-Cron в собственном плагине: расписание задач без дублей

Как запланировать задачу в WordPress, не создавать дубли при каждом запросе и удалять события при деактивации.

WP-Cron полезен для простых периодических действий плагина: очистки временных данных, синхронизации небольших справочников и напоминаний. Но это не системный cron с гарантированным временем запуска: механизм обычно реагирует на обращения к сайту, поэтому время выполнения может сдвигаться.

Безопасный сценарий регистрации

  1. Создайте уникальное имя события и функцию-обработчик.
  2. Планируйте событие при активации плагина или при явной проверке его отсутствия.
  3. Перед wp_schedule_event() проверяйте wp_next_scheduled(), иначе получите несколько одинаковых запусков.
  4. При деактивации удаляйте собственное запланированное событие.
<?php
/** Plugin Name: Example Scheduled Task */
function wpr8_task_run() {
    // Учебный пример: не выполняйте длительные запросы в PHP-цикле.
    update_option( 'wpr8_task_last_run', time(), false );
}
add_action( 'wpr8_task_hook', 'wpr8_task_run' );

function wpr8_task_activate() {
    if ( ! wp_next_scheduled( 'wpr8_task_hook' ) ) {
        wp_schedule_event( time() + 300, 'hourly', 'wpr8_task_hook' );
    }
}
register_activation_hook( __FILE__, 'wpr8_task_activate' );

function wpr8_task_deactivate() {
    wp_clear_scheduled_hook( 'wpr8_task_hook' );
}
register_deactivation_hook( __FILE__, 'wpr8_task_deactivate' );

Здесь показана только механика планирования и очистки. Для работы с внешним API добавьте ограничения по частоте, время ожидания, повторы с backoff и контроль одновременных запусков.

Почему задача «не запускается каждый час»

События WP-Cron выполняются не строго по часам: посещения сайта и условия серверного окружения влияют на момент запуска. Для заданий с обязательным SLA нужен системный планировщик, который вызывает WordPress-обработчик в контролируемом режиме; настройку выполняйте по документации своего хостинга, не включая публичный бесконтрольный endpoint.

Как проверить

  • Вручную активируйте и деактивируйте плагин на staging, проверьте список cron-событий доступным диагностическим инструментом.
  • Убедитесь, что после десяти обращений к сайту у события одна очередь, а не десять записей.
  • Проверьте повторную активацию, отказ сервера или внешнего API и очистку события.
  • Не помещайте секреты в аргументы событий без понимания того, где они сохраняются.
  • Для долгих задач используйте очередь и порционную обработку; не держите PHP-запрос до тайм-аута.

Следующий шаг

Если нужно запускать проверки вручную из консоли, рассмотрите собственную команду WP-CLI. Для контроля совместимости пригодятся автоматические тесты и отчёт об успешности выполнения заданий.

Источник: https://developer.wordpress.org/plugins/cron/scheduling-wp-cron-events/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.