wp-kurs.ru wordpress WP-Kurs

Как использовать WP-Cron для отложенных задач в WordPress

Что такое WP-Cron и зачем он нужен

WP-Cron — встроенный в WordPress механизм для запуска запланированных задач (cron jobs). В отличие от системного cron на сервере, WP-Cron срабатывает при заходе пользователя на сайт, что может вызвать задержки и нестабильность выполнения задач на малопосещаемых ресурсах.

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

Диагностика проблем с WP-Cron

Первый шаг — проверить, работает ли WP-Cron корректно:

  • Откройте wp-config.php и убедитесь, что нет константы DISABLE_WP_CRON со значением true (она отключает WP-Cron).
  • Выполните запрос к URL https://ваш-сайт.ru/wp-cron.php?doing_wp_cron. Если в ответе ошибки или скрипт не запускается, значит WP-Cron не работает.
  • Проверьте логи сервера на наличие ошибок PHP при вызове wp-cron.php.
  • Используйте плагин «WP Crontrol» для просмотра и управления запланированными задачами.

Пошаговое решение: как правильно зарегистрировать и запустить отложенную задачу

1. Регистрируем событие

Для запуска задачи через WP-Cron сначала регистрируем собственное событие и хук для его обработки.

function my_custom_cron_schedule() {
    if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
        wp_schedule_event( time(), 'hourly', 'my_custom_cron_hook' );
    }
}
add_action( 'wp', 'my_custom_cron_schedule' );

Здесь мы создаём событие my_custom_cron_hook, которое будет срабатывать ежечасно.

2. Добавляем обработчик задачи

add_action( 'my_custom_cron_hook', 'my_custom_cron_function' );

function my_custom_cron_function() {
    // Код задачи, например, очистка старых записей
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->prefix}posts WHERE post_status = 'trash' AND post_date < NOW() - INTERVAL 30 DAY");
}

3. Запускаем WP-Cron вручную для теста

Для проверки можно вызвать функцию вручную:

do_action( 'my_custom_cron_hook' );

Или отправить HTTP-запрос к wp-cron.php через браузер или инструмент curl.

Проверка результата после внедрения

  • Убедитесь, что задача появляется в списке запланированных событий через плагин WP Crontrol.
  • Посмотрите, что после срабатывания задачи в базе данных или логах выполнены необходимые изменения (например, удалены записи).
  • Для мониторинга можно добавить логирование внутри функции:
function my_custom_cron_function() {
    $log_file = WP_CONTENT_DIR . '/my_cron_log.txt';
    file_put_contents( $log_file, "Task ran at: " . date('Y-m-d H:i:s') . "\n", FILE_APPEND );
    // Ваша логика
}

Частые ошибки при работе с WP-Cron и как их исправить

  • DISABLE_WP_CRON равен true — WP-Cron не запускается. Удалите или отключите эту константу в wp-config.php.
  • Сайт без посещений — WP-Cron не срабатывает, так как запускается по заходу пользователя. Решение: настроить системный cron и отключить WP-Cron.
  • Ошибка 500 или таймаут при вызове wp-cron.php — проверьте права на файл, лимиты PHP, логи сервера.
  • Конфликты с плагинами безопасности — некоторые блокируют запросы к wp-cron.php, добавьте исключения или настройте правила.

Оптимизация и безопасность при работе с WP-Cron

WP-Cron может нагружать сервер, если задачи тяжелые или запускаются слишком часто. Рекомендуем:

  • Для ресурсоёмких задач используйте системный cron вместо WP-Cron: в wp-config.php добавьте define('DISABLE_WP_CRON', true); и настройте cron на сервере (например, каждую минуту или 5 минут):
* * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Добавляйте nonce и проверяйте права пользователя, если задачи вызываются через AJAX или открытые URL.
  • Используйте логирование и мониторинг для отслеживания сбоев.
  • Ограничивайте частоту запуска задач (например, не чаще раза в час, если нет острой необходимости).

Сравнение вариантов запуска отложенных задач в WordPress

МетодПлюсыМинусыКогда использовать
WP-Cron (по умолчанию) Прост в настройке, не требует доступа к серверу Зависит от посещаемости, возможны задержки Маленькие сайты с регулярным трафиком
Системный cron Точный запуск, не зависит от трафика, надежен Требует доступа к серверу, настройка сложнее Большие проекты, задачи с высокой нагрузкой
Плагины планировщика задач (например, WP Crontrol) Удобный интерфейс, дополнительный функционал Могут влиять на производительность Для управления и отладки cron задач
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙