Диагностика проблемы пустых вариативных товаров в WooCommerce
В WooCommerce иногда появляются вариативные товары, у которых отсутствуют вариации или все вариации имеют нулевой запас. Такие товары занимают место в каталоге и могут ухудшать пользовательский опыт и SEO. Проблема часто возникает после импорта или массового обновления товаров, когда вариации не были корректно добавлены или синхронизированы.
Как проверить наличие пустых вариативных товаров
Для начала важно понять, какие товары являются пустыми вариативными:
- В админке в разделе Товары фильтруйте по типу «Вариативный товар».
- Откройте каждый и проверьте, есть ли активные вариации и их остатки.
- Можно использовать SQL-запрос к базе данных для быстрого поиска товаров без вариаций или с нулевым запасом.
SELECT p.ID, p.post_title FROM wp_posts p WHERE p.post_type = 'product' AND p.ID NOT IN (SELECT post_parent FROM wp_posts WHERE post_type = 'product_variation');Этот запрос покажет вариативные товары без дочерних вариаций.
Пошаговое решение: удаление пустых вариативных товаров через код
Автоматизируем удаление таких товаров через кастомный PHP-скрипт, который можно добавить в functions.php темы или выполнить через WP-CLI.
function wpguest_delete_empty_variable_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
],
],
];
$query = new WP_Query($args);
foreach ($query->posts as $product_post) {
$product = wc_get_product($product_post->ID);
$variations = $product->get_children();
// Проверяем наличие вариаций
if (empty($variations)) {
wp_delete_post($product_post->ID, true);
continue;
}
// Проверяем остаток всех вариаций
$has_stock = false;
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation && $variation->managing_stock() && $variation->get_stock_quantity() > 0) {
$has_stock = true;
break;
}
}
if (!$has_stock) {
wp_delete_post($product_post->ID, true);
}
}
}
// Запуск функции вручную или по крону
// wpguest_delete_empty_variable_products();Этот код:
- Получает все вариативные товары.
- Удаляет товар, если у него нет вариаций.
- Удаляет товар, если все вариации не имеют запасов.
Как выполнить скрипт безопасно
- Добавьте функцию в
functions.phpи вызовите её один раз через админку или запланируйте запуск через WP-Cron. - Для больших магазинов лучше использовать WP-CLI для выполнения без таймаута.
Проверка результата после внедрения
- В админке WooCommerce проверьте список товаров — пустые вариативные товары должны исчезнуть.
- Повторите SQL-запрос для проверки отсутствия вариативных товаров без дочерних вариаций.
- Просмотрите логи ошибок и убедитесь, что не удалены нужные товары.
Частые ошибки и как их исправить
- Удаляются нужные товары — проверьте логику условия удаления, возможно, у вариаций неверно настроено управление запасами.
- Скрипт не работает — убедитесь, что функция вызывается и WooCommerce активен.
- Ошибка таймаута на больших магазинах — используйте WP-CLI или делайте обработку порциями.
Практические советы по безопасности и производительности
- Перед запуском сделайте резервную копию базы данных.
- Добавьте логирование в функцию для контроля удаляемых товаров.
- Для больших баз делайте обработку постранично, чтобы избежать перебоев.
Сравнение вариантов удаления пустых вариативных товаров
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление в админке | Просто, без кода | Медленно, не подходит для большого каталога | Малое количество товаров |
| SQL-запрос + ручное удаление | Быстрый поиск проблемных товаров | Требует знаний SQL, риск удаления нужных данных | Для опытных разработчиков |
| PHP-скрипт для автоматического удаления | Автоматизация, можно запускать регулярно | Нужно тестировать, требует базовых навыков программирования | Средние и большие магазины |
| Плагины для очистки каталога | Удобство, GUI | Может нагружать сайт, лишние зависимости | Пользователи без навыков кодирования |