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

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

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

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

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

Создание задачи удаления старых записей через WP-Cron

Первое, что нужно сделать — зарегистрировать событие при инициализации WordPress, если оно ещё не создано. Затем написать функцию, которая будет удалять записи старше заданного срока.

Регистрация планировщика задачи

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

Здесь мы проверяем, есть ли уже запланированное событие 'wpin_delete_old_posts_hook'. Если нет — создаём новое с интервалом 'daily' (раз в сутки).

Функция удаления старых записей

Теперь создадим функцию, которая будет удалять записи старше 30 дней. В данном примере удаляются записи типа 'post', статус — 'publish'.

function wpin_delete_old_posts() {
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '30 days ago',
            ),
        ),
        '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 — без возможности восстановления
        }
    }
}
add_action('wpin_delete_old_posts_hook', 'wpin_delete_old_posts');

Функция получает ID всех записей старше 30 дней и удаляет их без помещения в корзину.

Расширение функционала: удаление по типам записей и меткам

Если на сайте есть кастомные типы записей, их тоже можно включить в логику удаления. Для этого достаточно изменить параметр post_type в запросе на массив:

'post_type' => array('post', 'custom_type'),

Также можно добавить условия по таксономиям или метаполям — например, удалять только записи с определённой категорией или без определённого метаполя.

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

$args = array(
    'post_type'      => 'post',
    'post_status'    => 'publish',
    'date_query'     => array(
        array('before' => '30 days ago'),
    ),
    'category_name'  => 'news',
    'fields'         => 'ids',
    'posts_per_page' => -1,
);

Управление задачей: удаление и запуск вручную

Если нужно удалить задачу из планировщика, используйте функцию:

function wpin_clear_delete_old_posts_event() {
    $timestamp = wp_next_scheduled('wpin_delete_old_posts_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpin_delete_old_posts_hook');
    }
}

Эта функция отменит запланированное событие. Запускать её стоит, например, при деактивации плагина или темы.

Для ручного запуска удаления можно вызвать функцию напрямую из админки или через WP-CLI:

wp eval 'wpin_delete_old_posts();'

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

Удаление большого количества записей может привести к нагрузке на сервер. Чтобы избежать проблем, можно разбивать процесс удаления на партии, например, по 50 записей за раз и запускать несколько событий с интервалом.

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

Также стоит учитывать, что WP-Cron зависит от посещаемости сайта. Если трафик низкий, задачи могут запускаться с задержками. В таких случаях рекомендую настроить системный cron для вызова wp-cron.php с нужной периодичностью.

Полезные плагины для управления WP-Cron

Для удобства управления задачами WP-Cron можно использовать плагины, например:

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

Итог

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

Автоматизация обработки возвратов и обменов в WooCommerce
18.05.2026
WooCommerce не отображает варианты товаров: причины и решения
25.04.2026
Как отключить автоматические уведомления об обновлениях WordPress
11.01.2026
Как создать многоуровневую пагинацию в WordPress с примерами кода
11.03.2026
Как отключить Emoji в WordPress: удаление и оптимизация
29.01.2026