wpmail.ru wordpress WP Mail

Как использовать WP-Cron для автоматизации задач в WordPress

WP-Cron — это встроенная в WordPress система планирования задач, которая позволяет запускать определённые действия по расписанию. В отличие от классического cron на сервере, WP-Cron срабатывает при посещении сайта, что делает его удобным и в то же время накладывает свои ограничения. В этой статье мы подробно рассмотрим, как правильно использовать WP-Cron для автоматизации задач, какие бывают типы cron-задач, как создавать свои события, а также приведём практические примеры с кодом.

Что такое WP-Cron и как он работает

WP-Cron — это имитация системы планировщика cron, встроенная в ядро WordPress. Она позволяет запускать задачи в определённое время или с определённым интервалом. Но в отличие от системного cron, WP-Cron не запускается автоматически по времени, а срабатывает при посещении сайта, то есть когда кто-то открывает страницу. Это важно понимать, потому что если у сайта мало посетителей, задачи могут запускаться с задержками.

Основные особенности WP-Cron:

  • Запускается при загрузке страницы (frontend или backend);
  • Позволяет планировать повторяющиеся и одноразовые задачи;
  • Все задачи хранятся в базе данных в таблице wp_options (опция cron);
  • Можно создавать и удалять задачи программно;
  • Имеет ограничения по времени запуска и задержкам, если нет посещений.

WP-Cron подходит для большинства задач, связанных с автоматизацией в WordPress, например, отправка писем, обновление данных, синхронизация и т.д.

Как создавать и планировать задачи с помощью WP-Cron

Для работы с WP-Cron есть несколько основных функций:

  • wpmail_schedule_event() — планирует событие;
  • wpmail_unschedule_event() — отменяет запланированное событие;
  • wpmail_cron_hook_callback() — функция-обработчик, которая выполнится при срабатывании события.

Рассмотрим пример создания повторяющейся задачи, которая будет выполняться каждые 10 минут и выводить лог в файл.

Шаг 1. Регистрируем событие при активации плагина или темы

function wpmail_activate_cron_job() {
    if (! wp_next_scheduled('wpmail_custom_cron_hook')) {
        wp_schedule_event(time(), 'ten_minutes', 'wpmail_custom_cron_hook');
    }
}
register_activation_hook(__FILE__, 'wpmail_activate_cron_job');

Здесь мы проверяем, не запланировано ли событие с хуком wpmail_custom_cron_hook, и если нет — создаём его с интервалом ten_minutes.

Шаг 2. Регистрируем интервал в десять минут

function wpmail_add_cron_interval($schedules) {
    $schedules['ten_minutes'] = [
        'interval' => 600, // 600 секунд = 10 минут
        'display' => __('Каждые 10 минут')
    ];
    return $schedules;
}
add_filter('cron_schedules', 'wpmail_add_cron_interval');

По умолчанию в WordPress нет интервала 10 минут, поэтому добавляем его через фильтр cron_schedules.

Шаг 3. Создаём функцию-обработчик задачи

function wpmail_custom_cron_hook_callback() {
    $log_file = WP_CONTENT_DIR . '/wpmail-cron.log';
    $message = date('Y-m-d H:i:s') . " - WP-Cron сработал\n";
    file_put_contents($log_file, $message, FILE_APPEND);
}
add_action('wpmail_custom_cron_hook', 'wpmail_custom_cron_hook_callback');

Эта функция будет записывать в файл лог о срабатывании задачи.

Как отменить планирование и очистить задачи

Чтобы удалить запланированное событие, например, при деактивации плагина, нужно использовать функцию wp_clear_scheduled_hook():

function wpmail_deactivate_cron_job() {
    wp_clear_scheduled_hook('wpmail_custom_cron_hook');
}
register_deactivation_hook(__FILE__, 'wpmail_deactivate_cron_job');

Это гарантирует, что при удалении плагина не останется висящих cron-задач, которые могут вызывать ошибки или нагрузку.

Практические советы по работе с WP-Cron

1. Используйте системный cron для вызова WP-Cron

Если вы хотите, чтобы задачи запускались точно по времени, вместо запуска WP-Cron при каждом посещении, настройте системный cron на сервере, который будет обращаться к специальному URL WordPress:

wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Выключите стандартный WP-Cron, добавив в wp-config.php:

define('DISABLE_WP_CRON', true);

Так задачи будут запускаться стабильно без зависимости от посетителей.

2. Не создавайте слишком частые задачи

Интервалы менее 5 минут не рекомендуются, чтобы не нагружать сервер. Если нужна высокая частота, лучше использовать системный cron и оптимизировать логику задач.

3. Следите за ошибками и логами

Записывайте в логи результаты выполнения задач, чтобы отслеживать их корректность. Можно использовать плагины для мониторинга cron, например, WP Crontrol.

Полезные плагины для работы с WP-Cron

  • WP Crontrol — позволяет просматривать, редактировать и удалять запланированные задачи через админку.
  • Cron Manager — удобный интерфейс для управления cron-задачами и их логами.
  • Advanced Cron Manager — расширенный набор инструментов для контроля и отладки cron.

Эти плагины полезны для отладки и контроля, особенно если вы создаёте свои задачи.

Пример: автоматическая очистка устаревших записей через WP-Cron

Допустим, нам нужно регулярно удалять записи из кастомной таблицы старше 30 дней. Вот пример реализации:

function wpmail_cleanup_old_records() {
    global $wpdb;
    $table = $wpdb->prefix . 'wpmail_custom_data';
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));
    $wpdb->query($wpdb->prepare("DELETE FROM $table WHERE created_at < %s", $date));
}

function wpmail_schedule_cleanup() {
    if (! wp_next_scheduled('wpmail_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'wpmail_cleanup_hook');
    }
}
add_action('wpmail_cleanup_hook', 'wpmail_cleanup_old_records');
add_action('init', 'wpmail_schedule_cleanup');

Этот код добавляет ежедневную задачу, которая удаляет устаревшие данные из таблицы. Очень полезно для автоматической поддержки чистоты базы данных.

×
WPRemark
Внимание Внимание Внимание Внимание
-15%

на WPRemark плагин WordPress

Прокачай свой сайт! ⋙