Что такое WP-Cron и зачем он нужен
WP-Cron — встроенный механизм планировщика задач в WordPress, который позволяет запускать отложенные или регулярные действия без необходимости обращаться к системному cron на сервере. Это удобно для автоматизации рутинных процессов: очистки базы, отправки писем, обновления данных и т.п.
Диагностика проблем с WP-Cron
Частая проблема — задачи WP-Cron не выполняются вовремя или не запускаются вовсе. Основные причины:
- Отсутствие посещений сайта — WP-Cron запускается только при загрузке страниц. Если трафика мало, задачи не выполняются.
- Отключен WP-Cron в конфигурации (define('DISABLE_WP_CRON', true);)
- Конфликты с плагинами или темами, мешающие корректной работе расписания.
- Ошибки в самих хуках и callback-функциях.
Проверить наличие запланированных задач можно через плагин WP Crontrol или программно:
if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
echo 'Задача не запланирована';
} else {
echo 'Задача запланирована';
}Как правильно создать и зарегистрировать задачу в WP-Cron
Для примера создадим задачу, которая будет ежедневно чистить таблицу опциональных логов в базе данных.
1. Добавляем интервал в расписание (если нужно нестандартный)
add_filter( 'cron_schedules', function( $schedules ) {
if ( ! isset( $schedules['daily'] ) ) {
$schedules['daily'] = [
'interval' => 86400, // 24 часа
'display' => __( 'Ежедневно' ),
];
}
return $schedules;
});2. Регистрируем событие при активации плагина или темы
register_activation_hook( __FILE__, function() {
if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
wp_schedule_event( time(), 'daily', 'my_custom_cron_hook' );
}
});3. Удаляем событие при деактивации
register_deactivation_hook( __FILE__, function() {
$timestamp = wp_next_scheduled( 'my_custom_cron_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'my_custom_cron_hook' );
}
});4. Добавляем callback-функцию для выполнения задачи
add_action( 'my_custom_cron_hook', function() {
global $wpdb;
$table = $wpdb->prefix . 'custom_logs';
$deleted = $wpdb->query( "DELETE FROM $table WHERE log_date < DATE_SUB(NOW(), INTERVAL 30 DAY)" );
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log( "Очистка логов: удалено записей - $deleted" );
}
});Переход на системный cron для надежности
Если на вашем сайте низкий трафик или важна точность запуска задач, рекомендуется отключить запуск WP-Cron при загрузке страниц и настроить системный cron на сервере:
- В
wp-config.phpдобавьте:define('DISABLE_WP_CRON', true); - Добавьте в крон-сервере (crontab) задачу, которая будет запускать WP-Cron каждые 5-10 минут:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Замените https://example.com на адрес вашего сайта.
Проверка результата работы cron-задачи
Чтобы убедиться, что задача работает:
- Проверьте наличие задачи в
wp-cron.phpчерез WP Crontrol или код. - Добавьте в callback функцию
error_log()для логирования выполнения. - Проверьте логи сервера, если настроен системный cron.
- Тестируйте вручную запуск задачи с помощью:
do_action( 'my_custom_cron_hook' );Частые ошибки при работе с WP-Cron и их исправления
- Ошибка: Задача не запускается из-за отключенного WP-Cron.
Решение: Убедитесь, что вwp-config.phpнет или отключена константаDISABLE_WP_CRON. - Ошибка: Низкий трафик и задачи не выполняются.
Решение: Настройте системный cron на сервере. - Ошибка: Callback-функция вызывает ошибки и прерывает выполнение.
Решение: Оберните код в try-catch или добавьте проверку данных, используйтеerror_logдля отладки. - Ошибка: Несоответствие интервалов повторного запуска.
Решение: Проверьте регистрацию интервалов через фильтрcron_schedules.
Практические советы по безопасности и производительности WP-Cron
- Ограничьте доступ к
wp-cron.phpпо IP, если используете системный cron, чтобы исключить сторонние запросы. - Избегайте тяжелых и долгих операций в cron-задачах — лучше разбивать задачи на части.
- Используйте transient API для кеширования результатов, если задачи повторяются с небольшими изменениями.
- Регулярно проверяйте и очищайте устаревшие задачи через WP Crontrol.
Сравнение способов запуска cron-задач в WordPress
| Метод | Плюсы | Минусы |
|---|---|---|
| Встроенный WP-Cron (по загрузке страниц) | Простота, не требует настройки сервера | Зависимость от трафика, задержки в запуске |
| Системный cron + WP-Cron отключен | Точный и надежный запуск, меньше нагрузки на сайт | Требует доступа к серверу и настройки crontab |
| Плагины для управления задачами (например, WP Crontrol) | Удобный интерфейс, мониторинг и управление | Дополнительная нагрузка, зависит от WP-Cron |