Использование WP-Cron для автоматического удаления старых записей в WordPress

Диагностика проблемы: зачем удалять старые записи автоматически?

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

Пошаговое решение: создание задачи WP-Cron для удаления записей

1. Регистрация кастомного события WP-Cron

Добавим функцию, которая будет запускаться по расписанию и удалять записи старше определённого срока.

function wptips_register_cron_event() {
    if ( ! wp_next_scheduled( 'wptips_delete_old_posts' ) ) {
        // Запускаем событие ежесуточно
        wp_schedule_event( time(), 'daily', 'wptips_delete_old_posts' );
    }
}
add_action( 'wp', 'wptips_register_cron_event' );

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

Определим функцию, которая удалит записи старше 30 дней. Можно адаптировать под свои потребности.

function wptips_delete_old_posts() {
    global $wpdb;
    $days = 30;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

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

    if ( ! empty( $old_posts ) ) {
        foreach ( $old_posts as $post_id ) {
            // Удаляем запись без возможности восстановления (без корзины)
            wp_delete_post( $post_id, true );
        }
    }
}
add_action( 'wptips_delete_old_posts', 'wptips_delete_old_posts' );

3. Очистка задачи при деактивации темы или плагина

Чтобы не оставлять висящие задачи, удалим cron при отключении кода.

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

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

1. Включите режим отладки WP-Cron, например, с помощью плагина WP Crontrol или через логи.
2. Запустите событие вручную (через WP Crontrol или WP-CLI команду wp cron event run wptips_delete_old_posts).
3. Проверьте, что записи старше 30 дней отсутствуют в админке.
4. Убедитесь, что в базе данных (таблица wp_posts) записи с датой старше порога удалены.

Частые ошибки и как их исправить

  • Задача не запускается: Убедитесь, что на сайте есть трафик, иначе WP-Cron не срабатывает. Для теста можно запустить вручную через WP-CLI или плагин WP Crontrol.
  • Удаляются не те записи: Проверьте параметры запроса в SQL, особенно условие post_type и post_status. Если нужны другие типы записей, добавьте их в запрос.
  • Удаление не происходит полностью: Если установлен плагин корзины или кастомное управление удалением, функция wp_delete_post с параметром true гарантирует безвозвратное удаление.
  • Задача висит после удаления кода: Используйте функцию wp_unschedule_event в хуке деактивации.

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

  • Не запускайте удаление очень часто, чтобы не нагружать сервер и базу данных.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • При большом объёме данных используйте пакетную обработку, чтобы избежать таймаутов (например, удалять по 50-100 записей за один запуск).
  • Ограничьте удаление только определёнными типами записей и статусами, чтобы не сломать логику сайта.
  • Для контроля можно добавить логирование действий удаления в отдельный файл или таблицу базы данных.

Сравнение способов удаления старых записей

СпособПлюсыМинусы
WP-Cron с пользовательским кодомГибкость, не требует плагинов, точечное управлениеЗависит от трафика, требует навыков программирования
Плагины для очистки базы (например, WP-Sweep)Простота использования, множество функцийМожет удалять лишнее, нагрузка на базу, не всегда точный контроль
Ручное удаление через SQLБыстро при большом объёме, полный контрольОпасно без бэкапа, требует знаний SQL
Как создать автозаказ в WooCommerce с помощью кода
20.03.2026
Как сделать вывод главных категорий в WordPress с помощью кода
06.04.2026
Как удалить или изменить slug постов в WordPress без редиректа
10.02.2026
Как отключить автообновления плагинов в WordPress с помощью кода
31.01.2026
Как удалить или изменить slug таксономии в WordPress без редиректа
23.02.2026