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

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

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

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

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

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

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

Рассмотрим пример создания шорткода [wpreset_delete_old_posts days="30"], который удаляет все записи старше указанного количества дней. По умолчанию — 30 дней.

Регистрация шорткода

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

function wpreset_delete_old_posts_func($atts) {
    $atts = shortcode_atts(array(
        'days' => 30,
    ), $atts, 'wpreset_delete_old_posts');

    $days = intval($atts['days']);
    if ($days <= 0) {
        return '<p>Ошибка: количество дней должно быть положительным числом.</p>';
    }

    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID записей старше указанного срока
    $old_posts = get_posts(array(
        'date_query' => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

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

    $deleted_count = 0;
    foreach ($old_posts as $post_id) {
        if (wp_delete_post($post_id, true)) { // true — без возможности восстановления
            $deleted_count++;
        }
    }

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

Как использовать шорткод

Для удаления записей старше 60 дней разместите на странице или в записи следующий шорткод:

[wpreset_delete_old_posts days="60"]

Это удалит все опубликованные записи старше 60 дней.

Советы по безопасности и доработки функции

Удаление данных — серьёзная операция, поэтому рекомендуем:

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

Пример с проверкой прав и подтверждением

function wpreset_delete_old_posts_secure_func($atts) {
    if (!current_user_can('manage_options')) {
        return '<p>У вас нет прав для выполнения этой операции.</p>';
    }

    $atts = shortcode_atts(array(
        'days' => 30,
        'confirm' => 'no'
    ), $atts, 'wpreset_delete_old_posts_secure');

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

    $days = intval($atts['days']);
    if ($days <= 0) {
        return '<p>Ошибка: количество дней должно быть положительным числом.</p>';
    }

    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

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

    $deleted_count = 0;
    foreach ($old_posts as $post_id) {
        if (wp_delete_post($post_id, true)) {
            $deleted_count++;
        }
    }

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

Используйте шорткод с подтверждением:

[wpreset_delete_old_posts_secure days="30" confirm="yes"]

Альтернативные решения: плагины для удаления старого контента

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

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

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

Выводы и рекомендации

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

Как удалить все плагины WordPress одним кликом
26.01.2026
Как использовать WPReset для автоматического отката изменений в WordPress
05.02.2026
Как использовать WPReset для быстрого восстановления базы данных WordPress
22.01.2026
Как создать и использовать собственные типы записей (Custom Post Types) в WordPress
22.11.2025
Как удалить оставшиеся виджеты после удаления плагинов WordPress
28.05.2026