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

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

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

С течением времени количество записей увеличивается, что:

  • Замедляет работу сайта из-за увеличения запросов к базе данных
  • Увеличивает размер бэкапов и время их создания
  • Создает сложности при миграции и обновлении

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

Использование wp_cron для автоматизации удаления

WordPress имеет встроенный планировщик задач — wp_cron. С его помощью можно запускать пользовательские функции по расписанию без необходимости использовать системные CRON задачи на сервере.

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

Регистрация пользовательского события с wp_cron

Первым шагом добавим функцию регистрации события при активации плагина или темы:

function wordpresses_register_delete_old_posts_cron() {
    if ( ! wp_next_scheduled( 'wordpresses_delete_old_posts_event' ) ) {
        wp_schedule_event( time(), 'daily', 'wordpresses_delete_old_posts_event' );
    }
}
register_activation_hook( __FILE__, 'wordpresses_register_delete_old_posts_cron' );

Здесь мы проверяем, запланировано ли событие, и если нет — добавляем его с интервалом daily (раз в сутки).

Удаление старых записей — основная функция

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

function wordpresses_delete_old_posts() {
    $days = 180; // количество дней
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        '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 — принудительное удаление без перемещения в корзину
        }
    }
}
add_action( 'wordpresses_delete_old_posts_event', 'wordpresses_delete_old_posts' );

Данная функция выбирает все опубликованные посты, у которых дата публикации старше 180 дней, и удаляет их безвозвратно.

Как отключить задачу при деактивации плагина

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

function wordpresses_deactivate_delete_old_posts_cron() {
    $timestamp = wp_next_scheduled( 'wordpresses_delete_old_posts_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wordpresses_delete_old_posts_event' );
    }
}
register_deactivation_hook( __FILE__, 'wordpresses_deactivate_delete_old_posts_cron' );

Практические советы и безопасность

Перед внедрением автоматического удаления убедитесь, что:

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

Например, чтобы не удалять записи из категории «Новости», можно модифицировать аргументы запроса:

$args['category__not_in'] = array( get_cat_ID('Новости') );

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

function wordpresses_delete_old_posts() {
    $days = 180;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

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

    $old_posts = get_posts( $args );

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

Использование плагинов для расширения возможностей

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

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

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

Заключение

Автоматическое удаление старых записей в WordPress через wp_cron — мощный инструмент для поддержки сайта в оптимальном состоянии. Правильно настроенная задача помогает избежать перегрузки базы данных и упрощает управление контентом. С примерами кода выше вы сможете быстро внедрить это решение на своём сайте wordpresses.ru и поддерживать его чистоту и производительность без лишних затрат времени.

Как удалить неиспользуемые шорткоды в WordPress без плагинов
07.04.2026
Как удалить неиспользуемые шорткоды в WordPress для оптимизации сайта
14.02.2026
Как установить и настроить REST API для собственного плагина
29.11.2025
Как отключить или временно деактивировать плагин в WordPress без удаления
30.12.2025
Как использовать хуки WordPress для оптимизации загрузки сайта
17.01.2026