Что такое WP-Cron и зачем он нужен в автоматизации WordPress
WP-Cron — встроенный механизм планировщика задач в WordPress. Он позволяет запускать заданные действия по расписанию без необходимости настраивать системный cron на сервере. WP-Cron полезен для автоматических публикаций, очистки базы данных, отправки уведомлений и других повторяющихся процессов.
Особенности WP-Cron
- Запускается при обращении к сайту, а не по реальному времени.
- Зависит от посещаемости: если сайт не посещают, задачи могут задерживаться.
- Поддерживает регистрацию собственных событий и расписаний.
Диагностика проблем с WP-Cron
Частая проблема — задачи WP-Cron не выполняются вовремя или вообще не запускаются. Чтобы проверить, работает ли WP-Cron, используйте следующий код в functions.php или в отдельном плагине:
add_action('wp_footer', function() {
if (wp_next_scheduled('my_test_cron_event')) {
echo 'WP-Cron работает.';
} else {
echo 'WP-Cron не запущен.';
}
});
Или воспользуйтесь плагином WP Crontrol для просмотра и управления задачами.
Пошаговое решение: как добавить и настроить собственную задачу с WP-Cron
1. Регистрируем пользовательский хук и событие
function my_custom_cron_job() {
// Ваш код задачи, например, очистка старых записей
global $wpdb;
$wpdb->query( "DELETE FROM {$wpdb->prefix}posts WHERE post_date < NOW() - INTERVAL 30 DAY AND post_status = 'trash'" );
}
add_action('my_custom_cron_hook', 'my_custom_cron_job');
// Регистрируем событие при активации темы или плагина
if (! wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'daily', 'my_custom_cron_hook');
}
2. Добавляем кастомный интервал (если нужен)
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => 'Каждые 5 минут'
];
return $schedules;
});
// Используем в расписании
if (! wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'every_five_minutes', 'my_custom_cron_hook');
}
Проверка результата после внедрения
Чтобы убедиться, что задача запускается, добавьте в функцию логирование:
function my_custom_cron_job() {
error_log('Cron task fired at ' . current_time('mysql'));
// остальной код
}
Проверьте файл error_log или включите отладку WordPress (define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);) и посмотрите wp-content/debug.log. Можно также вручную запустить cron с помощью WP-CLI:
wp cron event run --due-now
Частые ошибки и как их исправлять
- WP-Cron не запускается при отсутствии трафика: Решение — настроить системный cron на сервере и вызывать WP-Cron вручную через curl или wp-cron.php. Пример команды для cron:
* * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
- Дублирование задач: перед созданием задачи проверяйте, не запланирована ли она уже через
wp_next_scheduled(). - Плохая производительность: избегайте тяжелых операций в cron, разбивайте задачи на части, используйте транзиенты для кеширования результатов.
Практические советы по безопасности и производительности
- Отключите WP-Cron по умолчанию, если настроен системный cron:
define('DISABLE_WP_CRON', true);в wp-config.php. - Используйте WP-CLI для отладки и запуска задач вручную.
- Не храните в задачах чувствительные данные без шифрования.
- Проверяйте коллизии с другими плагинами, которые могут использовать WP-Cron.
Сравнение вариантов запуска cron задач
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Стандартный WP-Cron | Запускается при посещении сайта | Не требует настройки сервера | Зависит от трафика, возможны задержки |
| Системный cron + вызов wp-cron.php | Настраивается на сервере | Точные интервалы, надежность | Требует доступа к серверу и знаний |
| Плагины планировщиков (WP Crontrol) | Управление задачами из админки | Удобство, отладка | Зависит от WP-Cron, могут быть ограничения |