Что такое WP-Cron и зачем он нужен
WP-Cron — это встроенный в WordPress механизм для планирования и выполнения задач по расписанию (cron jobs). Он позволяет запускать функции, например, автоматическое резервное копирование, очистку кэша, отправку уведомлений, обновление данных и многое другое без необходимости использовать системный cron на сервере.
Диагностика проблем с WP-Cron
Частая проблема — задачи WP-Cron не выполняются или запускаются с задержкой. Это связано с тем, что WP-Cron работает при заходе посетителя на сайт, а если трафик низкий или есть ограничения сервера, задания могут не запускаться вовремя.
Проверить, работает ли WP-Cron, можно с помощью плагина WP Crontrol. После установки перейдите в Инструменты > Cron Events и посмотрите список запланированных задач и дату их следующего запуска.
Пошаговое решение: настройка надежного запуска WP-Cron
1. Отключение встроенного WP-Cron
Чтобы избежать запуска WP-Cron при каждом заходе посетителя, отключите его, добавив в wp-config.php строку:
define('DISABLE_WP_CRON', true);2. Настройка системного cron на сервере
Создайте задание в системном cron, которое будет вызывать WP-Cron через HTTP-запрос с нужной периодичностью (например, раз в 5 минут). Пример команды для Linux-сервера:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Замените https://example.com на URL вашего сайта.
3. Проверка работы
После настройки системного cron вернитесь в WP Crontrol и проверьте, обновляется ли время следующего запуска задач. Также можно добавить тестовое событие:
function test_wp_cron_event() {
error_log('WP-Cron event triggered at ' . current_time('mysql'));
}
if (!wp_next_scheduled('test_wp_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'test_wp_cron_hook');
}
add_action('test_wp_cron_hook', 'test_wp_cron_event');Через час проверьте лог ошибок сервера — должна появиться запись с отметкой времени.
Частые ошибки и как их исправить
- WP-Cron не запускается из-за DISABLE_WP_CRON: убедитесь, что после установки системного cron этот параметр включен, иначе cron не будет работать.
- HTTP-запрос блокируется сервером: некоторые хостинги запрещают вызов
wp-cron.phpчерез curl или wget. Проверьте доступность URL и при необходимости используйте системный php-скрипт:php /path/to/wordpress/wp-cron.php. - Неправильный путь к wp-cron.php в cron: для вызова из консоли используйте абсолютный путь к файлу с PHP.
Практические советы по безопасности и производительности
- Не используйте слишком частый запуск WP-Cron — 5 минут достаточно для большинства задач.
- Отключайте WP-Cron в
wp-config.php, если настроили системный cron, чтобы избежать дублирующих запусков. - Проверяйте, что
wp-cron.phpне доступен для публичного вызова, если запускаете через системный cron с консоли, ограничьте его вызовы IP или настройте аутентификацию. - Используйте WP Crontrol для мониторинга и устранения зависших или частых задач.
Пример планирования пользовательской задачи с WP-Cron
function my_custom_cron_job() {
// Ваш код, например, очистка устаревших данных
global $wpdb;
$wpdb->query("DELETE FROM wp_postmeta WHERE meta_key = '_old_meta_key'");
}
// Регистрация события
if (!wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'daily', 'my_custom_cron_hook');
}
add_action('my_custom_cron_hook', 'my_custom_cron_job');Этот код создаст ежедневное событие, которое будет вызывать функцию очистки метаданных.
Сравнение вариантов запуска WP-Cron
| Способ | Плюсы | Минусы |
|---|---|---|
| Встроенный WP-Cron | Не требует настройки сервера, прост в использовании | Зависит от посещаемости сайта, может запускаться с задержкой |
| Системный cron + DISABLE_WP_CRON | Точный и надежный запуск, не зависит от трафика | Требует доступа к серверу и базовых знаний Linux cron |
| Плагины для управления cron | Удобный интерфейс, мониторинг задач | Дополнительная нагрузка, зависимость от плагина |