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

В процессе ведения сайта на WordPress нередко возникает задача регулярно удалять записи или посты, которые стали неактуальными, например, устаревшие объявления, акции или события. Особенно удобно, если удаление можно делать по определённым мета-данным, например, дате окончания действия, статусу или пользовательскому полю.

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

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

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

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

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

Пример задачи: удалить все записи с пользовательским полем expiration_date, дата которого меньше текущей

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

function wpmonitor_delete_expired_posts() {
    $today = date('Ymd');
    $args = [
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => 'expiration_date',
                'value' => $today,
                'compare' => '<',
                'type' => 'DATE',
            ],
        ],
        'fields' => 'ids',
    ];

    $expired_posts = get_posts($args);

    foreach ($expired_posts as $post_id) {
        wp_delete_post($post_id, true); // true — чтобы удалить без возможности восстановления
    }
}

// Регистрируем событие, если оно еще не зарегистрировано
if (!wp_next_scheduled('wpmonitor_daily_expired_posts_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpmonitor_daily_expired_posts_cleanup');
}

// Привязываем нашу функцию к событию
add_action('wpmonitor_daily_expired_posts_cleanup', 'wpmonitor_delete_expired_posts');

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

Важные моменты при работе с WP-Cron

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

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

Пример удаления записей определённого типа и статуса с помощью плагина Clearfy Pro

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

Это избавит вас от необходимости писать собственные функции и настроит удаление через интерфейс без кода. Особенно полезно для новичков.

Как расширить функциональность: удаление постов по произвольным условиям

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

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

function wpmonitor_delete_custom_filtered_posts() {
    $args = [
        'post_type' => 'event',
        'posts_per_page' => -1,
        'meta_query' => [
            'relation' => 'AND',
            [
                'key' => 'expiration_date',
                'value' => date('Ymd'),
                'compare' => '<',
                'type' => 'DATE',
            ],
            [
                'key' => 'event_status',
                'value' => 'cancelled',
                'compare' => '=',
            ],
        ],
        'fields' => 'ids',
    ];

    $posts_to_delete = get_posts($args);

    foreach ($posts_to_delete as $post_id) {
        wp_delete_post($post_id, true);
    }
}

add_action('wpmonitor_weekly_event_cleanup', 'wpmonitor_delete_custom_filtered_posts');

if (!wp_next_scheduled('wpmonitor_weekly_event_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wpmonitor_weekly_event_cleanup');
}

В этом случае функция удалит все записи типа event с мета-данными, где дата истекла и статус события равен "cancelled". Планировщик настроен на еженедельный запуск.

Отладка и логирование удаления

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

function wpmonitor_delete_expired_posts_with_log() {
    $today = date('Ymd');
    $args = [
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => 'expiration_date',
                'value' => $today,
                'compare' => '<',
                'type' => 'DATE',
            ],
        ],
        'fields' => 'ids',
    ];

    $expired_posts = get_posts($args);

    foreach ($expired_posts as $post_id) {
        $result = wp_delete_post($post_id, true);
        if ($result) {
            error_log("[wpmonitor] Удалён пост ID: $post_id с истёкшей датой $today");
        } else {
            error_log("[wpmonitor] Не удалось удалить пост ID: $post_id");
        }
    }
}

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

Как создать собственный шорткод WordPress: практическое руководство с примерами
17.11.2025
Как использовать фильтр pre_get_posts для узкой настройки запросов в WordPress
20.04.2026
Как использовать REST API WordPress для мониторинга изменений на сайте
23.12.2025
Как избежать конфликтов плагинов в WordPress
06.12.2025
Как установить и настроить WP Remark для автоматизации комментирования в WordPress
12.03.2026