WP-Cron — встроенный механизм планировщика задач в WordPress, который позволяет запускать определённые функции по расписанию. Это мощный инструмент для автоматизации управления публикациями: можно автоматически менять статус постов, удалять устаревший контент или обновлять метаданные без вашего участия.
Что такое WP-Cron и как он работает
WP-Cron — это эмуляция системного cron, реализованная на уровне PHP. Он запускается при каждом запросе к сайту, проверяя, есть ли запланированные задачи для выполнения. Если есть — запускает их.
Основное ограничение — выполнение задач зависит от посещаемости сайта. На слабых проектах с низкой посещаемостью это может стать проблемой. Для критичных задач лучше использовать системный cron, который вызывает wp-cron.php по расписанию.
Для автоматизации публикаций WP-Cron позволяет:
- Планировать публикацию или удаление постов;
- Автоматически менять статус публикаций (например, переводить из черновика в опубликованные или в архивные);
- Обновлять метаданные и таксономии по расписанию;
- Отправлять уведомления или запускать кастомные процессы, связанные с постами.
Пример 1. Автоматическое изменение статуса постов по расписанию
Представим, что нужно автоматически переводить публикации с определённой категорией в статус «черновик» через 30 дней после публикации. Это удобно, когда в блоге есть временные акции или устаревающие новости.
Для реализации создадим функцию и зарегистрируем задачу WP-Cron.
Шаг 1. Регистрируем событие при активации темы или плагина:
function wpteam_activate_cron() {
if (!wp_next_scheduled('wpteam_auto_draft_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpteam_auto_draft_old_posts');
}
}
register_activation_hook(__FILE__, 'wpteam_activate_cron');Это добавляет ежедневное событие wpteam_auto_draft_old_posts.
Шаг 2. Отменяем событие при деактивации:
function wpteam_deactivate_cron() {
wp_clear_scheduled_hook('wpteam_auto_draft_old_posts');
}
register_deactivation_hook(__FILE__, 'wpteam_deactivate_cron');Шаг 3. Создаем функцию-обработчик:
function wpteam_auto_draft_old_posts_func() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'category_name' => 'vremennye-akcii',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'draft'
));
}
wp_reset_postdata();
}
}
add_action('wpteam_auto_draft_old_posts', 'wpteam_auto_draft_old_posts_func');Этот код по расписанию переводит посты из категории «vremennye-akcii» в черновики, если им больше 30 дней.
Пример 2. Автоматическое удаление устаревших постов
Иногда нужно автоматически удалять записи старше определённого срока, например, для очистки блога от неактуального контента.
Для этого создадим похожую функцию, которая будет удалять публикации старше 365 дней.
function wpteam_auto_delete_old_posts_func() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '365 days ago',
),
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
wp_delete_post(get_the_ID(), true);
}
wp_reset_postdata();
}
}
add_action('wpteam_auto_delete_old_posts', 'wpteam_auto_delete_old_posts_func');Не забудьте аналогично зарегистрировать и запланировать событие для wpteam_auto_delete_old_posts с помощью wp_schedule_event.
Пример 3. Обновление метаданных публикаций по расписанию
Задача: обновлять специальное метаполе «views_count» для популярных постов, чтобы сбрасывать счетчик просмотров каждый месяц.
Код решения:
function wpteam_reset_views_count_func() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'views_count',
'compare' => 'EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
update_post_meta(get_the_ID(), 'views_count', 0);
}
wp_reset_postdata();
}
}
add_action('wpteam_reset_views_count', 'wpteam_reset_views_count_func');Запланируйте это событие на ежемесячный запуск через WP-Cron.
Полезные плагины для расширенного управления задачами WP-Cron
Если стандартного функционала WP-Cron не хватает, можно использовать плагины для удобного мониторинга и управления задачами:
- WP Crontrol — позволяет просматривать, редактировать и создавать события WP-Cron из админки.
- Clearfy Pro — комплексный плагин оптимизации, в том числе управляет WP-Cron и может отключать ненужные задачи для ускорения сайта.
Как избежать проблем при работе с WP-Cron
WP-Cron зависит от посещаемости сайта, поэтому на слабых или малопосещаемых проектах задачи могут запускаться с задержками. Для критичных задач советуем настроить системный cron на сервере, вызывающий скрипт wp-cron.php каждые 5–15 минут.
Также не забывайте:
- Проверять, не дублируются ли задачи при повторном добавлении планировщика;
- Обрабатывать ошибки внутри функций, чтобы одна неудачная задача не прерывала остальные;
- Использовать
wp_clear_scheduled_hookпри деактивации плагина или темы, чтобы не оставлять «мертвые» задачи.
Итог
Автоматизация управления публикациями в WordPress с помощью WP-Cron и кода позволяет существенно облегчить рутинные процессы: автоматически архивировать, удалять или обновлять посты по расписанию без участия администратора.
Используйте примеры из статьи как шаблоны для своих задач, адаптируя под конкретные бизнес-процессы. А для удобного управления WP-Cron стоит обратить внимание на плагины WP Crontrol и Clearfy Pro.