Как автоматизировать удаление старого контента по таксономиям в WordPress

Ведение сайта WordPress нередко требует регулярного очищения устаревшего контента. Особенно это актуально, если на вашем ресурсе используются таксономии, например, категории или метки, для структурирования записей. В этой статье подробно разберём, как автоматизировать удаление старого контента именно по таксономиям, используя PHP-код и поддерживая безопасность сайта.

Почему важно удалять старый контент по таксономиям

Удаление устаревших записей помогает сохранять базу данных в оптимальном состоянии, ускорять работу сайта и улучшать индексирование поисковиками. Если просто удалять по дате, можно нечаянно удалить важные материалы, относящиеся к определённым темам. Поэтому фильтрация по таксономиям позволяет более тонко контролировать процесс.

Например, если у вас есть таксономия «новости» и «обзоры», вы можете настроить удаление новостей старше 1 года, а обзоры сохранять дольше.

Подготовка к автоматизации удаления

Перед любыми действиями с удалением необходимо:

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

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

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

Ниже приведён пример функции, которая удаляет все записи, относящиеся к заданной таксономии, старше определённой даты.

function wpcource_delete_old_posts_by_taxonomy() {
    $taxonomy = 'category'; // Замените на нужную таксономию
    $term_slug = 'novosti'; // Слаг термина таксономии
    $days = 365; // Удалять записи старше 365 дней

    $date_query = array(
        array(
            'column' => 'post_date',
            'before' => date('Y-m-d', strtotime("-{$days} days"))
        ),
    );

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'date_query' => $date_query,
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $term_slug,
            ),
        ),
        'fields' => 'ids',
        'post_status' => 'publish',
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $post_id) {
            wp_delete_post($post_id, true); // true — удалить без возможности восстановления
        }
    }
}

В этом коде мы ищем все опубликованные записи, относящиеся к категории с слагом novosti, которым больше 365 дней, и удаляем их без возможности восстановления.

Автоматизация с WP Cron

Чтобы запускать функцию регулярно, например, раз в сутки, добавим планировщик.

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

add_action('wpcource_daily_old_posts_deletion', 'wpcource_delete_old_posts_by_taxonomy');

Этот код регистрирует ежедневное событие, которое будет запускать функцию удаления.

Разделение удаления по разным таксономиям

Если нужно удалять по нескольким таксономиям с разными условиями, можно расширить функцию и использовать массив настроек.

function wpcource_delete_old_posts_multiple_taxonomies() {
    $settings = array(
        array('taxonomy' => 'category', 'term' => 'novosti', 'days' => 365),
        array('taxonomy' => 'category', 'term' => 'obzory', 'days' => 730),
    );

    foreach ($settings as $setting) {
        $date_query = array(
            array(
                'column' => 'post_date',
                'before' => date('Y-m-d', strtotime("-{$setting['days']} days"))
            ),
        );

        $args = array(
            'post_type' => 'post',
            'posts_per_page' => -1,
            'date_query' => $date_query,
            'tax_query' => array(
                array(
                    'taxonomy' => $setting['taxonomy'],
                    'field' => 'slug',
                    'terms' => $setting['term'],
                ),
            ),
            'fields' => 'ids',
            'post_status' => 'publish',
        );

        $query = new WP_Query($args);

        if (!empty($query->posts)) {
            foreach ($query->posts as $post_id) {
                wp_delete_post($post_id, true);
            }
        }
    }
}

Использование плагинов для управления удалением

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

  • Delete Posts By Date — позволяет удалять посты по дате и категориям через интерфейс.
  • WP Bulk Delete — мощный плагин с возможностью фильтрации по таксономиям и дате, поддерживает планирование удаления.

Эти плагины можно найти на wpshop.ru с подробными инструкциями по установке и настройке.

Советы по безопасности и оптимизации

Перед тем как автоматизировать удаление:

  • Обязательно делайте резервные копии базы данных.
  • Тестируйте код сначала на тестовом сайте.
  • Используйте wp_delete_post() с параметром true для полного удаления, иначе запись попадёт в корзину.
  • Если записей много, разбивайте удаление на части, чтобы избежать ошибок по времени исполнения.

Пример разбивки удаления по 50 записей за раз:

function wpcource_delete_old_posts_batch() {
    $taxonomy = 'category';
    $term_slug = 'novosti';
    $days = 365;

    $date_query = array(
        array(
            'column' => 'post_date',
            'before' => date('Y-m-d', strtotime("-{$days} days"))
        ),
    );

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 50,
        'date_query' => $date_query,
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $term_slug,
            ),
        ),
        'fields' => 'ids',
        'post_status' => 'publish',
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}

Запускайте эту функцию по Cron с нужной периодичностью, чтобы контролировать нагрузку.

Резюме

Автоматизация удаления старого контента по таксономиям — отличный способ поддерживать порядок на сайте и оптимизировать работу. Используйте приведённые примеры кода как основу и адаптируйте под свои задачи, а при необходимости дополняйте функционал плагинами. Важно тщательно тестировать любые изменения и всегда иметь резервные копии.

Как удалить постоянные редиректы в WordPress: практическое руководство
26.03.2026
Как автоматически удалить старые записи в WordPress по дате
29.03.2026
WordPress: отладка и оптимизация загрузки изображений
06.12.2025
Автоматическое удаление спам комментариев в WordPress
20.12.2025
Уникальные методы защиты админ-панели WordPress от взлома
19.03.2026

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