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

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

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

Ручное удаление старого контента — трудоёмкий процесс, особенно если записей много. Автоматизация позволяет:

  • Поддерживать актуальность контента на сайте.
  • Оптимизировать базу данных и улучшить производительность.
  • Избежать накопления мусора и неактуальных записей.

Кроме того, автоматическое удаление помогает соблюдать внутренние политики контента и требования к хранению данных.

Как определить, какие записи удалять

Первый шаг — чётко определить критерии удаления. Чаще всего это:

  • Тип записи (post, page, кастомные post types).
  • Дата публикации или дата последнего обновления.
  • Статус записи (опубликованная, черновик, на модерации).

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

Пример кода для автоматического удаления записей по типу и дате

Ниже пример функции, которую можно добавить в файл functions.php вашей темы или создать отдельный плагин. Функция удаляет записи типа news, старше 180 дней.

function wp1_delete_old_news_posts() {
    $days = 180; // количество дней
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d', strtotime("-" . $days . " days")),
        'inclusive' => true,
    );
    
    $args = array(
        'post_type' => 'news',
        'post_status' => 'any',
        'date_query' => array($date_query),
        '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 — удаление без отправки в корзину
        }
    }
}

// Запускать по расписанию (cron) можно так:
if (!wp_next_scheduled('wp1_daily_delete_old_news')) {
    wp_schedule_event(time(), 'daily', 'wp1_daily_delete_old_news');
}
add_action('wp1_daily_delete_old_news', 'wp1_delete_old_news_posts');

Эта функция ищет все записи типа news старше 180 дней и удаляет их безвозвратно. Хук wp1_daily_delete_old_news запускает её ежедневно с помощью системного планировщика WordPress — WP-Cron.

Настройка расписания и безопасность

Чтобы функция работала автоматически, нужно убедиться, что WP-Cron активирован и работает корректно. Также можно настроить запуск задачи через системный cron сервера для большей надёжности.

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

foreach ($old_posts as $post_id) {
    error_log('Запись для удаления: ' . $post_id);
}

Только после проверки замените вывод на вызов wp_delete_post().

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

Если нужно удалять записи разных типов с разными сроками хранения, можно создать массив с правилами и обработать их циклом:

function wp1_delete_old_posts_by_types() {
    $rules = array(
        'news' => 180, // 180 дней для новостей
        'event' => 90, // 90 дней для событий
        'review' => 365, // 1 год для отзывов
    );
    
    foreach ($rules as $post_type => $days) {
        $date_query = array(
            'column' => 'post_date',
            'before' => date('Y-m-d', strtotime("-" . $days . " days")),
            'inclusive' => true,
        );
        
        $args = array(
            'post_type' => $post_type,
            'post_status' => 'any',
            'date_query' => array($date_query),
            '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);
            }
        }
    }
}

// Запуск по расписанию
if (!wp_next_scheduled('wp1_daily_delete_old_posts')) {
    wp_schedule_event(time(), 'daily', 'wp1_daily_delete_old_posts');
}
add_action('wp1_daily_delete_old_posts', 'wp1_delete_old_posts_by_types');

Такой подход гибкий и легко расширяемый.

Полезные плагины для автоматизации удаления записей

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

  • Auto Delete Posts — позволяет задавать правила удаления по дате, статусу и типу записи.
  • Clearfy Pro — многофункциональный плагин оптимизации, в том числе с функцией очистки старого контента.

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

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

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

Также рекомендуем:

  • Тестировать функцию на локальной копии сайта.
  • Добавлять логи удаления для контроля.
  • Ограничивать права доступа к функциям удаления.

Так вы избежите случайных потерь контента и обеспечите стабильную работу сайта.

Как избежать конфликтов между WooCommerce и AJAX на отдельных страницах WordPress
29.05.2026
Как удалить пустые мета-данные из базы данных WordPress
16.01.2026
Как удалить удалённые медиафайлы из библиотеки WordPress
04.01.2026
Как создать автоматический отчет о проблемах сайта WordPress
09.01.2026
Как отключить отзывы WooCommerce для отдельных товаров
05.05.2026