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

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

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

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

Удаление старых записей помогает:

  • освободить место в базе данных;
  • повысить производительность запросов;
  • сохранить актуальность контента;
  • снизить нагрузку на сервер.

Однако важно делать это аккуратно, чтобы не удалить полезные данные и не повредить структуру сайта.

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

Для начала напишем функцию, которая будет удалять записи по условию — например, все записи типа post, опубликованные более 180 дней назад. Используем WP_Query для выборки и функцию wp_delete_post() для удаления.

function wpturbo_delete_old_posts() {
    $days = 180; // количество дней
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
    );

    $query = new WP_Query(array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array($date_query),
        'posts_per_page' => 50, // ограничение на удаление за раз
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ));

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

Важные моменты:

  • Мы ограничиваем количество записей за одну итерацию, чтобы избежать таймаутов.
  • Удаляем без перемещения в корзину для полной очистки. При необходимости можно изменить на false.

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

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

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

add_action('wpturbo_delete_old_posts_event', 'wpturbo_delete_old_posts');

Объяснение:

  • wp_schedule_event() планирует ежедневный запуск события wpturbo_delete_old_posts_event.
  • Хук add_action('wpturbo_delete_old_posts_event', ...) привязывает нашу функцию удаления.
  • Функция wpturbo_schedule_old_posts_deletion() вызывается при каждом заходе на сайт и проверяет, не запланировано ли событие уже.

Как безопасно удалить записи и избежать проблем

Удаление данных — операция рискованная. Чтобы минимизировать ошибки, учтите следующие рекомендации:

  • Перед удалением сделайте резервную копию базы данных.
  • Используйте флаг force_delete=true в wp_delete_post(), если хотите удалить записи без перемещения в корзину.
  • Добавьте логирование, чтобы отслеживать, какие записи удаляются. Пример:
function wpturbo_delete_old_posts() {
    $days = 180;
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
    );

    $query = new WP_Query(array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array($date_query),
        'posts_per_page' => 50,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ));

    if ($query->have_posts()) {
        foreach ($query->posts as $post_id) {
            if(wp_delete_post($post_id, true)) {
                error_log('WPturbo: deleted post ID ' . $post_id);
            } else {
                error_log('WPturbo: failed to delete post ID ' . $post_id);
            }
        }
    }
}
  • Не удаляйте записи, если они связаны с важными данными, например, в качестве привязок в других таблицах. В таком случае лучше использовать кастомные метаполя для маркировки устаревших записей или архивировать их.
  • Использование плагина Clearfy для управления задачами WP-Cron

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

    Преимущества Clearfy:

    • Удобный интерфейс для настройки событий и интервалов.
    • Мониторинг и логирование выполнения задач.
    • Возможность отключать конфликтующие или устаревшие задачи.

    Расширение: удаление записей по пользовательским условиям

    В реальном проекте может потребоваться удалять записи по другим критериям: по категориям, тегам или пользовательским полям. Вот пример, как удалить записи, относящиеся к категории с ID 12, старше 90 дней:

    function wpturbo_delete_old_category_posts() {
        $days = 90;
        $date_query = array(
            'column' => 'post_date',
            'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
        );
    
        $query = new WP_Query(array(
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'category__in'   => array(12),
            'date_query'     => array($date_query),
            'posts_per_page' => 50,
            'fields'         => 'ids',
            'no_found_rows'  => true,
        ));
    
        if ($query->have_posts()) {
            foreach ($query->posts as $post_id) {
                wp_delete_post($post_id, true);
            }
        }
    }
    
    add_action('wpturbo_delete_old_category_posts_event', 'wpturbo_delete_old_category_posts');
    
    function wpturbo_schedule_old_category_posts_deletion() {
        if (!wp_next_scheduled('wpturbo_delete_old_category_posts_event')) {
            wp_schedule_event(time(), 'weekly', 'wpturbo_delete_old_category_posts_event');
        }
    }
    add_action('wp', 'wpturbo_schedule_old_category_posts_deletion');

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

    Заключение

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

    Если хотите упростить управление задачами, попробуйте плагин Clearfy Pro. Он отлично дополняет кастомные решения и повышает контроль над WP-Cron.

    Как настроить права доступа для кастомных типов записей в WordPress
    11.01.2026
    Как удалить пустые метаполя в WordPress с помощью кода
    01.04.2026
    Автоматическое удаление неиспользуемых вариаций товаров в WooCommerce через код
    23.05.2026
    Удаление неиспользуемых вариаций товаров в WooCommerce через код
    14.05.2026
    Логика оценки продуктивности в WordPress: практическое руководство с примерами
    31.12.2025