WP-Cron — это встроенная в WordPress система планировщика задач, которая позволяет запускать определённые функции и скрипты по расписанию. Многие разработчики и владельцы сайтов используют WP-Cron для автоматизации рутинных процессов: от публикации запланированных записей до очистки кеша и отправки уведомлений. В этой статье подробно разберём, как проверить работу WP-Cron, как создавать собственные задачи и как отлаживать их выполнение.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron, которая запускается не по системному расписанию, а во время посещения сайта. Каждый раз, когда кто-то заходит на ваш сайт, WordPress проверяет, есть ли запланированные задачи, которые нужно выполнить, и если да — запускает их.
Это важно понимать, так как при отсутствии посещений задачам не будет когда выполниться. Поэтому WP-Cron подходит для сайтов с регулярным трафиком, но для сайтов с редкими посетителями лучше настроить системный cron, который будет вызывать wp-cron.php по расписанию.
WP-Cron хранит задачи в опциях базы данных и запускает их с помощью хука wp_manual_cron_wp_schedule_event.
Как проверить и отладить WP-Cron
Иногда WP-Cron перестаёт работать — задачи не запускаются, запланированные события не выполняются. Для диагностики и отладки можно использовать несколько методов.
Плагин WP Crontrol для управления задачами
Плагин WP Crontrol — отличный инструмент для просмотра, редактирования и удаления задач WP-Cron прямо из админки WordPress.
- Устанавливаем и активируем плагин.
- В разделе Инструменты > Cron Events видим список запланированных задач.
- Можно запускать задачи вручную, удалять или добавлять собственные.
Это поможет понять, есть ли вообще активные задачи и когда они должны запускаться.
Проверка системного cron
Если сайт на хостинге с поддержкой системного cron, можно настроить вызов скрипта wp-cron.php через системный планировщик. Для этого в корне сайта добавьте в crontab (пример для Linux):
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или с помощью curl:
*/15 * * * * curl https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1При такой настройке в wp-config.php нужно отключить запуск WP-Cron при заходе посетителей, добавив:
define('DISABLE_WP_CRON', true);Как создать собственное событие WP-Cron
Создание собственных задач — стандартная практика для расширения функционала сайта. Рассмотрим пример, как сделать задачу, которая ежедневно будет удалять посты из определённой категории.
Регистрация задачи и расписания
Сначала создадим функцию, которая добавит новое расписание (если нужно) и зарегистрирует событие при активации темы или плагина.
function wpmanual_add_custom_cron_schedule($schedules) {
// Добавляем расписание раз в 24 часа
$schedules['daily_custom'] = array(
'interval' => 86400,
'display' => 'Раз в день'
);
return $schedules;
}
add_filter('cron_schedules', 'wpmanual_add_custom_cron_schedule');
function wpmanual_schedule_custom_event() {
if (!wp_next_scheduled('wpmanual_daily_cleanup')) {
wp_schedule_event(time(), 'daily_custom', 'wpmanual_daily_cleanup');
}
}
add_action('wp', 'wpmanual_schedule_custom_event');Создание функции-обработчика
Теперь опишем функцию, которая будет вызываться по расписанию и удалять посты из категории с ID 5 (пример):
function wpmanual_daily_cleanup_function() {
$args = array(
'category' => 5,
'post_status' => 'publish',
'numberposts' => -1
);
$posts = get_posts($args);
foreach ($posts as $post) {
wp_delete_post($post->ID, true); // Удаляем без возможности восстановления
}
}
add_action('wpmanual_daily_cleanup', 'wpmanual_daily_cleanup_function');Практические советы по работе с WP-Cron
Уменьшаем нагрузку и увеличиваем надёжность выполнения
WP-Cron запускается при посещении сайта, поэтому если трафик низкий, задачи могут не выполниться вовремя. Чтобы избежать этого, рекомендуем:
- Переключиться на системный cron, как описано выше.
- Использовать плагин Clearfy Pro, который оптимизирует работу WP-Cron и помогает отключить лишние задачи.
Обработка ошибок и логирование
Для отладки и контроля полезно вести лог выполнения задач. Добавим простой пример записи в лог файл:
function wpmanual_daily_cleanup_function() {
$log_file = WP_CONTENT_DIR . '/wp-cron-log.txt';
$args = array(
'category' => 5,
'post_status' => 'publish',
'numberposts' => -1
);
$posts = get_posts($args);
foreach ($posts as $post) {
$result = wp_delete_post($post->ID, true);
$message = date('Y-m-d H:i:s') . " - Удалён пост ID: {$post->ID} - Результат: " . ($result ? 'успешно' : 'ошибка') . "\n";
file_put_contents($log_file, $message, FILE_APPEND);
}
}
add_action('wpmanual_daily_cleanup', 'wpmanual_daily_cleanup_function');Так вы сможете отслеживать, когда и какие записи удалялись, и выявлять возможные ошибки.
Использование WP-Cron для интеграций и внешних сервисов
WP-Cron отлично подходит для регулярных запросов к внешним API и обновления данных. Например, с помощью WP-Cron можно создавать автоматический импорт товаров или обновлять курсы валют.
Пример вызова API по расписанию:
function wpmanual_fetch_external_data() {
$response = wp_remote_get('https://api.example.com/data');
if (is_wp_error($response)) {
error_log('Ошибка при получении данных: ' . $response->get_error_message());
return;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if ($data) {
// Обработка и сохранение данных
}
}
add_action('wpmanual_external_data_fetch', 'wpmanual_fetch_external_data');
if (!wp_next_scheduled('wpmanual_external_data_fetch')) {
wp_schedule_event(time(), 'hourly', 'wpmanual_external_data_fetch');
}