wplearn.ru wordpress WP Learn

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

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

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

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

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

  • Запланированные задачи не выполняются вовремя или вовсе не запускаются.
  • Отложенный контент (посты, публикации) не публикуется в назначенное время.
  • Автоматические процессы (например, очистка кэша или отправка уведомлений) задерживаются.

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

if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
    wp_schedule_event( time(), 'hourly', 'my_custom_cron_hook' );
}

add_action( 'my_custom_cron_hook', 'my_custom_cron_function' );
function my_custom_cron_function() {
    // Ваш код для выполнения по расписанию
}

Пошаговое решение: настройка надежного запуска WP-Cron через системный cron

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

1. Отключаем дефолтный WP-Cron в wp-config.php

define( 'DISABLE_WP_CRON', true );

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

2. Настраиваем системный cron на сервере

Подключитесь к серверу по SSH и откройте редактор crontab:

crontab -e

Добавьте следующую строку для запуска WP-Cron каждые 15 минут:

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

Или, если доступна команда curl:

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

Не забудьте заменить https://example.com на URL вашего сайта.

3. Проверяем работу запланированных задач

Вернитесь в админку WordPress и установите плагин WP Crontrol. В разделе "Инструменты > Cron Events" вы увидите список задач и время их следующего запуска. Убедитесь, что время обновляется и задачи выполняются.

Как проверить, что решение сработало

  • В плагине WP Crontrol проверьте, что задачи запускаются в соответствии с системным cron.
  • Создайте тестовую задачу с логированием в файл и убедитесь, что файл обновляется по расписанию:
add_action( 'test_cron_hook', 'test_cron_function' );
if ( ! wp_next_scheduled( 'test_cron_hook' ) ) {
    wp_schedule_event( time(), 'hourly', 'test_cron_hook' );
}
function test_cron_function() {
    file_put_contents( WP_CONTENT_DIR . '/cron_test.log', date('Y-m-d H:i:s') . " - cron executed\n", FILE_APPEND );
}

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

  • Ошибка: WP-Cron не запускается из-за кеширования страниц (например, при использовании плагина кеша).
    Решение: исключите URL /wp-cron.php из кеширования в настройках плагина.
  • Ошибка: Неверный URL или отсутствие протокола в crontab.
    Решение: всегда используйте полный URL с протоколом https:// или http://.
  • Ошибка: Системный cron не работает из-за отсутствия прав или настроек сервера.
    Решение: проверьте права пользователя, под которым запускается cron, и логи сервера.

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

  • Не запускайте WP-Cron слишком часто — достаточно 15 минут для большинства сайтов.
  • Отключайте WP-Cron на уровне WordPress, чтобы избежать одновременного запуска нескольких процессов при высокой нагрузке.
  • Для больших сайтов с интенсивными задачами рассмотрите использование сторонних сервисов cron, например, cron-job.org.
  • Обязательно исключайте /wp-cron.php из кеширования и защиты от DDoS в настройках сервера или плагина безопасности.

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

СпособПлюсыМинусыИспользование
Дефолтный WP-Cron (по посещению)Прост в настройке, не требует сервераНе надежен при низкой посещаемости, задержкиМалые сайты с небольшим трафиком
Системный cron (через wget/curl)Надежный и точный запуск задачТребует SSH-доступ и настройки сервераЛюбые сайты, особенно с интенсивными задачами
Внешние сервисы cronНе зависит от сервера, простой мониторингЗависимость от сторонних сервисовБольшие проекты и высоконагруженные сайты
×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙