Как автоматически удалять старые посты или записи в WordPress через Cron

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

Что такое WP-Cron и почему использовать его для удаления записей

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

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

Однако, WP-Cron имеет свои ограничения: задачи запускаются только при посещении сайта, поэтому на сайтах с низкой посещаемостью задача может сработать с задержкой. Если нужна точность, лучше настроить системный cron на сервере и вызывать WP-Cron вручную.

Как настроить автоматическое удаление старых записей в WordPress

Создаем функцию удаления старых записей

Для начала напишем функцию, которая будет искать и удалять записи старше определенного количества дней. В этом примере удалим посты стандартного типа 'post', опубликованные более 30 дней назад.

function wproot_delete_old_posts() {
    $days = 30; // количество дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true); // true — для безвозвратного удаления
        }
    }
}

Эта функция извлекает ID постов, опубликованных более 30 дней назад, и удаляет их без возможности восстановления (обход корзины).

Регистрируем Cron-задачу для регулярного запуска

Теперь нужно создать задачу, которая будет запускаться, например, ежедневно. Для этого добавим событие в WordPress Cron и привяжем к нему нашу функцию.

function wproot_schedule_delete_old_posts() {
    if (!wp_next_scheduled('wproot_daily_delete_old_posts')) {
        wp_schedule_event(time(), 'daily', 'wproot_daily_delete_old_posts');
    }
}
add_action('wp', 'wproot_schedule_delete_old_posts');

add_action('wproot_daily_delete_old_posts', 'wproot_delete_old_posts');

Здесь мы проверяем, запланировано ли уже событие 'wproot_daily_delete_old_posts'. Если нет — создаем ежедневный запуск. Затем привязываем этот хук к функции удаления.

Отмена Cron-задачи

Если нужно отменить задачу, используйте следующий код:

function wproot_unschedule_delete_old_posts() {
    $timestamp = wp_next_scheduled('wproot_daily_delete_old_posts');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wproot_daily_delete_old_posts');
    }
}

Удаление кастомных типов записей и дополнительные фильтры

Если у вас есть кастомные типы записей, например 'product' или 'event', и их тоже нужно удалять по возрасту, просто замените параметр 'post_type' в функции на нужный тип.

Например, удалим кастомные записи 'event' старше 60 дней:

function wproot_delete_old_events() {
    $days = 60;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'event',
        'post_status'    => 'publish',
        'date_query'     => array(
            array('before' => $date, 'inclusive' => true),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_events = get_posts($args);

    foreach ($old_events as $post_id) {
        wp_delete_post($post_id, true);
    }
}

Для запуска этой функции через WP-Cron достаточно добавить аналогичное расписание, как в предыдущем примере.

Можно добавить дополнительные фильтры, например, удалять только записи с определенной категорией или меткой, используя параметры 'category_name' или 'tax_query' в WP_Query.

Полезные плагины для управления WP-Cron и удалением записей

Если вы не хотите писать код самостоятельно, можно использовать плагины, которые помогут управлять Cron-задачами и фильтровать контент для удаления:

  • WP Crontrol — позволяет просматривать, редактировать и создавать Cron-задачи через админку.
  • Clearfy Pro — расширенный инструмент для оптимизации и очистки WordPress, включая управление ревизиями и устаревшими записями.

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

Рекомендации по безопасности и производительности

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

Для сайтов с большой базой данных и большим количеством записей рекомендуем использовать постраничный подход к удалению — удалять записи партиями по 50-100 штук, чтобы не перегружать сервер.

function wproot_delete_old_posts_batch() {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array('before' => $date, 'inclusive' => true),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 50,
    );

    $old_posts = get_posts($args);

    if (empty($old_posts)) {
        return;
    }

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
    }
}

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

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать WP-CLI для управления WordPress с консоли: подробное руководство
07.12.2025
Как добавить и сохранить кастомное поле пользователя при регистрации в WordPress
26.02.2026
Как использовать WPRemark для автоматического отзыва в комментариях WordPress
01.04.2026
Как избежать конфликтов между плагинами WordPress: практические советы и примеры
16.12.2025
Как изменить URL выдачи поисковой формы WordPress без плагинов
26.03.2026
×
WordPress
прокачай свой сайт!

-20% на премиум темы и плагины

Сделай апгрейд сайта ⋙