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

Проблема накопления старых кастомных записей в WordPress

В проектах на WordPress часто создают кастомные типы записей (Custom Post Types, CPT) для хранения специфичных данных — например, события, отзывы, заявки и т.д. Со временем эти записи накапливаются, и не все из них актуальны. Особенно если CPT используется для временных данных, например, промо-акций или временных заявок, старые записи могут засорять базу и замедлять сайт.

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

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

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

Для начала напишем функцию, которая будет искать записи кастомного типа старше заданного периода и удалять их.

Например, у нас есть кастомный тип записей event, и мы хотим удалять все события старше 30 дней.

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

function wpquery_delete_old_events() {
    $days_old = 30; // количество дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    $args = [
        'post_type'      => 'event',
        'posts_per_page' => -1,
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'fields'         => 'ids',
        'post_status'    => 'publish',
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true); // true — удаление без корзины
        }
    }
}

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

Автоматизация запуска с помощью WP-Cron

Чтобы удаление происходило автоматически, привяжем функцию к событию WP-Cron, запускающемуся, например, раз в сутки.

Регистрация cron-события

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

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

Привязка функции удаления к cron-событию

add_action('wpquery_daily_old_events_cleanup', 'wpquery_delete_old_events');

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

Отладка и проверка работы очистки

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

// Временно добавить вызов для теста
add_action('admin_init', 'wpquery_delete_old_events');

После подтверждения работы удаление можно убрать.

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

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

Удаление записей с кастомным полем

Если нужно удалять записи не по дате создания, а по значению метаполя, например, статусу, можно расширить запрос:

$args = [
    'post_type'      => 'event',
    'posts_per_page' => -1,
    'meta_query'     => [
        [
            'key'     => 'status',
            'value'   => 'expired',
            'compare' => '=',
        ],
    ],
    'fields'         => 'ids',
];

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

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

Оптимизация производительности

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

function wpquery_delete_old_events_batch() {
    $days_old = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    $args = [
        'post_type'      => 'event',
        'posts_per_page' => 50,
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'fields'         => 'ids',
        'post_status'    => 'publish',
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}

И запускать эту функцию каждую минуту или несколько раз в день через WP-Cron.

Выводы

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

Если хотите более гибкие настройки и удобный интерфейс — обратите внимание на плагин Clearfy Pro, который включает функции оптимизации и автоматического удаления мусора в WordPress.

WooCommerce: не отображаются атрибуты продуктов при использовании кеширующих плагинов
25.05.2026
WooCommerce: автоматическое изменение статуса заказа при неуспешном платеже
20.07.2026
WooCommerce не отображает атрибуты продуктов: как исправить
26.04.2026
WooCommerce: как исправить неотображение атрибутов продуктов при использовании кеширующих плагинов
04.06.2026
Как автоматизировать удаление спама в комментариях WordPress
03.03.2026