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

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

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

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

Для начала нужно понять, как в WooCommerce хранится информация о наличии и скидках.

  • Наличие товара хранится в метаполе _stock_status (values: instock, outofstock, onbackorder).
  • Скидка определяется сравнением цены _regular_price и _sale_price.

Проверить данные можно через phpMyAdmin или средствами WP:

$product = wc_get_product($product_id);
$stock_status = $product->get_stock_status();
$sale_price = $product->get_sale_price();
$regular_price = $product->get_regular_price();

Пошаговое решение: удаление товаров по критериям

1. Создаем WP-CLI команду для массового удаления

Лучший способ — использовать WP-CLI, чтобы не перегружать сайт. В файле functions.php темы или в плагине создайте команду:

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wc-delete-products', function($args, $assoc_args) {
        $args_query = [
            'post_type' => 'product',
            'posts_per_page' => -1,
            'post_status' => 'publish',
        ];

        $products = get_posts($args_query);
        $deleted = 0;

        foreach ($products as $product_post) {
            $product = wc_get_product($product_post->ID);
            if (!$product) continue;

            $stock_status = $product->get_stock_status();
            $sale_price = $product->get_sale_price();
            $regular_price = $product->get_regular_price();

            // Условие: отсутствует на складе и есть скидка
            if ($stock_status === 'outofstock' && $sale_price && $sale_price < $regular_price) {
                wp_delete_post($product_post->ID, true); // безвозвратно
                $deleted++;
            }
        }
        WP_CLI::success("Удалено продуктов: $deleted");
    });
}

2. Запуск и проверка

Запустите команду в терминале в корне сайта:

wp wc-delete-products

После выполнения увидите количество удаленных товаров.

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

Убедитесь, что удаленные товары действительно отсутствуют:

  • В админке WooCommerce — раздел Товары (убедитесь, что отсутствуют удаленные позиции).
  • На фронтенде — товары со статусом outofstock и скидкой должны исчезнуть.
  • Можно проверить количество товаров до и после команды через WP-CLI:
wp post list --post_type=product --field=ID | wc -l

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

  • Не удаляются товары: Проверьте, что WP-CLI активен и команда зарегистрирована, а также что у пользователя достаточные права.
  • Удаляются не те товары: Перепроверьте условие в коде, возможно, логика сравнения цен или статуса некорректна.
  • Проблемы с производительностью: При большом количестве товаров лучше разбивать запросы по частям с posts_per_page и использовать пагинацию.

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

  • Перед удалением создавайте резервные копии базы данных.
  • Для больших магазинов используйте пакетную обработку товаров, чтобы избежать таймаутов.
  • Можно вместо удаления переводить товары в статус draft или использовать метаполе для пометки на удаление, чтобы иметь возможность восстановить.
  • Для автоматизации процесса интегрируйте WP-CLI команду в CRON-задачу сервера.

Сравнение подходов: плагин vs код vs ручное удаление

МетодПлюсыМинусыПрименимость
Плагин (например, Bulk Delete) Удобство, интерфейс, без навыков кода Может не иметь нужных условий фильтрации, нагрузка на сайт Малые и средние магазины
Код + WP-CLI (как в статье) Гибкость, масштабируемость, точечное управление Требует навыков, доступ к серверу Средние и крупные проекты, разработчики
Ручное удаление через админку Простота, визуальный контроль Очень долго, риск пропуска товаров Очень маленькие магазины
Безопасные автообновления WordPress: настройка и контроль
29.11.2025
Как автоматизировать управление ролями и правами в WordPress
24.03.2026
Автоматическое удаление отменённых и завершённых заказов WooCommerce по времени
29.06.2026
Как запретить доступ к административной панели WordPress по IP
09.04.2026
Как создать динамические таблицы в WordPress с помощью шорткодов
06.01.2026