Как использовать WP-Cron для автоматизации задач в WordPress

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

WP-Cron — встроенный в WordPress механизм для планирования и выполнения задач по расписанию. Он позволяет запускать скрипты в фоновом режиме, например, для очистки кеша, отправки email-уведомлений, обновления данных без необходимости настройки системных cron-заданий на сервере.

Но WP-Cron имеет особенности, о которых важно знать, чтобы правильно использовать его в реальных проектах.

Как диагностировать проблемы с WP-Cron

Частые симптомы неправильной работы WP-Cron:

  • Запланированные задачи не выполняются или выполняются с большой задержкой.
  • Производительность сайта падает при большом количестве cron-задач.
  • Ошибки в логах, связанные с wp-cron.php.

Для диагностики используйте плагин WP Crontrol. Он позволяет просматривать, редактировать и запускать cron-задачи вручную.

Также проверьте, что на сервере не отключен вызов wp-cron.php при каждом запросе. По умолчанию WP-Cron срабатывает при посещении сайта, что может быть ненадежно.

Пошаговое решение: настройка и оптимизация WP-Cron

1. Отключение стандартного WP-Cron и настройка системного cron

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

Добавьте в wp-config.php перед строкой /* That's all, stop editing! Happy blogging. */ следующую строку:

define('DISABLE_WP_CRON', true);

Далее в планировщик задач сервера (crontab) добавьте задачу для вызова wp-cron.php. Например, для запуска каждые 5 минут:

*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Или используйте curl вместо wget:

*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

2. Регистрация собственной задачи WP-Cron

Пример: добавим задачу для ежедневного удаления устаревших transient-данных.

В файл темы или плагина добавьте:

function wphost_cleanup_transients() {
    global $wpdb;
    $time = time();
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_%' AND option_value < %d",
            $time
        )
    );
}

function wphost_schedule_cleanup() {
    if (!wp_next_scheduled('wphost_daily_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wphost_daily_cleanup');
    }
}
add_action('wp', 'wphost_schedule_cleanup');
add_action('wphost_daily_cleanup', 'wphost_cleanup_transients');

Этот код проверяет, есть ли уже запланированная задача, и если нет — создает её с интервалом «daily».

3. Запуск задачи вручную для проверки

Для теста можно вызвать задачу напрямую:

do_action('wphost_daily_cleanup');

Или через WP Crontrol запустить событие вручную.

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

1. Убедитесь, что в расписании cron-задач (через WP Crontrol или wp-cli) появилась ваша задача.

2. Проверьте логи сервера на отсутствие ошибок при вызове wp-cron.php.

3. При необходимости — добавьте логирование в функцию, например:

error_log('WP-Cron cleanup ran at ' . date('Y-m-d H:i:s'));

и проверьте, что запись появляется в error_log.

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

  • Задачи не выполняются регулярно. Причина: отключен WP-Cron и не настроен системный cron. Решение: настройте системный cron и отключите WP-Cron в wp-config.php.
  • Дублирование задач. При каждом заходе на сайт создается новая задача. Причина: отсутствие проверки wp_next_scheduled(). Решение: обязательно проверяйте перед планированием.
  • Большая нагрузка на сервер. Слишком частый вызов wp-cron.php или чрезмерное количество задач. Решение: увеличьте интервал запуска системного cron и оптимизируйте задачи.
  • Ошибка подключения к wp-cron.php через wget/curl. Причина: неправильный URL или блокировка на сервере. Решение: проверьте корректность URL и разрешения сервера.

Практические советы по безопасности и производительности

  • Не запускайте wp-cron.php слишком часто, чтобы не перегружать сервер.
  • Используйте системный cron вместо запуска при каждом запросе — это надежнее и производительнее.
  • Проверяйте наличие задач перед их созданием, чтобы избежать дублирования.
  • Если используете https, убедитесь, что cron-запросы проходят без проблем (сертификаты, редиректы).
  • Логируйте критичные задачи для мониторинга их выполнения.

Сравнение вариантов запуска WP-Cron

МетодПлюсыМинусыРекомендации
Запуск при каждом запросе (по умолчанию)Простота настройки, не требует доступа к серверуЗависит от посещаемости, может не запускаться вовремя, нагрузка при большом трафикеПодходит для небольших сайтов с регулярным трафиком
Системный cron (crontab)Точный запуск, стабильность, отсутствие зависимости от трафикаТребует доступа к серверу и базовых навыков администрированияРекомендуется для средних и больших проектов
Внешние сервисы (например, cron-job.org)Не требует сервера, простой запуск по расписаниюЗависимость от стороннего сервиса, возможна задержкаПодходит, если нет доступа к crontab
Как удалить или изменить поля в форме оплаты WooCommerce без плагинов
17.06.2026
Как решить проблему неработающих email-уведомлений WooCommerce
03.06.2026
Как создать автоматическое удаление старых записей в WordPress по дате
24.01.2026
Как избежать проблем с неработающими email-уведомлениями WooCommerce
08.05.2026
Как использовать WP-Cron для автоматизации задач в WordPress
09.06.2026