Автоматизация задач в WordPress — важная часть поддержки и расширения функционала сайта. WP-Cron — встроенный механизм планировщика, который позволяет запускать функции в определённое время или с заданной периодичностью. В этой статье разберём, как правильно создавать, регистрировать и управлять автоматическими заданиями с помощью функции wp_schedule_event, а также рассмотрим типичные ошибки и способы их решения.
Что такое WP-Cron и как он работает
WP-Cron — это псевдо-системный планировщик задач WordPress. В отличие от системного cron на сервере, WP-Cron запускается не по времени, а при заходе посетителя на сайт. Это означает, что если на сайт не заходят, запланированные задачи не выполняются вовремя. Однако для большинства сайтов этого достаточно.
WP-Cron позволяет регистрировать задачи, которые будут запускаться через определённый интервал или в определённое время. Функция wp_schedule_event служит для регистрации таких событий.
Основные преимущества WP-Cron:
- Не требуется доступ к серверу или системному cron.
- Легко создавать и управлять задачами через код или плагины.
- Интеграция с ядром WordPress и API.
Регистрация и создание задачи через wp_schedule_event
Чтобы создать автоматическую задачу, нужно зарегистрировать событие с помощью wp_schedule_event. Синтаксис следующий:
wp_schedule_event( int $timestamp, string $recurrence, string $hook, array $args = array() )Где:
$timestamp— время первого запуска в формате UNIX timestamp;$recurrence— периодичность, например, 'hourly', 'daily', 'twicedaily' или пользовательский интервал;$hook— имя хука, который будет вызван при выполнении задачи;$args— аргументы для хука (необязательно).
Пример простой регистрации задачи, которая будет запускаться раз в час:
function wpin_register_hourly_event() {
if ( ! wp_next_scheduled( 'wpin_hourly_event_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpin_hourly_event_hook' );
}
}
add_action( 'wp', 'wpin_register_hourly_event' );Здесь мы проверяем, не запланировано ли уже событие с таким хуком, и если нет — создаём его. Обратите внимание, что вызываем функцию при событии wp, чтобы WordPress загрузился полностью.
Обработка события — добавляем хук
Далее нужно добавить функцию-обработчик, которая будет выполняться по расписанию:
function wpin_hourly_event_function() {
// Ваш код, например, очистка кеша, отправка отчетов и т.д.
error_log('WPIN: Ежечасное задание выполнено');
}
add_action( 'wpin_hourly_event_hook', 'wpin_hourly_event_function' );В этом примере при запуске задачи в лог будет записываться строка. На практике сюда можно поместить любую логику.
Добавление собственного интервала повторения
Стандартные интервалы — 'hourly', 'twicedaily' (каждые 12 часов), 'daily'. Если вам нужно другое расписание, например, раз в 10 минут, то придется добавить свой интервал:
function wpin_custom_cron_schedules( $schedules ) {
if ( ! isset( $schedules['every_ten_minutes'] ) ) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => 'Каждые 10 минут'
);
}
return $schedules;
}
add_filter( 'cron_schedules', 'wpin_custom_cron_schedules' );Теперь можно использовать 'every_ten_minutes' в wp_schedule_event:
wp_schedule_event( time(), 'every_ten_minutes', 'wpin_ten_minute_event_hook' );Отмена и удаление запланированных задач
Иногда нужно отменить запланированное событие, например, при деактивации плагина. Для этого используется функция wp_clear_scheduled_hook:
function wpin_clear_scheduled_events() {
wp_clear_scheduled_hook( 'wpin_hourly_event_hook' );
wp_clear_scheduled_hook( 'wpin_ten_minute_event_hook' );
}
register_deactivation_hook( __FILE__, 'wpin_clear_scheduled_events' );Это удалит все запланированные вызовы хука, что предотвратит дальнейшее выполнение задачи.
Практические советы по работе с WP-Cron
1. Используйте wp_next_scheduled для проверки
Перед планированием нового события обязательно проверьте, не запланировано ли оно уже, чтобы избежать дублей.
2. Помните о запуске WP-Cron
WP-Cron запускается при посещении сайта. Для сайтов с низкой посещаемостью можно настроить системный cron, который обращается к wp-cron.php, чтобы задачи выполнялись точно вовремя. Пример командной строки для Linux:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&13. Логируйте действие для отладки
При разработке полезно писать сообщения в лог с помощью error_log или использовать плагины для мониторинга cron-задач.
4. Не перегружайте WP-Cron тяжёлыми задачами
Если задача требует длительной обработки, лучше использовать очередь задач или внешние сервисы, чтобы не замедлять работу сайта.
Пример: Автоматическая очистка старых ревизий постов
Рассмотрим задачу, которая еженедельно удаляет старые ревизии постов, чтобы экономить место в базе данных.
function wpin_cleanup_post_revisions() {
global $wpdb;
$days = 30; // удалять ревизии старше 30 дней
$timestamp = current_time( 'mysql', 1 );
$sql = $wpdb->prepare(
"DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < DATE_SUB(%s, INTERVAL %d DAY)",
$timestamp, $days
);
$deleted = $wpdb->query( $sql );
if ( $deleted !== false ) {
error_log("WPIN: Удалено $deleted старых ревизий");
}
}
function wpin_schedule_weekly_cleanup() {
if ( ! wp_next_scheduled( 'wpin_weekly_cleanup_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'wpin_weekly_cleanup_hook' );
}
}
add_action( 'wp', 'wpin_schedule_weekly_cleanup' );
add_action( 'wpin_weekly_cleanup_hook', 'wpin_cleanup_post_revisions' );Этот код добавит еженедельное задание по удалению ревизий старше 30 дней и логирует результат.
Рекомендованные плагины для работы с WP-Cron
Если не хотите писать код вручную, можно использовать плагины, которые помогают управлять cron-задачами:
- WP Crontrol — мощный инструмент для просмотра, редактирования, удаления и добавления cron-задач через админку.
- Clearfy Pro — оптимизационный плагин, который умеет управлять и отключать ненужные cron-задания, улучшая производительность.
Выводы и лучшие практики
WP-Cron — мощный инструмент для автоматизации задач в WordPress, но требует аккуратного использования. Всегда проверяйте наличие запланированных событий, не создавайте дубли, используйте пользовательские интервалы при необходимости и не забывайте очищать задачи при деактивации плагинов.
Для комплексного контроля рекомендуем использовать плагин WP Crontrol, а для оптимизации — Clearfy Pro. Если сервер позволяет, настройте системный cron для более точного запуска задач.
Следуя этим рекомендациям, вы сможете эффективно автоматизировать рутинные задачи и улучшить производительность вашего сайта на WordPress.