Как удалить записи определённого типа по условию в WordPress с примером кода

В процессе работы с WordPress иногда возникает необходимость удалить записи определённого типа по заданному условию. Например, удалить все записи кастомного типа «product» с определённым метаполем или удалить устаревшие записи по дате. В этой статье я расскажу, как грамотно и безопасно реализовать такую задачу с помощью WP_Query и стандартных функций WordPress, а также дам пример кода, который легко адаптировать под свои нужды.

Почему стандартное удаление через админку не всегда подходит

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

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

Как сформировать запрос для выборки записей по условию

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

Например, допустим, у вас есть кастомный тип записи product, и вы хотите удалить записи с метаполем status, равным obsolete. Вот пример запроса:

$args = [
    'post_type' => 'product',
    'posts_per_page' => -1, // выбрать все
    'meta_query' => [
        [
            'key' => 'status',
            'value' => 'obsolete',
            'compare' => '='
        ]
    ]
];
$query = new WP_Query($args);

Этот запрос выберет все записи продуктов, у которых метаполе status равно obsolete. Аналогично можно использовать условия по дате, таксономиям и другим параметрам.

Пример функции для удаления записей по условию

Далее рассмотрим пример функции, которая удалит записи с типом product и метаполем status=obsolete. Функция будет использовать wp_delete_post() с аргументом true для жесткого удаления (без перемещения в корзину).

function wpsource_delete_products_obsolete() {
    // Параметры запроса
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => 'status',
                'value' => 'obsolete',
                'compare' => '='
            ]
        ],
        'fields' => 'ids' // выбрать только ID для оптимизации
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        echo 'Нет записей для удаления.';
        return;
    }

    foreach ($query->posts as $post_id) {
        // Удаляем запись без возможности восстановления
        wp_delete_post($post_id, true);
        echo "Удалена запись ID: $post_id<br>";
    }
}

// Вызов функции (например, можно подключить к хуку или запускать вручную)
wpsource_delete_products_obsolete();

В этом коде мы сначала делаем выборку всех записей с нужным условием, затем удаляем каждую по одной. Использование параметра 'fields' => 'ids' уменьшает нагрузку, т.к. нам нужны только ID.

Удаление записей по дате или другим условиям

Аналогично можно выбрать записи по дате, например, удалить все записи типа news, опубликованные более года назад:

$args = [
    'post_type' => 'news',
    'posts_per_page' => -1,
    'date_query' => [
        [
            'before' => '1 year ago'
        ]
    ],
    'fields' => 'ids'
];
$query = new WP_Query($args);
// Далее удаление по тому же принципу

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

Как интегрировать удаление в админ-панель или планировщик задач

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

Например, для запуска по крону:

if (!wp_next_scheduled('wpsource_delete_obsolete_hook')) {
    wp_schedule_event(time(), 'daily', 'wpsource_delete_obsolete_hook');
}

add_action('wpsource_delete_obsolete_hook', 'wpsource_delete_products_obsolete');

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

Рекомендации и предосторожности

  • Перед удалением сделайте бэкап базы данных.
  • Тестируйте код на тестовом окружении.
  • Убедитесь, что правильно задали условие выборки, чтобы не удалить нужный контент.
  • Для массовых операций используйте fields = 'ids' для оптимизации.
  • При большом объёме записей лучше реализовать удаление пакетами, чтобы избежать превышения лимита памяти и таймаута.

Альтернативные плагины для массового удаления записей

Если не хотите писать код, можно использовать плагины, например:

  • Clearfy Pro – содержит инструменты для очистки базы и массового удаления контента по условиям.
  • WPRemark – расширение с удобными настройками для массовых операций с записями.

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

Как добавить фильтр по мета-полям в админке WordPress
01.03.2026
WooCommerce: как автоматически удалять неоплаченные заказы через код
26.06.2026
Как использовать WP-Cron для автоматизации задач в WordPress: практические примеры
25.04.2026
Автоматическое удаление старых записей в WordPress по дате и категории
14.12.2025
WooCommerce: почему не создаётся заказ и как это исправить
10.05.2026