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

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

Почему важно удалять записи по метаданным

Автоматизация удаления устаревших записей помогает поддерживать базу данных в чистоте и снижать нагрузку на сервер. В отличие от стандартного удаления по дате публикации, удаление по метаданным позволяет более гибко управлять контентом. Например, можно удалять записи, где дата окончания акции уже прошла, или статус проекта изменился на «архивный».

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

Использование WPcore для автоматического удаления записей

Для реализации такой задачи удобно использовать WPcore-функции, чтобы создать безопасный и стабильный механизм удаления. Ниже приведён пример пользовательской функции, которая удаляет записи по определённому метаданному, используя WP_Query и WP_Delete_Post.

Пример кода удаления записей с мета-полем "expiration_date" раньше текущей даты

function wpcore_auto_delete_expired_posts() {
    $today = date('Y-m-d');

    $args = array(
        'post_type'      => 'post', // замените на нужный тип записи
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                '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 для полного удаления
    }
}

// Добавляем запуск функции в cron
if (!wp_next_scheduled('wpcore_daily_delete_expired')) {
    wp_schedule_event(time(), 'daily', 'wpcore_daily_delete_expired');
}
add_action('wpcore_daily_delete_expired', 'wpcore_auto_delete_expired_posts');

В этом коде мы создаём запрос, который ищет все записи, у которых дата в метаполе expiration_date меньше текущей даты. Затем эти записи удаляются полностью без возможности восстановления.

Настройка и расширение сценария удаления

Вы можете легко адаптировать данный скрипт под свои задачи. Например, изменить тип записи с post на кастомный тип — project, event и т.п. Также можно удалять записи по другим метаполям — например, статусу, булевому значению или сложным условиям с помощью нескольких элементов в meta_query.

Если не хотите сразу удалять записи, можно сначала попробовать сменить их статус на «черновик» или «в корзину», заменив вызов wp_delete_post на wp_update_post(['ID' => $post_id, 'post_status' => 'draft']). Это даст возможность проверить, что удаление происходит правильно, перед тем как полностью удалять данные.

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

function wpcore_delete_old_events() {
    $now = current_time('Y-m-d H:i:s');

    $args = array(
        'post_type'      => 'event',
        'posts_per_page' => -1,
        'meta_query'     => array(
            'relation' => 'AND',
            array(
                'key'     => 'event_end_date',
                'value'   => $now,
                'compare' => '<',
                'type'    => 'DATETIME',
            ),
            array(
                'key'     => 'event_status',
                'value'   => 'completed',
                'compare' => '=',
            ),
        ),
        'fields' => 'ids',
    );

    $expired_events = get_posts($args);

    foreach ($expired_events as $event_id) {
        wp_delete_post($event_id, true);
    }
}
add_action('wpcore_daily_delete_expired', 'wpcore_delete_old_events');

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

Как отследить и протестировать работу удаления

Для контроля работы вы можете добавить логирование удаляемых ID в отдельный файл или в системный лог WordPress через error_log(). Также полезно создать вспомогательную административную страницу, где будут отображаться записи, которые попадут на удаление по заданным критериям.

Например, для дебага можно временно заменить удаление на вывод ID:

foreach ($expired_posts as $post_id) {
    error_log('WPcore delete post ID: ' . $post_id);
    // wp_delete_post($post_id, true);
}

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

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

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

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

Использование плагина Clearfy Pro для очистки базы

Для тех, кто хочет автоматизировать очистку базы данных и удалить мусорные записи, стоит обратить внимание на Clearfy Pro. Этот плагин помогает оптимизировать базу, удалять ревизии, спам и многое другое, но для задач удаления по метаданным всё равно понадобится кастомный код, описанный выше.

Итог

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

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

Как избежать конфликтов между плагинами в WordPress
07.02.2026
Как создать персонализированные типы записей в WordPress
10.11.2025
WooCommerce: автоматическое удаление неактивных вариаций товаров
31.05.2026
Как использовать WPRemark для оценки комментариев в WordPress
01.01.2026
WooCommerce: оптимальные настройки для очистки базы от старого кода и данных
28.05.2026