Автоматическое изменение статуса статей в WordPress через WP-Cron

Диагностика проблемы: зачем менять статус статей автоматически

В ряде проектов на WordPress возникает необходимость автоматически менять статус статей, например, переводить их в черновик или архив через определённое время после публикации. Это актуально для новостных сайтов, где устаревшая информация должна быть скрыта или обновлена. Без автоматизации приходится делать это вручную, что неудобно и ошибочно.

Что такое WP-Cron и как он помогает в задаче

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

Ограничения WP-Cron

  • Запускается только при заходе на сайт, если нет внешних вызовов — задачи могут задерживаться.
  • Для высокой точности рекомендуют настраивать системный cron на сервере для вызова wp-cron.php.

Пошаговое решение: код для автоматической смены статуса статей

Ниже пример кода, который раз в сутки переводит все статьи, опубликованные более 30 дней назад, в статус черновика.

// Регистрируем собственное событие при инициализации темы или плагина
add_action('wp', function() {
    if (!wp_next_scheduled('auto_change_post_status')) {
        wp_schedule_event(time(), 'daily', 'auto_change_post_status');
    }
});

// Функция, которая меняет статус постов
add_action('auto_change_post_status', function() {
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_posts = get_posts($args);

    foreach ($old_posts as $post_id) {
        // Меняем статус на черновик
        wp_update_post([
            'ID'          => $post_id,
            'post_status' => 'draft',
        ]);
    }
});

// При деактивации плагина или темы очистить запланированное событие
register_deactivation_hook(__FILE__, function() {
    $timestamp = wp_next_scheduled('auto_change_post_status');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'auto_change_post_status');
    }
});

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

  • В админке зайдите в «Записи» и отфильтруйте по статусу «Черновик» — появятся записи, которым больше 30 дней.
  • Используйте плагин «WP Crontrol» для просмотра и управления расписанием WP-Cron, чтобы убедиться, что событие запланировано.
  • Для отладки добавьте временный лог в функцию, например:
    error_log('Пост ID ' . $post_id . ' переведён в черновик');
    после wp_update_post.

Частые ошибки и как их исправить

  • Задача не запускается: проверьте, что на сайте есть посещения — WP-Cron запускается при загрузке страницы. Для стабильности настройте системный cron: wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1 с периодичностью в 15 минут.
  • Посты не меняют статус: убедитесь, что функция wp_update_post вызывается корректно и у пользователя, под которым работает скрипт, есть права на редактирование постов.
  • Много ресурсов уходит на запросы: если постов очень много, разбивайте выборку на порции с пагинацией (например, по 100 постов за раз) и запускайте задачу чаще.

Практические советы по безопасности и производительности

  • Для безопасности ограничьте возможность запуска функции только из WP-Cron, без прямого вызова по URL.
  • Планируйте задачи в не пиковые часы, чтобы снизить нагрузку на сервер.
  • Кешируйте результаты запросов, если используете подобные выборки часто.
  • Регулярно очищайте старые запланированные задачи через wp_unschedule_event, чтобы не накапливались дубликаты.

Сравнение вариантов реализации автоматической смены статуса

ВариантПлюсыМинусы
WP-Cron + код в functions.phpПростота, гибкость, не требует плагиновЗависит от посещаемости сайта, возможны задержки
Системный cron + вызов wp-cron.phpТочная периодичность, высокая надёжностьТребует доступа к серверу и настройки
Плагины для планирования задач (например, WP Crontrol)Удобный интерфейс, визуальный контрольДополнительный плагин, возможный оверхед
Как удалить неиспользуемые шорткоды в WordPress: практическое руководство
07.04.2026
Как избежать конфликтов между премиум-плагинами WooCommerce: практическое руководство
04.05.2026
Как использовать WordPress Transients для эффективного кэширования данных
07.02.2026
WooCommerce: как автоматически изменять статус заказа по времени
26.06.2026
Как создать автоматический импорт новостей из внешнего API в WordPress
16.03.2026