WP-Cron — это встроенная в WordPress система имитации планировщика задач, которая позволяет запускать запланированные события без необходимости настраивать системный cron на сервере. Использование WP-Cron помогает автоматизировать рутинные задачи на сайте, такие как публикация отложенных записей, обновление кэша или отправка уведомлений.
Что такое WP-Cron и как он работает
WP-Cron — это псевдо-cron, который срабатывает при посещении сайта. Когда пользователь заходит на сайт, WordPress проверяет, есть ли задачи, срок выполнения которых наступил, и запускает их. Это значит, что WP-Cron не работает постоянно в фоне, а активируется только при заходе посетителя. Из-за этого на сайтах с низкой посещаемостью расписание задач может выполняться с задержками.
Для проверки запланированных задач можно использовать функцию wp_get_scheduled_event() или плагин WP Crontrol.
Создание и регистрация задания в WP-Cron
Чтобы создать собственное запланированное событие, нужно зарегистрировать хук и задать интервал выполнения.
Добавление пользовательского интервала срабатывания
По умолчанию WordPress поддерживает интервалы: hourly (час), twicedaily (два раза в день), daily (ежедневно). Для других интервалов добавим свой:
add_filter('wpcontent_custom_cron_schedules', 'wpcontent_add_custom_cron_interval');
function wpcontent_add_custom_cron_interval($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 5 минут в секундах
'display' => __('Каждые 5 минут')
);
return $schedules;
}Этот фильтр добавляет интервал в 5 минут.
Регистрация события и его обработчика
Далее регистрируем событие и функцию-обработчик:
// При активации плагина или темы
if (!wp_next_scheduled('wpcontent_five_minute_event')) {
wp_schedule_event(time(), 'every_five_minutes', 'wpcontent_five_minute_event');
}
// Хук для выполнения задачи
add_action('wpcontent_five_minute_event', 'wpcontent_do_five_minute_task');
function wpcontent_do_five_minute_task() {
// Здесь логика задачи, например, очистка временных данных
error_log('WP-Cron: выполнена задача каждые 5 минут');
}Здесь wp_schedule_event() планирует задачу, а функция wpcontent_do_five_minute_task() выполняется при срабатывании события.
Отладка и управление WP-Cron
Для удобства мониторинга и управления задачами рекомендуем использовать плагин WP Crontrol. С ним можно просматривать все запланированные события, запускать их вручную, удалять или создавать новые без кода.
Также полезно знать, что WP-Cron может не срабатывать, если на сайте нет посетителей. Для критичных задач лучше настроить системный cron на сервере и отключить WP-Cron, добавив в wp-config.php строку:
define('DISABLE_WP_CRON', true);А затем создать задачу в системном cron, которая будет запускать WP-Cron по URL сайта:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Практические примеры использования WP-Cron
Автоматическое удаление старых записей из пользовательской таблицы
Предположим, у вас есть таблица с логами, и нужно регулярно очищать записи старше 30 дней.
add_action('wpcontent_cleanup_old_logs', 'wpcontent_delete_old_logs');
function wpcontent_delete_old_logs() {
global $wpdb;
$table_name = $wpdb->prefix . 'custom_logs';
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE log_date < %s", $date));
}Задачу можно запланировать, например, на ежедневный запуск:
if (!wp_next_scheduled('wpcontent_cleanup_old_logs')) {
wp_schedule_event(time(), 'daily', 'wpcontent_cleanup_old_logs');
}Отправка email-уведомлений о новых комментариях
Если нужно посылать письмо раз в час с отчетом о новых комментариях, можно собрать комментарии в транзиент и отправлять по расписанию.
Пример хранения новых комментариев:
add_action('comment_post', 'wpcontent_store_new_comment');
function wpcontent_store_new_comment($comment_ID) {
$comments = get_transient('wpcontent_new_comments') ?: array();
$comments[] = $comment_ID;
set_transient('wpcontent_new_comments', $comments, HOUR_IN_SECONDS);
}И отправка письма по расписанию:
add_action('wpcontent_send_comment_report', 'wpcontent_send_comment_report_function');
function wpcontent_send_comment_report_function() {
$comments = get_transient('wpcontent_new_comments');
if (empty($comments)) return;
$message = "Новые комментарии за последний час:\n";
foreach ($comments as $comment_id) {
$comment = get_comment($comment_id);
$message .= "- " . $comment->comment_author . ": " . $comment->comment_content . "\n";
}
wp_mail('admin@example.com', 'Отчет о новых комментариях', $message);
delete_transient('wpcontent_new_comments');
}
if (!wp_next_scheduled('wpcontent_send_comment_report')) {
wp_schedule_event(time(), 'hourly', 'wpcontent_send_comment_report');
}Рекомендации по оптимизации и безопасности WP-Cron
WP-Cron может создавать нагрузку, если задачи тяжелые или слишком частые. Рекомендуется:
- Минимизировать количество однотипных задач.
- Использовать системный cron для критичных и частых задач.
- Отслеживать выполнение через логи и плагины.
- Ограничивать права функций, выполняемых по cron, чтобы избежать уязвимостей.
Также избегайте запуска долгих задач, которые могут превышать лимиты времени PHP.
Заключение
WP-Cron — мощный инструмент автоматизации в WordPress, который при правильной настройке и использовании облегчает управление сайтом и расширяет его функциональность. Благодаря простоте добавления собственных событий и возможности гибкой настройки расписания, он подходит как для новичков, так и для опытных разработчиков.