Диагностика проблемы: зачем удалять отсутствующие продукты
В 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 (как в статье) | Гибкость, масштабируемость, точечное управление | Требует навыков, доступ к серверу | Средние и крупные проекты, разработчики |
| Ручное удаление через админку | Простота, визуальный контроль | Очень долго, риск пропуска товаров | Очень маленькие магазины |