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

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

Что такое WP-Cron и как он работает для автоматизации задач в WordPress

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

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

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

  • Не требует настройки серверного cron — всё работает из коробки.
  • Гибкость: можно задать интервал выполнения и логику удаления.
  • Можно легко интегрировать в темы и плагины.

Однако есть и недостаток — если на сайт долго не заходят, задачи могут не запускаться вовремя. Для решения этой проблемы можно настроить системный cron или использовать сторонние сервисы.

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

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

function wpinfo_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,
    );

    $old_posts = get_posts($args);

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

Эта функция получает все опубликованные записи старше 30 дней и удаляет их безвозвратно. Разумеется, $days_old можно изменить под свои задачи.

Объяснение ключевых моментов функции

Мы используем date_query для фильтрации записей по дате публикации — это эффективный метод, который работает на уровне запроса к базе данных. Параметр fields => 'ids' позволяет получить только ID записей, что экономит память.

Функция wp_delete_post() с параметром true удаляет запись сразу, минуя корзину — это важно для автоматического удаления без необходимости ручного подтверждения.

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

Теперь нужно прикрепить нашу функцию к расписанию WP-Cron. Для начала зарегистрируем собственное событие при активации темы или плагина.

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

// Привязываем функцию к хук-событию
add_action('wpinfo_delete_old_posts_hook', 'wpinfo_delete_old_posts');

Здесь мы создаём задачу, которая будет запускаться ежедневно и вызывать нашу функцию удаления. Функция wp_next_scheduled() предотвращает дублирование задач.

Как удалить расписание при деактивации темы или плагина

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

function wpinfo_unschedule_old_posts_deletion() {
    $timestamp = wp_next_scheduled('wpinfo_delete_old_posts_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpinfo_delete_old_posts_hook');
    }
}
// Например, для плагина:
register_deactivation_hook(__FILE__, 'wpinfo_unschedule_old_posts_deletion');

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

Дополнительные советы и рекомендации

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

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

  • WP Crontrol — позволяет управлять WP-Cron задачами и создавать свои события через интерфейс.
  • Clearfy Pro — многофункциональный плагин для оптимизации и очистки базы, включая удаление старого контента.

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

Резервное копирование перед автоматическим удалением

Обязательно настройте регулярное резервное копирование базы данных, особенно если удаление происходит автоматически. Можно использовать плагин Backup от WPSHOP или аналоги.

Тестирование и отладка

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

function wpinfo_delete_old_posts() {
    // ... код удаления ...
    error_log('WPInfo: Удалено ' . count($old_posts) . ' старых записей');
}

Это поможет убедиться, что всё работает корректно.

Как добавить динамические поля в WordPress: практическое руководство
09.03.2026
Как изменить выборку постов в WordPress по методам запроса WP_Query
02.04.2026
Как отключить автоматический выход из WordPress
17.02.2026
Как использовать автоматическое удаление старых записей в WordPress с помощью WP-Cron
21.03.2026
Как настроить автоматическое удаление неактивных пользователей WordPress
21.01.2026