Диагностика проблемы: зачем удалять товары с нулевым остатком и без вариаций
Магазины на WooCommerce часто сталкиваются с накоплением товаров, которые неактивны из-за отсутствия остатков или отсутствия вариаций и атрибутов, особенно при использовании вариативных товаров. Это снижает производительность сайта, усложняет администрирование и может негативно влиять на SEO, если такие страницы индексируются.
Основные признаки проблемы:
- В каталоге много товаров с количеством на складе 0.
- Некоторые товары вариативные, но без активных вариаций.
- Администраторы тратят время на ручное удаление устаревших товаров.
Как проверить наличие товаров без вариаций и с нулевым остатком
Для диагностики используйте следующий SQL-запрос, который поможет выявить такие товары в базе данных:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_wc_product_meta_lookup pm ON p.ID = pm.product_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND pm.stock_quantity <= 0
AND p.ID NOT IN (
SELECT post_parent FROM wp_posts
WHERE post_type = 'product_variation'
);
Данный запрос выводит опубликованные товары с нулевым или отрицательным остатком, у которых нет дочерних вариаций.
Пошаговое решение: автоматизация удаления товаров при нулевом остатке и без вариаций
1. Создание функции для удаления товаров
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:
function wpdir_delete_out_of_stock_simple_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
),
),
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'simple',
),
),
);
$products = get_posts($args);
foreach ($products as $product_id) {
// Проверяем наличие вариаций
$variations = new WP_Query(array(
'post_parent' => $product_id,
'post_type' => 'product_variation',
'posts_per_page' => 1,
'fields' => 'ids',
));
if (!$variations->have_posts()) {
wp_delete_post($product_id, true); // Удаляем без возможности восстановления
}
}
}2. Настройка планировщика для регулярного запуска
Чтобы функция запускалась автоматически, добавьте WP-Cron задачу:
if (!wp_next_scheduled('wpdir_delete_out_of_stock_simple_products_hook')) {
wp_schedule_event(time(), 'daily', 'wpdir_delete_out_of_stock_simple_products_hook');
}
add_action('wpdir_delete_out_of_stock_simple_products_hook', 'wpdir_delete_out_of_stock_simple_products');Это обеспечит ежедневную проверку и удаление товаров.
Проверка результата после внедрения
Для проверки:
- Создайте тестовый простой товар с нулевым остатком и без вариаций.
- Убедитесь, что он опубликован.
- Запустите функцию вручную (например, вызвав
wpdir_delete_out_of_stock_simple_products();через админ-панель или подключив скрипт). - Проверьте, что товар удалён из админки и frontend каталога.
Частые ошибки и способы их устранения
- Функция не запускается автоматически
Проверьте, активирован ли WP-Cron, и есть ли посещения сайта, запускающие задачи. Для теста вызовите функцию вручную. - Удаляются товары с вариациями
Проверьте условие проверки дочерних вариаций. Запрос WP_Query должен корректно искать вариации поpost_parent. - Удаление не происходит из-за кеширования
Очистите кеш сайта и кэширующих плагинов после внедрения кода.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы перед автоматическим удалением.
- Для больших магазинов используйте постраничную обработку (pagination) при выборке товаров, чтобы избежать превышения лимитов памяти.
- При необходимости добавьте логирование удалённых товаров для аудита.
- Если вы не уверены, сначала меняйте статус товара на
draftвместо удаления, чтобы проверить процесс. - Для более точной очистки рассмотрите использование плагина Clearfy Pro — он помогает оптимизировать WooCommerce и автоматически удалять мусорные данные.
Сравнение способов удаления товаров с нулевым остатком и без вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление | Полный контроль | Трудозатратно, риск забыть |
| WP-Cron с кастомным кодом | Автоматизация, гибкость | Нужны навыки программирования, возможны ошибки в логике |
| Плагины (например, Clearfy Pro) | Удобство, дополнительные функции | Могут быть платными, лишние зависимости |