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

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

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

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

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

Рассмотрим популярные плагины и пример кода для автоматического удаления устаревших постов.

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

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

Среди удобных решений выделяются:

  • Auto Delete Posts — позволяет задать временной промежуток (например, 30 дней), после которого посты автоматически удаляются. Поддерживает выбор категорий и типов записей.
  • WP Bulk Delete — мощный инструмент для массового удаления постов по различным критериям: дата, статус, категории, теги и метаполя. Позволяет создавать расписание для регулярного удаления.
  • Delete Expired Transients — плагин для очистки временных данных, но полезен в связке с другими для оптимизации базы.

Для примера рассмотрим настройку WP Bulk Delete:

  1. Установите и активируйте плагин.
  2. Перейдите в раздел Bulk WP > Bulk Delete Posts.
  3. Выберите критерии удаления, например, "Posts older than" и укажите количество дней.
  4. Выберите категории или типы постов, если нужно.
  5. Настройте расписание для периодического выполнения задачи.
  6. Запустите удаление или сохраните расписание.

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

Автоматическое удаление старых постов с помощью кода

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

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

function wplink_remove_old_posts() {
    $days = 30; // Удалять посты старше 30 дней
    $args = array(
        'date_query' => array(
            array(
                'before' => "$days days ago",
            ),
        ),
        'post_type' => 'post',
        'post_status' => 'publish',
        '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 — без возможности восстановления
        }
    }
}

// Запускаем функцию по расписанию
if (!wp_next_scheduled('wplink_daily_old_post_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wplink_daily_old_post_cleanup');
}
add_action('wplink_daily_old_post_cleanup', 'wplink_remove_old_posts');

Данный код:

  • Определяет функцию wplink_remove_old_posts, которая ищет посты старше 30 дней.
  • Удаляет найденные посты без возможности восстановления.
  • Регистрирует ежедневное событие с помощью wp_cron, чтобы функция запускалась автоматически каждый день.

Если хотите удалить записи другого типа, например, кастомного, измените параметр post_type. Аналогично можно фильтровать по категориям, тегам или метаполям.

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

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

  • Тестируйте код на копии сайта или в локальной среде.
  • Проверьте, что get_posts возвращает именно те записи, которые хотите удалить.
  • Сначала используйте wp_trash_post($post_id) вместо wp_delete_post, чтобы отправлять посты в корзину, а не удалять насовсем.
  • Создайте резервную копию базы данных.

Расширение автоматизации: удаление по метаданным и статусу

Удаление черновиков и мусора

Кроме удаления по дате, можно автоматически очищать:

  • Черновики, которые долго не редактировались.
  • Автоматически созданные ревизии.
  • Записи с определённым пользовательским статусом.

Пример кода для удаления старых черновиков:

function wplink_delete_old_drafts() {
    $days = 14; // Удалять черновики старше 14 дней
    $args = array(
        'post_status' => 'draft',
        'date_query' => array(
            array('before' => "$days days ago"),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    $drafts = get_posts($args);
    foreach ($drafts as $draft_id) {
        wp_delete_post($draft_id, true);
    }
}
add_action('wplink_daily_old_post_cleanup', 'wplink_delete_old_drafts');

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

Использование плагина Clearfy Pro для оптимизации

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

Советы по безопасности и производительности при автоматическом удалении

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

  • Резервное копирование — обязательно делайте бэкапы перед настройкой автоматического удаления.
  • Проверка прав — убедитесь, что ваш код не может быть запущен злоумышленниками.
  • Оптимизация запросов — используйте fields => 'ids', чтобы минимизировать нагрузку при получении постов.
  • Логирование — ведите журнал удалений, чтобы отслеживать, что и когда удаляется.

Для логирования можно добавить простой механизм записи в файл или таблицу базы данных.

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

function wplink_log_deleted_post($post_id) {
    $log_file = WP_CONTENT_DIR . '/wplink_deleted_posts.log';
    $message = date('Y-m-d H:i:s') . " - Deleted post ID: $post_id\n";
    file_put_contents($log_file, $message, FILE_APPEND);
}

function wplink_remove_old_posts_with_log() {
    $days = 30;
    $args = array(
        'date_query' => array(
            array('before' => "$days days ago"),
        ),
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    );
    $old_posts = get_posts($args);
    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
        wplink_log_deleted_post($post_id);
    }
}
add_action('wplink_daily_old_post_cleanup', 'wplink_remove_old_posts_with_log');

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

Как отключить AJAX в WooCommerce для улучшения производительности
24.05.2026
Как создать комплексный фильтр постов WordPress с применением мета-записей
08.03.2026
Как оптимизировать загрузку шаблонов WordPress для ускорения сайта
10.01.2026
Как использовать WPCommunity для создания форума в WordPress
01.02.2026
Как создать собственный виджет в WordPress
08.11.2025