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

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

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

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

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

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

WordPress хранит записи в таблице wp_posts, где у каждой записи есть поля post_type и post_status. Например, типы могут быть post, page, или кастомные типы. Статусы — publish, draft, trash, auto-draft и другие.

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

Создаём плагин для автоматического удаления неиспользуемых постов

Для примера создадим простой плагин wpdetect-cleanup, который будет удалять посты с типом post и статусом draft, старше 30 дней. Его можно запускать вручную или настроить через cron.

<?php
/**
 * Plugin Name: WPDetect Cleanup
 * Description: Автоматическое удаление черновиков старше 30 дней.
 * Version: 1.0
 * Author: WPDetect
 */

// Основная функция удаления
function wpdetect_cleanup_delete_old_drafts() {
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'draft',
        'date_query'     => [
            [
                'before'    => '30 days ago',
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $query = new WP_Query($args);

    if (empty($query->posts)) {
        return;
    }

    foreach ($query->posts as $post_id) {
        wp_delete_post($post_id, true); // true - без перемещения в корзину
    }
}

// Регистрируем крон-задачу
register_activation_hook(__FILE__, function() {
    if (!wp_next_scheduled('wpdetect_cleanup_cron_hook')) {
        wp_schedule_event(time(), 'daily', 'wpdetect_cleanup_cron_hook');
    }
});

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wpdetect_cleanup_cron_hook');
});

// Хук на запуск задачи
add_action('wpdetect_cleanup_cron_hook', 'wpdetect_cleanup_delete_old_drafts');

// Для ручного запуска через админку можно добавить функцию или страницу
?>

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

В реальном проекте нужно удалять посты не только с типом post и статусом draft, но и, например, авто-сохранения, кастомные типы, или удалять только опубликованные с определёнными метками. Для этого достаточно расширить параметры WP_Query:

$args = [
    'post_type'      => ['post', 'custom_type'],
    'post_status'    => ['draft', 'auto-draft'],
    'date_query'     => [
        [
            'before'    => '60 days ago',
            'inclusive' => true,
        ],
    ],
    'posts_per_page' => -1,
    'fields'         => 'ids',
    'no_found_rows'  => true,
];

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

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

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

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

Добавим в функцию логирование в файл wp-content/uploads/wpdetect-cleanup.log:

function wpdetect_cleanup_log($message) {
    $upload_dir = wp_upload_dir();
    $log_file = $upload_dir['basedir'] . '/wpdetect-cleanup.log';
    $date = date('Y-m-d H:i:s');
    file_put_contents($log_file, "[$date] $message\n", FILE_APPEND);
}

function wpdetect_cleanup_delete_old_drafts() {
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'draft',
        'date_query'     => [
            [
                'before'    => '30 days ago',
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $query = new WP_Query($args);

    if (empty($query->posts)) {
        wpdetect_cleanup_log('No drafts found to delete.');
        return;
    }

    foreach ($query->posts as $post_id) {
        if (wp_delete_post($post_id, true)) {
            wpdetect_cleanup_log("Deleted post ID $post_id");
        } else {
            wpdetect_cleanup_log("Failed to delete post ID $post_id");
        }
    }
}

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

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

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

Заключение по теме удаления неиспользуемых постов

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

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

Оптимизация бесплатных SSL-ссылок для WordPress: решаем проблему с безопасностью и SEO
20.05.2025
Как создать собственный шорткод с параметрами в WordPress
16.11.2025
Как использовать WP-Cron для автоматизации задач в WordPress
17.12.2025
Как автоматизировать удаление старого кода в WordPress: практическое руководство
13.11.2025
Как создать простой пинг-монитор для WordPress с примерами кода
05.12.2025