Как автоматизировать удаление старых записей в WordPress с помощью WP-Cron и кастомных функций

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

Что такое WP-Cron и почему он подходит для удаления старого контента

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

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

Однако важно учитывать, что WP-Cron запускается при посещении сайта, поэтому если трафик низкий, задачи могут выполняться с задержками.

Основные преимущества использования WP-Cron для этой задачи:

  • Автоматизация очистки устаревших записей без ручного вмешательства;
  • Гибкость настройки периодичности удаления;
  • Возможность интеграции с кастомными типами записей и условиями;
  • Минимум нагрузки на сервер при корректной настройке.

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

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

function wp_pro_delete_old_posts() {
    $days_old = 30; // Количество дней, после которых посты удаляются
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => 100, // Обработка по 100 штук за раз
    ];

    $query = new WP_Query($args);

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

Обратите внимание, что функция wp_delete_post с параметром true удаляет пост безвозвратно. Если хотите сначала помещать записи в корзину, передайте false или опустите параметр.

Также можно изменить post_type и другие параметры запроса для удаления пользовательских типов записей (например, 'news' или 'events').

Регистрация задачи в WP-Cron для регулярного запуска удаления

Теперь подключим нашу функцию к WP-Cron, чтобы она запускалась, например, раз в сутки. Для этого в файле functions.php вашей темы или в плагине добавьте следующий код:

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

add_action('wp_pro_daily_delete_old_posts', 'wp_pro_delete_old_posts');
<

Здесь мы проверяем, запланировано ли уже событие wp_pro_daily_delete_old_posts. Если нет — создаём его с повторением каждый день. Затем привязываем нашу функцию удаления к этому событию.

Если нужно изменить частоту, можно использовать другие интервалы, например, 'hourly' или создать свой кастомный интервал.

Добавление кастомного интервала для WP-Cron

Если стандартных интервалов не хватает, добавьте свой, например, каждые 12 часов:

function wp_pro_custom_cron_intervals($schedules) {
    $schedules['every_12_hours'] = [
        'interval' => 43200, // 12 часов в секундах
        'display'  => 'Каждые 12 часов'
    ];
    return $schedules;
}
add_filter('cron_schedules', 'wp_pro_custom_cron_intervals');

После этого можно заменить 'daily' на 'every_12_hours' в функции планирования.

Контроль и отладка WP-Cron задач

Для удобства контроля и отладки рекомендую установить плагин WP Crontrol. Он позволяет просматривать запланированные события, запускать их вручную и удалять ненужные.

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

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

Удаление контента — ответственная операция, поэтому стоит учесть несколько рекомендаций:

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

Пример добавления логирования удалённых постов

function wp_pro_delete_old_posts_with_log() {
    $days_old = 30;
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => 100,
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $post_id) {
            error_log("[WP-PRO] Удалён пост ID: $post_id, дата публикации: " . get_the_date('', $post_id));
            wp_delete_post($post_id, true);
        }
    }
}

Логи будут сохраняться в файл debug.log, если включено логирование ошибок WordPress.

Альтернативные решения: плагины для удаления старого контента

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

  • Auto Delete Posts — позволяет настраивать правила удаления записей по возрасту и другим параметрам;
  • WP Bulk Delete — мощный инструмент для массового удаления постов, страниц, комментариев с фильтрацией;
  • Clearfy Pro — плагин с комплексными функциями оптимизации, включая очистку базы данных;

Однако встроенное решение с использованием WP-Cron и кастомного кода даёт максимальный контроль и гибкость.

Итоговые рекомендации для wp-pro.ru

Для сайта wp-pro.ru рекомендую реализовать автоматическое удаление устаревших записей через кастомную функцию и WP-Cron, добавив логирование и тестирование. Это позволит поддерживать базу данных в чистоте и повысит производительность сайта. В случае необходимости, воспользуйтесь плагинами с wpshop.ru для расширенной функциональности.

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

Автоматическое удаление вредоносных скриптов и червей в WordPress
21.02.2026
Решение проблем с хостингом для WooCommerce в WordPress
08.12.2025
Как отключить Gutenberg и вернуть классический редактор в WordPress
15.01.2026
Как добавить произвольные поля в регистрацию WordPress с примером кода
05.02.2026
Как изменить URL адрес постов в WordPress без перенаправлений
02.01.2026