Использование 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
Как создать собственный шорткод в WordPress: подробное руководство
31.10.2025
Автоматический импорт продуктов из CSV в WooCommerce: пошаговое руководство
17.03.2026
Как удалить или изменить slug таксономии в WordPress без редиректа
23.02.2026
Как создать автоматический импорт продуктов в WooCommerce из CSV файла
23.02.2026
Как избежать конфликтов между плагинами в WordPress
06.03.2026