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

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

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

Что такое WP-Cron и как он работает

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

Преимущества использования WP-Cron для удаления записей

  • Автоматизация без сторонних плагинов
  • Гибкость настройки расписания
  • Контроль через код и хуки WordPress

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

1. Создание пользовательской функции удаления

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

function wporg_delete_old_posts() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));

    $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 ); // true — принудительное удаление без корзины
        }
    }
}

2. Регистрация пользовательского события WP-Cron

Добавим событие, которое будет запускаться ежедневно:

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

add_action( 'wporg_daily_delete_old_posts', 'wporg_delete_old_posts' );

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

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

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

  • Проверьте, что событие запланировано: используйте плагин WP Crontrol или вызовите wp_next_scheduled('wporg_daily_delete_old_posts') через debugger.
  • Просмотрите записи на сайте и в базе данных — записи старше года должны удаляться после первого срабатывания.
  • Для теста можно временно изменить дату в функции strtotime('-1 year') на например '-1 day' и проверить удаление ежедневно.

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

  • WP-Cron не запускается: WP-Cron срабатывает только при посещении сайта. Чтобы избежать пропуска заданий, настройте системный cron на вызов wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron раз в 15 минут.
  • Удаляются не те записи: проверьте условие SQL-запроса, особенно статус (post_status) и тип записи (post_type).
  • Удаление через корзину: в функции wp_delete_post второй параметр true означает безвозвратное удаление. Если хотите отправлять записи в корзину, укажите false.
  • Конфликты с другими плагинами: отключите другие плагины, если задача не срабатывает, чтобы исключить конфликты.

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

  • Используйте wp_delete_post, а не прямое удаление SQL-запросами, чтобы корректно удалять связанные метаданные и комментарии.
  • Ограничьте количество удаляемых записей за один запуск, если база очень большая, чтобы избежать превышения времени выполнения.
  • Логируйте результаты удаления в отдельный файл для мониторинга выполнения задачи.
  • Проверяйте права пользователя, если запускаете удаление через интерфейс или AJAX для безопасности.

Сравнение вариантов автоматического удаления старых записей

МетодПлюсыМинусы
WP-Cron с кастомной функциейГибкость, не требует плагинов, точечное удалениеЗависит от посещаемости сайта, требует кода
Системный cron с WP-CLIНадёжно, не зависит от посещений, быстроТребует SSH-доступа и навыков работы с сервером
Плагины (например, WP Optimize)Простота настройки, дополнительные функции оптимизацииМожет быть избыточным, нагрузка на сайт, риск конфликтов

Скачать WP с оф. сайта Магазин проверенных платных тем