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

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

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

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

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

Низкочастотный запрос из поисковых систем

Поисковые запросы типа «автоматически удалить старые записи WordPress шорткод» или «шорткод очистки базы WordPress» встречаются менее часто, чем общие темы, но при этом являются очень практичными для узкой аудитории вебмастеров. В статье мы разберем именно такой запрос.

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

Для начала создадим функцию, которая будет принимать количество дней и удалять записи, опубликованные ранее этого срока. Используем стандартные WP_Query и wp_delete_post.

function wpbit_delete_old_posts_shortcode($atts) {
    // Атрибуты шорткода, по умолчанию 30 дней
    $atts = shortcode_atts(array(
        'days' => 30,
        'post_type' => 'post',
        'category' => '',
        'confirm' => 'no' // требовать подтверждение
    ), $atts, 'delete_old_posts');

    if ($atts['confirm'] !== 'yes') {
        return '<p>Подтвердите удаление, добавив confirm="yes" к шорткоду.</p>';
    }

    $days = intval($atts['days']);
    if ($days <= 0) {
        return '<p>Неверное значение дней.</p>';
    }

    $date_query = array(
        'column' => 'post_date',
        'before' => "$days days ago",
    );

    $args = array(
        'post_type' => $atts['post_type'],
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
        'post_status' => 'any'
    );

    if (!empty($atts['category'])) {
        $args['category_name'] = sanitize_text_field($atts['category']);
    }

    $old_posts = get_posts($args);

    if (empty($old_posts)) {
        return '<p>Записей для удаления не найдено.</p>';
    }

    $deleted_count = 0;
    foreach ($old_posts as $post_id) {
        // Проверяем права пользователя перед удалением
        if (current_user_can('delete_post', $post_id)) {
            wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
            $deleted_count++;
        }
    }

    return "<p>Удалено записей: $deleted_count</p>";
}
add_shortcode('delete_old_posts', 'wpbit_delete_old_posts_shortcode');

Описание кода:

  • Параметр days задает возраст записей для удаления;
  • post_type позволяет выбрать тип записей (по умолчанию обычные посты);
  • category фильтрует по категории, если передать ее slug;
  • Для безопасности запрос требует параметра confirm="yes", чтобы избежать случайного удаления;
  • Удаление происходит только если текущий пользователь имеет права на удаление.

Использование шорткода на сайте

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

[delete_old_posts days="60" confirm="yes"]

Для удаления записей типа «новости» из категории «archive»:

[delete_old_posts days="90" post_type="post" category="archive" confirm="yes"]

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

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

Удаление записей — критичная операция, поэтому важно:

  • Обязательно требовать параметр confirm="yes" или другое подтверждение;
  • Убедиться, что только авторизованные пользователи с нужными правами могут запускать удаление;
  • При больших объемах записей лучше не удалять все сразу, а по частям, чтобы избежать тайм-аутов;
  • Перед массовым удалением обязательно сделать резервную копию базы данных;
  • Если нужно регулярно очищать старые записи, лучше настроить WP-Cron или серверный cron с безопасной проверкой.

Альтернативные плагины для автоматической очистки

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

  • Clearfy Pro — оптимизация и очистка базы, включая удаление устаревших данных;
  • WPRemark — управление комментариями и контентом, можно расширять для удаления записей;
  • Плагины для управления WP-Cron, чтобы запускать автоматизированные задачи по расписанию.

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

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

function wpbit_delete_old_posts_shortcode($atts) {
    // ...предыдущий код...

    $log = '';
    foreach ($old_posts as $post_id) {
        if (current_user_can('delete_post', $post_id)) {
            if (wp_delete_post($post_id, true)) {
                $deleted_count++;
                $log .= "Удалена запись ID: $post_id\n";
            }
        }
    }

    if ($deleted_count > 0) {
        // Можно сохранить лог в файл или отправить email
        error_log("WPBit удаление старых записей:\n" . $log);
    }

    return "<p>Удалено записей: $deleted_count</p>";
}

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

Заключение

Создание шорткода для удаления старых записей — практичное решение для контроля над базой данных WordPress. Оно требует базовых навыков PHP и понимания безопасности платформы. При правильном использовании вы получите удобный и безопасный инструмент управления контентом без лишних плагинов.

Как создать конкретный виджет в WordPress с использованием AJAX
30.11.2025
Как изменить структуру URL в WordPress без плагинов
24.01.2026
Как избежать проблем с отключением WP-Cron в WordPress
20.04.2026
WooCommerce: как исключить товары из поиска и каталога по атрибутам
13.05.2026
Как использовать хуки WordPress для автоматизации задач
11.12.2025