Что такое WP-Cron и зачем он нужен
WP-Cron — встроенный в WordPress механизм планировщика задач, который позволяет запускать функции через определённые интервалы времени. Это удобно для автоматизации рутинных операций: публикации отложенных постов, очистки кэша, отправки писем, обновления данных и т.д. Однако WP-Cron работает не как системный cron на сервере — он запускается при обращении к сайту, что может вызвать задержки или пропуски задач при малом трафике.
Диагностика проблем с WP-Cron
Если ваши автоматические задачи не выполняются вовремя, проверьте следующее:
- Активен ли WP-Cron — в
wp-config.phpдолжна отсутствовать или бытьfalseконстантаDISABLE_WP_CRON. - Нет ли конфликтов с плагинами или темами, которые отключают WP-Cron.
- Есть ли ошибки в логах сервера или WP, связанные с выполнением крон-задач.
- Проверить расписание задач можно с помощью плагинов, например WP Crontrol.
Пошаговое решение: как правильно настроить WP-Cron
1. Проверка и включение WP-Cron
Убедитесь, что в файле wp-config.php нет строки:
define('DISABLE_WP_CRON', true);Если она есть, временно закомментируйте или удалите её, чтобы WP-Cron работал стандартно.
2. Регулярный запуск WP-Cron через системный cron (рекомендуется)
Чтобы избежать проблем с запуском при низком трафике, отключите WP-Cron и добавьте системный cron на сервере:
define('DISABLE_WP_CRON', true);В cron на сервере добавьте задачу, например запускающую WP-Cron каждые 5 минут:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или с помощью curl:
*/5 * * * * curl -so /dev/null https://example.com/wp-cron.php?doing_wp_cronЗамените https://example.com на URL вашего сайта.
3. Добавление своей задачи в WP-Cron
Пример функции, которая будет запускаться автоматически:
function wp3_custom_cron_task() {
// Пример: удаляем устаревшие записи из кастомной таблицы
global $wpdb;
$table = $wpdb->prefix . 'custom_data';
$wpdb->query( $wpdb->prepare("DELETE FROM $table WHERE date < %s", date('Y-m-d', strtotime('-30 days'))) );
}
// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wp3_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wp3_daily_cleanup' );
}
// Подключаем функцию к событию
add_action( 'wp3_daily_cleanup', 'wp3_custom_cron_task' );Этот код очищает базу от записей старше 30 дней раз в сутки.
4. Использование WP Crontrol для управления задачами
Плагин WP Crontrol позволяет просматривать, запускать и редактировать задачи WP-Cron прямо из админки. Это удобно для отладки и контроля.
Как проверить, что WP-Cron работает корректно
- Установите и активируйте WP Crontrol.
- Перейдите в «Инструменты» -> «Cron Events» и убедитесь, что ваша задача отображается и запланирована.
- Попробуйте выполнить задачу вручную через интерфейс плагина.
- Проверьте, что действие, связанное с задачей, действительно выполняется (например, данные очищаются, письма отправляются).
Частые ошибки при работе с WP-Cron и их исправление
- DISABLE_WP_CRON установлена в true — WP-Cron не запускается автоматически. Решение: отключить эту константу и настроить системный cron.
- Низкий трафик сайта — WP-Cron не запускается вовремя, т.к. запускается только при посещении сайта. Решение: использовать системный cron.
- Неправильный хук или функция — задача не выполняется. Проверьте, что имя хука и функция совпадают и функция подключена.
- Ошибки в коде задачи — задача запускается, но ничего не происходит. Проверьте логи, отладьте функцию.
Практические советы по производительности и безопасности
- Не перегружайте WP-Cron частыми и тяжёлыми задачами — лучше разбивайте работу на мелкие этапы.
- Используйте системный cron вместо WP-Cron, если у вас большой или коммерческий сайт с низким трафиком.
- Для задач, связанных с внешними API, добавляйте обработку ошибок и логи.
- Ограничьте права доступа к
wp-cron.phpчерез htaccess или web-сервер, если запускаете его через системный cron, чтобы избежать внешних вызовов.
Сравнение способов запуска WP-Cron
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Стандартный WP-Cron (по визитам) | Не требует настройки сервера, прост в использовании | Ненадёжный, зависит от трафика, может срабатывать с задержкой | Подходит для небольших сайтов с постоянным трафиком |
| Системный cron + отключённый WP-Cron | Точный запуск, стабильность, не зависит от посещений | Нужен доступ к серверу для настройки cron | Лучший вариант для коммерческих и больших сайтов |
| Плагины управления cron (WP Crontrol и др.) | Удобство управления, отладки | Не решает проблемы запуска, лишь визуализирует задачи | Используйте вместе с системным cron |