Что такое WP-Cron и зачем он нужен
WP-Cron — это встроенный в WordPress механизм планировщика задач, который позволяет запускать повторяющиеся операции (например, публикацию запланированных постов, очистку кэша, отправку email-рассылок) без необходимости доступа к системному cron сервера. Однако WP-Cron запускается только при обращении к сайту, что может приводить к задержкам или пропускам в выполнении задач.
Диагностика проблем с WP-Cron
Основные признаки проблем с WP-Cron:
- Запланированные задачи не выполняются вовремя
- Отложенные посты не публикуются в назначенное время
- Плагины, использующие WP-Cron (например, для отправки писем), не работают корректно
Для проверки состояния cron задач используйте плагин WP Crontrol. Он позволяет просмотреть список всех запланированных событий, их время запуска и возможность их редактирования или удаления.
Проверка событий WP-Cron с помощью WP Crontrol
После установки и активации плагина:
- Перейдите в Инструменты > Cron Events
- Посмотрите список запланированных задач, их время и статус
- Обратите внимание на задачи с прошедшим временем запуска — они могли не выполниться
Настройка WP-Cron для надежного запуска задач
Отключение стандартного запуска WP-Cron и настройка системного cron
Для повышения надежности рекомендуется отключить стандартный WP-Cron, который запускается при каждом посещении сайта, и настроить запуск через системный cron, например, раз в 5 минут. Для этого:
- В
wp-config.phpдобавьте строку:
define('DISABLE_WP_CRON', true);- Настройте задание cron на сервере (пример для Linux):
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Или используйте curl:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Замените https://example.com на ваш URL сайта.
Запуск WP-Cron вручную для теста
Чтобы проверить работу WP-Cron без ожидания, можно выполнить вручную запуск функции:
if (defined('DOING_CRON') && DOING_CRON) {
// уже выполняется
} else {
wp_cron();
}Или через WP-CLI:
wp cron event run --due-nowДобавление и удаление пользовательских cron задач
Пример добавления собственного события cron
Чтобы регулярно выполнять кастомную функцию, например, очистку таблицы базы данных, добавьте следующее в functions.php или в плагин:
function my_custom_cron_job() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->prefix}my_table WHERE expire_date < NOW()");
}
// Регистрируем событие при активации темы или плагина
function my_custom_cron_activation() {
if (!wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'my_custom_cron_hook');
}
}
add_action('wp', 'my_custom_cron_activation');
// Привязываем функцию к событию
add_action('my_custom_cron_hook', 'my_custom_cron_job');Удаление cron задачи
Чтобы отменить задачу (например, при деактивации плагина):
function my_custom_cron_deactivation() {
$timestamp = wp_next_scheduled('my_custom_cron_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'my_custom_cron_hook');
}
}Проверка результата после настройки и исправления
- Убедитесь, что в WP Crontrol отображаются запланированные задачи с корректным временем.
- Если вы настроили системный cron, проверьте логи сервера на предмет ошибок при вызове
wp-cron.php. - Проверьте, что функция, связанная с cron, выполняется — например, очистка данных или отправка тестового письма.
- Используйте WP-CLI для запуска задач вручную и отслеживайте результат.
Частые ошибки при работе с WP-Cron и как их исправить
- WP-Cron не запускается из-за DISABLE_WP_CRON
Проверьте, не установлен ли вwp-config.phpфлагdefine('DISABLE_WP_CRON', true);без настройки системного cron. Если отключён WP-Cron, а системный cron не настроен, задачи не будут запускаться. - Неправильный URL в cron-задании сервера
Адрес должен точно совпадать с рабочим URL сайта, включая протокол (http/https). Ошибки в URL приведут к неработающему cron. - Проблемы с правами доступа
Если сервер блокирует внешние запросы кwp-cron.php, настройте исключения или используйте локальные команды запуска через WP-CLI. - Конфликты плагинов
Некоторые плагины могут конфликтовать с WP-Cron или неправильно регистрировать задачи. Используйте плагин WP Crontrol для выявления и удаления проблемных задач.
Практические советы по безопасности и производительности
- Используйте системный cron вместо стандартного WP-Cron — это снижает нагрузку и повышает надежность.
- Проверяйте и очищайте устаревшие cron-задачи с помощью WP Crontrol, чтобы избежать накопления ненужных событий.
- Ограничьте права запуска cron задач — при необходимости создавайте отдельные функции с проверками прав или nonce.
- Для критичных задач используйте WP-CLI — это позволяет запускать задачи вне зависимости от веб-запросов и получать детальный вывод ошибок.
Сравнение вариантов запуска cron задач
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартный WP-Cron (запуск при посещении) | Простота настройки, не требует доступа к серверу | Ненадежен при низкой посещаемости, задержки | Маленькие сайты с постоянной аудиторией |
| Системный cron (через crontab) | Надежный и точный запуск, низкая нагрузка | Нужен доступ к серверу, настройка | Средние и крупные проекты, высоконагруженные сайты |
| WP-CLI для запуска вручную | Точный контроль, отладка | Ручной запуск или дополнительная автоматизация | Разработка, отладка, критичные задачи |