WP-Cron — это встроенная в WordPress система планирования заданий, которая позволяет запускать определённые функции через заданные интервалы времени. В отличие от классического системного cron, WP-Cron срабатывает при посещении сайта, что порождает ряд особенностей и возможных проблем. В этой статье подробно рассмотрим, как правильно использовать WP-Cron для автоматизации задач, как создавать собственные задания и решать типичные проблемы.
Что такое WP-Cron и как он работает
WP-Cron — это механизм имитации cron-задач в WordPress. Он запускается не по системному времени, а при загрузке любой страницы сайта. Если время для запланированной задачи наступило, WP-Cron запускает её выполнение. Это удобно, так как не требует доступа к серверным настройкам, но при этом зависит от посещаемости сайта.
Преимущества WP-Cron:
- Не требует настройки системного cron или доступа к серверу.
- Прост в использовании и интеграции с WordPress.
- Позволяет запускать задачи с заданной периодичностью.
Недостатки WP-Cron:
- Зависит от трафика сайта — если посетителей мало, задачи могут запускаться с задержкой.
- При высокой нагрузке может запускаться слишком часто, создавая дополнительную нагрузку.
- Не подходит для точного времени выполнения задач.
Как создавать и регистрировать собственные Cron-задачи в WordPress
Для автоматизации различных процессов, например, очистки базы данных, отправки отчетов или обновления данных, нужно создавать свои задачи. Рассмотрим пример создания простой задачи, которая будет запускаться раз в час.
Регистрация интервала времени
WP-Cron по умолчанию поддерживает стандартные интервалы (hourly, twicedaily, daily). Чтобы добавить свой интервал, например, каждые 15 минут, добавьте следующий код в functions.php вашей темы или в плагин:
function wplogin_add_cron_interval($schedules) {
if(!isset($schedules['every_fifteen_minutes'])) {
$schedules['every_fifteen_minutes'] = array(
'interval' => 15 * 60, // 15 минут в секундах
'display' => __('Каждые 15 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wplogin_add_cron_interval');
Регистрация задачи
Теперь зарегистрируем задачу, которая будет срабатывать каждые 15 минут. Для этого используем функцию wp_schedule_event. Важно делать проверку, чтобы задача не регистрировалась несколько раз:
function wplogin_schedule_my_task() {
if (!wp_next_scheduled('wplogin_my_cron_hook')) {
wp_schedule_event(time(), 'every_fifteen_minutes', 'wplogin_my_cron_hook');
}
}
add_action('wp', 'wplogin_schedule_my_task');
Обработка задачи
Теперь привяжем функцию-обработчик к созданному хуку:
function wplogin_my_cron_function() {
// Здесь ваш код, например очистка временных данных
error_log('WP-Cron задача выполнена: ' . date('Y-m-d H:i:s'));
}
add_action('wplogin_my_cron_hook', 'wplogin_my_cron_function');
Как проверить и отладить WP-Cron задачи
Иногда WP-Cron может не запускаться как ожидается. Для диагностики полезны следующие инструменты и приёмы:
- Плагины для управления WP-Cron: например, WP Crontrol. Он позволяет просматривать, запускать, удалять и создавать cron-задачи через админку.
- Логирование: добавляйте в обработчики задач запись в лог, чтобы убедиться, что они выполняются.
- Проверка посещаемости: помните, что WP-Cron не запускается без посещений сайта. Для сайтов с низким трафиком лучше настроить системный cron, который будет вызывать wp-cron.php по расписанию.
Настройка системного cron для запуска WP-Cron
Чтобы избавиться от зависимости от посещаемости, можно отключить встроенный WP-Cron и создать системное задание. Для этого в wp-config.php добавьте:
define('DISABLE_WP_CRON', true);
Далее настройте системный cron на сервере (например, через crontab) для вызова скрипта каждые 15 минут:
*/15 * * * * wget -q -O - https://wplogin.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Или с помощью curl:
*/15 * * * * curl -s https://wplogin.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Так вы обеспечите стабильный запуск задач независимо от посещаемости.
Практические примеры использования WP-Cron
WP-Cron можно использовать для множества задач. Рассмотрим несколько примеров:
Автоматическая очистка корзины WooCommerce
Если у вас интернет-магазин на WooCommerce, можно настроить удаление заброшенных корзин через WP-Cron:
function wplogin_clear_abandoned_cart() {
if (!class_exists('WC_Abstract_Legacy_Order')) return;
global $wpdb;
$time_limit = time() - 60 * 60 * 24; // 24 часа назад
$wpdb->query($wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
$time_limit
));
error_log('Удалены заброшенные сессии корзины: ' . date('Y-m-d H:i:s'));
}
add_action('wplogin_clear_cart_hook', 'wplogin_clear_abandoned_cart');
function wplogin_schedule_clear_cart() {
if (!wp_next_scheduled('wplogin_clear_cart_hook')) {
wp_schedule_event(time(), 'daily', 'wplogin_clear_cart_hook');
}
}
add_action('wp', 'wplogin_schedule_clear_cart');
Отправка ежедневного отчёта администратору
Пример отправки письма с отчётом по базе данных:
function wplogin_send_daily_report() {
$admin_email = get_option('admin_email');
$subject = 'Ежедневный отчёт сайта';
$message = 'Отчёт по сайту на ' . date('Y-m-d') . ': \nПользователей: ' . count_users()['total_users'];
wp_mail($admin_email, $subject, $message);
error_log('Отчёт отправлен: ' . date('Y-m-d H:i:s'));
}
add_action('wplogin_daily_report_hook', 'wplogin_send_daily_report');
function wplogin_schedule_daily_report() {
if (!wp_next_scheduled('wplogin_daily_report_hook')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wplogin_daily_report_hook');
}
}
add_action('wp', 'wplogin_schedule_daily_report');
Полезные плагины для работы с WP-Cron
Для удобного управления и отладки WP-Cron советую обратить внимание на следующие плагины:
- WP Crontrol — просмотр, редактирование, удаление и добавление cron-задач из админки.
- Crony Cronjob Manager — удобный интерфейс для управления задачами и логирования.
- Advanced Cron Manager — расширенные возможности по управлению и мониторингу cron-задач.
Эти инструменты помогут визуально контролировать расписание и быстро находить ошибки.