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

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

Что такое wp_schedule_event и зачем он нужен

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

Преимущества использования wp_schedule_event в том, что все задачи запускаются автоматически, без вмешательства администратора, а также не требуют сторонних плагинов.

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

Для начала создадим функцию, которая будет удалять записи старше определённого количества дней. Например, мы хотим удалить все записи типа «post», опубликованные более 30 дней назад.

function wordpresses_delete_old_posts() {
    $days_old = 30;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));

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

    $query = new WP_Query($args);

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

В этой функции мы используем класс WP_Query для выборки постов, которые старше 30 дней, и удаляем их по одному с помощью wp_delete_post.

Регистрация события в планировщике WordPress

Чтобы эта функция запускалась автоматически, зарегистрируем событие с помощью хука wp_schedule_event. Для этого добавим код активации события при инициализации плагина или темы:

function wordpresses_schedule_old_posts_cleanup() {
    if (!wp_next_scheduled('wordpresses_daily_old_posts_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wordpresses_daily_old_posts_cleanup');
    }
}
add_action('wp', 'wordpresses_schedule_old_posts_cleanup');

Здесь мы создаём ежедневное событие wordpresses_daily_old_posts_cleanup, которое срабатывает один раз в сутки.

Привязка функции удаления к событию

Далее нужно связать созданное событие с функцией удаления:

add_action('wordpresses_daily_old_posts_cleanup', 'wordpresses_delete_old_posts');

Таким образом каждый день WordPress будет запускать нашу функцию, удаляя старые записи.

Удаление запланированного события при деактивации

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

function wordpresses_clear_scheduled_event() {
    $timestamp = wp_next_scheduled('wordpresses_daily_old_posts_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wordpresses_daily_old_posts_cleanup');
    }
}

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

Если необходимо удалять записи другого типа, например, кастомные записи (Custom Post Types), просто измените параметр 'post_type' в запросе:

'post_type' => 'your_custom_post_type',

Также можно расширить условия с помощью параметров 'meta_query', 'tax_query', чтобы удалять только записи с определёнными метками, категориями или метаданными.

Например, удаление только тех записей, у которых метаполе _expire установлено в yes:

$args['meta_query'] = array(
    array(
        'key'     => '_expire',
        'value'   => 'yes',
        'compare' => '=',
    ),
);

Безопасность и производительность

Удаление большого количества записей за один раз может привести к нагрузке на сервер и увеличению времени обработки. Чтобы избежать этого, можно лимитировать количество удаляемых записей за один запуск, добавив параметр 'posts_per_page' => 50 или меньше.

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

Полезные плагины для расширения функционала очистки базы

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

  • Clearfy Pro — плагин для оптимизации и очистки WordPress, умеет удалять ревизии, мусор, и устаревшие записи.
  • Expert Review — если в вашем сайте есть отзывы с устаревшими данными, плагин помогает управлять ими.

Однако собственный код даёт максимальную гибкость и контроль.

Как удалить неиспользуемые мета данные в WordPress для ускорения сайта
10.11.2025
Как создать собственный вид записи в WordPress для специфических типов данных
15.12.2025
Как создать динамические виджеты на PHP
18.11.2025
Решение проблемы: не работает визуальный редактор Gutenberg в WordPress
08.12.2025
Как проверить и исправить ошибки в базе данных WordPress
02.03.2026