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

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

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

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

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

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

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

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

Пример кода для удаления записей старше 30 дней

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wpmax_delete_old_posts() {
    $days = 30; // Удалять записи старше 30 дней
    $date_query = array(
        array(
            'column' => 'post_date',
            'before' => "$days days ago"
        ),
    );

    $old_posts = get_posts(array(
        'date_query' => $date_query,
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true); // true — удалить без отправки в корзину
    }
}

function wpmax_schedule_old_posts_deletion() {
    if (!wp_next_scheduled('wpmax_delete_old_posts_hook')) {
        wp_schedule_event(time(), 'daily', 'wpmax_delete_old_posts_hook');
    }
}
add_action('wpmax_delete_old_posts_hook', 'wpmax_delete_old_posts');
add_action('wp', 'wpmax_schedule_old_posts_deletion');

Этот код создаёт ежедневное задание, которое удаляет все опубликованные записи старше 30 дней. Если хотите изменить период, корректируйте переменную $days.

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

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

// Временно для теста
add_action('init', 'wpmax_delete_old_posts');

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

Использование плагинов для удаления старых записей

Если не хотите писать код, используйте готовые плагины. Вот несколько популярных вариантов:

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

Все плагины можно найти и установить через официальный репозиторий WordPress или приобрести на WPSHOP.ru.

Удаление старых записей конкретного типа (кастомных типов записей)

Если у вас есть кастомные типы записей, например, 'event' или 'offer', и нужно удалить устаревшие именно их, измените параметр post_type в запросе:

function wpmax_delete_old_custom_posts() {
    $days = 60; // Удаляем записи старше 60 дней
    $date_query = array(
        array(
            'column' => 'post_date',
            'before' => "$days days ago"
        ),
    );

    $old_custom_posts = get_posts(array(
        'date_query' => $date_query,
        'post_type' => 'event', // замените на ваш тип записи
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

    foreach ($old_custom_posts as $post_id) {
        wp_delete_post($post_id, true);
    }
}
add_action('wpmax_delete_old_custom_posts_hook', 'wpmax_delete_old_custom_posts');

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

Этот код аналогичен предыдущему, но удаляет записи другого типа и с другим сроком давности.

Важные моменты и советы по безопасности

Автоматическое удаление данных — операция необратимая, поэтому рекомендуется:

  • Создавать резервные копии базы данных перед запуском автоматических задач;
  • Тестировать код на тестовом сайте или в локальной среде;
  • Использовать параметр wp_delete_post с $force_delete = true, если хотите полностью удалить записи без помещения в корзину. Иначе записи можно будет восстановить из корзины;
  • Добавлять проверки и логи для отслеживания удаления, например, запись в отдельный файл или таблицу логов;
  • Если используете плагин, выбирайте проверенные и обновляемые решения.

Расширение функционала: уведомления после удаления

Для удобства можно добавить отправку уведомления администратору после удаления постов. Например, так:

function wpmax_notify_admin_after_deletion($deleted_ids) {
    $admin_email = get_option('admin_email');
    $count = count($deleted_ids);
    $subject = "Удалено $count старых записей на сайте";
    $message = "Были автоматически удалены записи с ID: " . implode(', ', $deleted_ids);
    wp_mail($admin_email, $subject, $message);
}

function wpmax_delete_old_posts_with_notification() {
    $days = 30;
    $date_query = array(
        array('column' => 'post_date', 'before' => "$days days ago"),
    );
    $old_posts = get_posts(array(
        'date_query' => $date_query,
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

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

    if (!empty($old_posts)) {
        wpmax_notify_admin_after_deletion($old_posts);
    }
}

add_action('wpmax_delete_old_posts_hook', 'wpmax_delete_old_posts_with_notification');

Так вы будете всегда в курсе, когда и какие записи были удалены.

Как создать собственный тип записей в WordPress с примерами кода
05.01.2026
Как создать собственный шорткод в WordPress
23.11.2025
Как удалить версию WordPress из HTML и REST API для повышения безопасности
26.12.2025
Как автоматизировать создание резервных копий WordPress с помощью WPMax
23.01.2026
WooCommerce: как исключить товар из каталога и поиска без удаления
01.06.2026