Что такое WP-Cron и зачем он нужен
WP-Cron — встроенный механизм планирования задач в WordPress, позволяющий запускать события в заданное время или с определённым интервалом. В отличие от системных cron-задач, WP-Cron запускается при заходе посетителя на сайт, что может приводить к задержкам или несвоевременному выполнению задач.
Типичные задачи для WP-Cron: очистка кеша, отправка уведомлений, импорт/экспорт данных, обновление статистики, публикация отложенных постов.
Диагностика проблем с WP-Cron
Проверка работы WP-Cron
Выполните запрос в браузере или через терминал:
curl -I https://example.com/wp-cron.php?doing_wp_cronОтвет должен быть 200 OK. Если приходит ошибка 404 или 403 — значит, вызов WP-Cron заблокирован или неправильно настроен.
Проверка зарегистрированных событий WP-Cron
Добавьте в файл functions.php темы или в плагин следующий код для вывода списка задач:
add_action('admin_notices', function() {
if (!current_user_can('manage_options')) return;
$crons = _get_cron_array();
echo '<pre>';
print_r($crons);
echo '</pre>';
});Перейдите в админку: увидите список запланированных задач и время их срабатывания.
Пошаговое решение: правильная настройка WP-Cron
1. Отключение встроенного WP-Cron
Для сайтов с высокой нагрузкой или на VPS рекомендуется отключить стандартный WP-Cron и запускать системный cron.
define('DISABLE_WP_CRON', true);Добавьте эту строку в wp-config.php до строки /* That's all, stop editing! Happy blogging. */.
2. Настройка системного cron
Добавьте в crontab задачу, которая будет запускать WP-Cron каждые 5 минут:
*/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>&13. Создание пользовательской задачи WP-Cron
Пример регистрации пользовательского события, выполняющего очистку временных данных:
function my_custom_cron_job() {
global $wpdb;
$wpdb->query("DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%'");
}
add_action('my_hourly_cleanup', 'my_custom_cron_job');
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('my_hourly_cleanup')) {
wp_schedule_event(time(), 'hourly', 'my_hourly_cleanup');
}Проверка результата после внедрения
1. Проверьте, что в wp-config.php прописан DISABLE_WP_CRON при использовании системного cron.
2. Убедитесь, что системный cron выполняется — в логах сервера должна появляться активность по вызову wp-cron.php.
3. Используйте плагин WP Crontrol для просмотра и управления задачами cron прямо из админки.
4. Для ручного запуска всех задач WP-Cron через WP-CLI:
wp cron event run --allЧастые ошибки и как их исправить
- Ошибка 403/404 при вызове wp-cron.php — проверьте настройки .htaccess и файрвола, убедитесь, что URL доступен.
- Задачи не выполняются вовремя — отключите встроенный WP-Cron и настройте системный cron.
- Дублирование задач — проверяйте, что событие не регистрируется несколько раз (используйте
wp_next_scheduled()). - Избыточная нагрузка из-за частых вызовов WP-Cron — увеличьте интервал запуска или переключитесь на системный cron.
Практические советы по безопасности и производительности
- Запускайте системный cron вместо встроенного WP-Cron на высоконагруженных сайтах.
- Ограничьте доступ к
wp-cron.phpпо IP или через .htaccess, если используете внешние вызовы. - Используйте WP Crontrol для мониторинга и удаления ненужных или устаревших задач.
- Оптимизируйте пользовательские задачи, чтобы они не блокировали выполнение — например, делите большие операции на части.
Сравнение способов запуска WP-Cron
| Способ | Плюсы | Минусы |
|---|---|---|
| Встроенный WP-Cron | Прост в настройке, не требует доступа к серверу | Зависит от посещаемости сайта, задержки в выполнении задач |
| Системный cron | Точный запуск, надежность, подходит для больших сайтов | Требует доступа к серверу и навыков настройки |