WP-Cron полезен для простых периодических действий плагина: очистки временных данных, синхронизации небольших справочников и напоминаний. Но это не системный cron с гарантированным временем запуска: механизм обычно реагирует на обращения к сайту, поэтому время выполнения может сдвигаться.
Безопасный сценарий регистрации
- Создайте уникальное имя события и функцию-обработчик.
- Планируйте событие при активации плагина или при явной проверке его отсутствия.
- Перед
wp_schedule_event()проверяйтеwp_next_scheduled(), иначе получите несколько одинаковых запусков. - При деактивации удаляйте собственное запланированное событие.
<?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/
Материал был полезен?
Помогите нам сделать материалы точнее и понятнее.