Что такое WP-Cron и зачем он нужен
WP-Cron — системный механизм WordPress для планирования и выполнения запланированных задач (cron jobs) без необходимости настраивать системный cron на сервере. Он запускает задачи при загрузке сайта, что подходит для большинства проектов, но имеет свои особенности и ограничения.
Диагностика проблем с WP-Cron
Если автоматические задачи не выполняются, например, автоматическая публикация, очистка кэша или отправка писем, вероятные причины:
- WP-Cron отключен в
wp-config.phpчерезdefine('DISABLE_WP_CRON', true); - Низкий трафик на сайте — задачи запускаются только при посещении страниц
- Конфликт плагинов или тем, блокирующих выполнение WP-Cron
- Ошибки в коде задач, из-за которых они не завершаются
- Проблемы с сервером или временем выполнения PHP
Как проверить работу WP-Cron
Добавьте в functions.php следующий код, чтобы логировать запуск cron:
add_action('my_custom_cron_hook', function() {
error_log('WP-Cron сработал: ' . current_time('mysql'));
});
if (!wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'my_custom_cron_hook');
}Затем проверьте файл debug.log в папке wp-content (если включено логирование ошибок) после обновления страниц сайта. Если записи есть — WP-Cron работает.
Пошаговое решение: настройка и оптимизация WP-Cron
1. Проверяем, не отключён ли WP-Cron
Откройте wp-config.php и убедитесь, что нет строки:
define('DISABLE_WP_CRON', true);Если есть — удалите или закомментируйте.
2. Настраиваем системный cron для запуска WP-Cron (рекомендуется на высоконагруженных сайтах)
Отключите WP-Cron в WordPress:
define('DISABLE_WP_CRON', true);Добавьте системное задание в crontab (замените путь к сайту):
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это запустит WP-Cron каждые 15 минут независимо от трафика.
3. Создаём собственное крон-задание с кодом
Добавьте в functions.php или плагин:
function my_custom_cron_job() {
// Пример: удаляем посты из черновиков старше 30 дней
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_date < NOW() - INTERVAL 30 DAY");
}
add_action('my_custom_cron_hook', 'my_custom_cron_job');
if (!wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'daily', 'my_custom_cron_hook');
}Проверка результата после внедрения
Для проверки:
- Проверьте в админке раздел Инструменты → Состояние сайта → Cron Events (если доступно) наличие вашего задания.
- Проверьте логи ошибок или создайте логирование внутри функции.
- Смоделируйте выполнение вручную, вызвав хук через WP-CLI:
wp cron event run my_custom_cron_hook.
Частые ошибки и как их исправить
- Нет запуска задач при низком трафике: Решение — настроить системный cron, чтобы запускать WP-Cron по расписанию.
- Множественные запуски одних и тех же задач: Проверьте, не создаётся ли несколько событий с одинаковым хуком. Используйте
wp_next_scheduled()для проверки перед планированием. - Задачи не выполняются из-за таймаутов: Оптимизируйте код внутри функций cron, увеличьте
max_execution_timeили разбейте задачу на части. - Ошибки при выполнении функций: Используйте обработчики ошибок и логируйте исключения внутри cron-функций.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые задачи в WP-Cron без разбивки на части и проверки времени выполнения.
- Используйте nonce и проверки прав пользователей, если cron-функции вызываются через AJAX или внешние запросы.
- Ограничьте доступ к
wp-cron.phpчерез .htaccess или firewall, если настроен системный cron — чтобы предотвратить внешние вызовы. - Для больших сайтов с большим трафиком лучше полностью отключить WP-Cron и запускать системный cron.
Сравнение вариантов управления WP-Cron
| Вариант | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| WP-Cron по умолчанию | Не требует настройки сервера, простой запуск | Зависит от трафика, возможны задержки | Подходит для небольших сайтов |
| Отключение WP-Cron + системный cron | Точный запуск по расписанию, не зависит от трафика | Требуется доступ к серверу, настройка crontab | Рекомендуется для средних и больших проектов |
| Плагины для управления WP-Cron | Удобный интерфейс, мониторинг | Дополнительная нагрузка, возможны конфликты | Использовать при необходимости отладки и контроля |