Что такое WP-Cron и зачем он нужен
WP-Cron — это встроенный механизм планирования задач в WordPress, который позволяет запускать функции в определенное время или с заданным интервалом. Он используется для автоматизации рутинных задач: отправки email, очистки базы данных, обновления кэшированных данных и так далее.
В отличие от системного cron на сервере, WP-Cron запускается при каждом посещении сайта, поэтому его работа зависит от трафика.
Диагностика проблем с WP-Cron
Частые симптомы проблем с WP-Cron:
- Автоматические задачи не выполняются вовремя или не выполняются вовсе.
- Отсутствие обновления или очистки данных, которые должны обновляться по расписанию.
- Ошибки в логах, связанные с wp-cron.php.
Чтобы проверить, работает ли WP-Cron, можно добавить простой код в functions.php вашей темы:
add_action('init', function() {
if (!wp_next_scheduled('my_test_event')) {
wp_schedule_event(time(), 'hourly', 'my_test_event');
}
});
add_action('my_test_event', function() {
error_log('WP-Cron event fired at ' . current_time('mysql'));
});Зайдите на сайт и проверьте файл debug.log (нужно включить логирование ошибок), появятся ли записи. Если нет — WP-Cron не срабатывает.
Пошаговое решение: как настроить и отладить WP-Cron
1. Проверка и включение WP-Cron
Убедитесь, что в wp-config.php нет строки define('DISABLE_WP_CRON', true);. Если есть — удалите или закомментируйте её.
2. Создание собственного события WP-Cron
Пример: задача для очистки устаревших записей кастомного типа каждые 12 часов.
function clear_old_custom_posts() {
$args = [
'post_type' => 'my_custom_post',
'date_query' => [
[
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$query = new WP_Query($args);
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
add_action('clear_old_custom_posts_hook', 'clear_old_custom_posts');
if (!wp_next_scheduled('clear_old_custom_posts_hook')) {
wp_schedule_event(time(), 'twicedaily', 'clear_old_custom_posts_hook');
}3. Использование системного cron для надежности
WP-Cron зависит от посещений сайта, что нежелательно для проектов с низким трафиком. Можно отключить WP-Cron и настроить системный cron на сервере:
- В
wp-config.phpдобавить:define('DISABLE_WP_CRON', true); - Добавить в crontab сервера команду:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Эта команда запускает WP-Cron каждую минуту. Замените https://example.com на адрес вашего сайта.
Проверка результата после внедрения
- Включите логирование ошибок в WordPress (
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);вwp-config.php). - Добавьте в функцию cron запись в лог (см. пример выше с
error_log). - Проверьте файл
wp-content/debug.logна предмет появления записей о выполнении задачи. - Проверьте изменение данных, которые должна обрабатывать задача (например, удаление старых записей).
Частые ошибки и как их исправить
- DISABLE_WP_CRON установлен в true: WP-Cron не запускается. Решение — отключить эту константу.
- Системный cron не настроен при отключенном WP-Cron: задачи не выполняются, если нет посещений сайта. Решение — настроить системный cron на сервере.
- Неправильное использование хуков: функция должна быть подключена к
add_actionс правильным именем события. - Повторное создание задачи без проверки: вызывает дублирующиеся задачи. Всегда проверяйте
wp_next_scheduled()перед созданием. - Ошибки в теле функции cron: могут приводить к прерыванию работы. Рекомендуется обрабатывать ошибки и использовать логи.
Практические советы по безопасности и производительности
- Не размещайте тяжелые операции внутри WP-Cron, если это может повлиять на отзывчивость сайта — разбивайте задачи на мелкие части.
- Используйте системный cron на сайтах с низкой посещаемостью.
- Ограничьте доступ к
wp-cron.phpчерез .htaccess или серверные правила, если используете системный cron, чтобы избежать лишних вызовов. - Регулярно проверяйте и очищайте устаревшие события cron с помощью плагинов типа WP Crontrol или вручную через базу данных.
Сравнение вариантов запуска cron задач в WordPress
| Вариант | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Встроенный WP-Cron | Не требует настройки сервера, прост в использовании | Зависит от посещаемости сайта, может не сработать вовремя | Сайты с хорошим трафиком и простыми задачами |
| Системный cron (через crontab) | Надежный, запускается в точное время | Требует доступа к серверу и настроек | Сайты с низкой посещаемостью или критичными задачами |