Как удалить товары WooCommerce по условию через код

Диагностика проблемы удаления товаров в WooCommerce

Часто в интернет-магазинах на WooCommerce возникает необходимость массового удаления товаров по определённым критериям: категория, статус, дата создания, наличие или отсутствие на складе и т.д. При большом количестве товаров ручное удаление через админку занимает много времени и может вызвать ошибки.

Стандартные плагины не всегда подходят, так как часто предлагают только удаление по категориям или нуждаются в дополнительной настройке. Поэтому оптимальным решением будет написать собственный скрипт на PHP, который удалит товары по заданным условиям через WP_Query и функции WooCommerce.

Пошаговое решение: удаляем товары по условию через код

1. Создаём WP_Query для выборки товаров

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

$args = [
    'post_type' => 'product',
    'posts_per_page' => -1,
    'tax_query' => [
        [
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'sale',
        ],
    ],
    'date_query' => [
        [
            'before' => '6 months ago',
        ],
    ],
    'fields' => 'ids',
];
$query = new WP_Query($args);

2. Удаляем товары в цикле с помощью wp_delete_post

После получения списка ID товаров, мы можем безопасно удалить каждый продукт с помощью функции wp_delete_post. Если хотите удалить без перемещения в корзину — используйте параметр true.

if ($query->have_posts()) {
    foreach ($query->posts as $product_id) {
        wp_delete_post($product_id, true); // true — удаление без корзины
    }
}

3. Добавляем этот код в безопасное место

Рекомендуется добавить этот код в кастомный плагин или в functions.php активной темы, но запускать только однократно, чтобы не удалить товары повторно.

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

if (isset($_GET['delete_sale_products']) && current_user_can('manage_woocommerce')) {
    // код удаления
}

Проверка результата удаления товаров

Чтобы убедиться, что товары удалены, выполните следующие шаги:

  • Перейдите в WooCommerce > Товары и проверьте, что товары из категории "распродажа" старше 6 месяцев отсутствуют.
  • В базе данных в таблице wp_posts записи с типом product и соответствующими ID должны отсутствовать.
  • При необходимости используйте WP-CLI команду wp post list --post_type=product --field=ID для проверки списка.

Частые ошибки и как их исправить

  • Ошибка: Товары не удаляются, хотя код выполняется.
    Причина: Пользователь не имеет прав администратора или роль не включает manage_woocommerce.
    Решение: Проверьте права пользователя и используйте current_user_can() для ограничения доступа.
  • Ошибка: Скрипт зависает или превышает время выполнения.
    Причина: Большое количество товаров.
    Решение: Разбейте удаление на порции, используя параметр posts_per_page с ограничением и запускайте цикл несколько раз или через WP-Cron.
  • Ошибка: После удаления товары отображаются в админке.
    Причина: Кеширование.
    Решение: Очистите кеш сайта и кеш браузера.

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

  • Перед массовым удалением обязательно сделайте бэкап базы данных.
  • Используйте wp_delete_post($id, true) для полного удаления без перемещения в корзину, чтобы не захламлять базу.
  • Для больших магазинов лучше удалять по частям, чтобы избежать превышения лимита памяти и времени выполнения.
  • Добавьте логирование удалённых ID товаров в файл, чтобы при необходимости восстановить или проанализировать действия.
  • Используйте current_user_can('manage_woocommerce'), чтобы ограничить запуск кода только администратору магазина.

Сравнение методов удаления товаров WooCommerce

МетодПлюсыМинусыПодходит для
Удаление вручную через админку Просто, без кода Долго, неудобно при большом количестве Малые магазины
Плагины массового удаления Удобный интерфейс, настройки Могут быть платными, не всегда гибкие Средние магазины
Код через WP_Query и wp_delete_post Максимальная гибкость, автоматизация Требует знаний PHP, осторожность Крупные магазины, разработчики
Как правильно отключить и удалить автозаполнение форм в WordPress без потери функциональности
03.06.2026
Как создать собственный плагин для автоматического удаления старых постов в WordPress
15.04.2026
Как сделать автоматическое сохранение изменений в WordPress для кастомных типов записей
18.01.2026
Как использовать хук woocommerce_order_status_changed для автоматизации в WooCommerce
31.05.2026
Как удалить товары WooCommerce по условию через код
16.05.2026