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

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

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

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

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

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

Как работает WP-Cron в WordPress

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

Основные шаги:

  1. Создать функцию, которая удаляет посты старше заданного срока;
  2. Зарегистрировать новую задачу в WP-Cron с нужным интервалом;
  3. Привязать нашу функцию к этой задаче.

Далее приведём подробный пример с кодом.

Пример кода: автоматическое удаление постов старше 180 дней

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

// Регистрируем интервал для еженедельного запуска
add_filter('cron_schedules', 'wptest_add_weekly_cron_schedule');
function wptest_add_weekly_cron_schedule($schedules) {
    $schedules['weekly'] = array(
        'interval' => 7 * 24 * 60 * 60, // 7 дней в секундах
        'display'  => __('Once Weekly')
    );
    return $schedules;
}

// Регистрируем событие при активации темы/плагина
function wptest_schedule_old_posts_deletion() {
    if (!wp_next_scheduled('wptest_delete_old_posts_hook')) {
        wp_schedule_event(time(), 'weekly', 'wptest_delete_old_posts_hook');
    }
}
add_action('wp', 'wptest_schedule_old_posts_deletion');

// Хук выполнения задачи
add_action('wptest_delete_old_posts_hook', 'wptest_delete_old_posts_function');

// Функция удаления старых постов
function wptest_delete_old_posts_function() {
    global $wpdb;
    
    // Определяем дату 180 дней назад
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Получаем ID постов старше 180 дней
    $old_posts = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
        'post', 'publish', $date_threshold
    ));

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

// Удаляем задачу при деактивации темы/плагина
function wptest_clear_scheduled_event() {
    $timestamp = wp_next_scheduled('wptest_delete_old_posts_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptest_delete_old_posts_hook');
    }
}
register_deactivation_hook(__FILE__, 'wptest_clear_scheduled_event');

Объяснение кода

Мы добавляем свой интервал в WP-Cron — еженедельный запуск. При инициализации сайта проверяем, запланирована ли уже задача, и если нет — создаём её. Функция wptest_delete_old_posts_function получает ID всех опубликованных постов старше 180 дней и удаляет их безвозвратно.

Такой подход безопасен и не требует сторонних плагинов. Для изменения периода удаления просто измените параметр в strtotime('-180 days') на нужный.

Дополнительные советы по безопасности и оптимизации

Перед удалением данных рекомендуем:

  • Создавать резервные копии сайта и базы данных;
  • Добавить логирование удалённых постов для контроля;
  • Тестировать код в среде разработки;
  • Рассмотреть возможность использования пользовательских типов записей (CPT), если нужно очищать не только стандартные посты.

Пример логирования удалённых ID:

function wptest_delete_old_posts_function() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
    $old_posts = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
        'post', 'publish', $date_threshold
    ));

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
            error_log('WPTest: удалён пост ID ' . $post_id);
        }
    }
}

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

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

  • Auto Delete Posts — простой плагин для удаления постов по времени;
  • Clearfy Pro — расширенный плагин оптимизации с функцией удаления устаревшего контента;
  • WP Remote Post для более сложных сценариев работы с постами.

Однако если ваша задача проста — собственный код на WP-Cron будет более лёгким и быстрым решением.

Как автоматизировать удаление старого контента в WordPress
28.01.2026
Как автоматизировать удаление старого контента в WordPress
07.02.2026
Как отключить автозагрузку медиа в WordPress для ускорения сайта
15.04.2026
Как отладить проблемы с производительностью WordPress
08.11.2025
Как создать автотагировку постов в WordPress: практическое руководство
02.04.2026