Диагностика проблемы: пустые варианты товаров в WooCommerce
При работе с вариативными товарами в WooCommerce часто возникает ситуация, когда в каталоге появляются пустые варианты — комбинации атрибутов, которые не имеют цены, изображения или запасов. Это ухудшает пользовательский опыт и может повлиять на конверсию.
Для диагностики перейдите в админке WooCommerce в раздел Товары > Вариации конкретного вариативного товара и проверьте, есть ли варианты с пустыми полями цены или отсутствующим запасом (stock).
Как проверить наличие пустых вариантов программно
function check_empty_variations( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || 'variable' !== $product->get_type() ) {
return [];
}
$empty_variations = [];
foreach ( $product->get_children() as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation->get_price() || ! $variation->is_in_stock() ) {
$empty_variations[] = $variation_id;
}
}
return $empty_variations;
}Вызов функции check_empty_variations($product_id) вернёт массив идентификаторов пустых вариантов.
Пошаговое решение: удаление пустых вариантов через функции темы
Чтобы автоматически удалить пустые варианты из вариативных товаров, добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function remove_empty_variations_from_product( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || 'variable' !== $product->get_type() ) {
return;
}
$variations_to_remove = [];
foreach ( $product->get_children() as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation->get_price() || ! $variation->is_in_stock() ) {
$variations_to_remove[] = $variation_id;
}
}
if ( ! empty( $variations_to_remove ) ) {
foreach ( $variations_to_remove as $vid ) {
wp_delete_post( $vid, true );
}
}
}Для массового удаления пустых вариантов всех товаров можно вызвать функцию так:
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
];
$products = get_posts( $args );
foreach ( $products as $product_id ) {
remove_empty_variations_from_product( $product_id );
}Автоматизация удаления при сохранении товара
Чтобы не запускать скрипт вручную, добавьте хук на сохранение товара:
add_action( 'save_post_product', 'remove_empty_variations_on_save', 20, 3 );
function remove_empty_variations_on_save( $post_ID, $post, $update ) {
remove_empty_variations_from_product( $post_ID );
}Проверка результата после внедрения
Чтобы убедиться, что пустые варианты удалены, откройте карточку вариативного товара в админке и проверьте список вариаций. Пустых вариантов с пустой ценой или отсутствием на складе быть не должно.
Также можно повторно вызвать функцию check_empty_variations($product_id) — она должна вернуть пустой массив.
Частые ошибки и как их исправить
- Не удаляются вариации: убедитесь, что функция вызывается с правильным ID товара и что у пользователя есть права на удаление.
- Удаление важных вариантов: проверьте условия удаления — например, удалять только варианты с
get_price() == falseи!is_in_stock(). Если цена или запас есть, вариант не удалится. - Потеря данных: перед массовым удалением сделайте резервную копию базы данных.
- Ошибка при массовом удалении: для большого количества товаров используйте WP-CLI или разбивайте процесс на части, чтобы избежать таймаута.
Практические советы по безопасности и производительности
- Удаление вариантов — операция необратимая, используйте
wp_delete_post( $vid, true )для полного удаления с базы, но убедитесь, что резервная копия есть. - Не запускайте массовое удаление на продакшн-сайте без тестирования на тестовой копии.
- Оптимизируйте запросы: при большом количестве товаров используйте постраничную выборку и WP Cron для поэтапного удаления.
- Добавьте логирование удалённых вариантов для аудита безопасности.
Сравнение методов удаления пустых вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку | Простота, визуальный контроль | Трудоёмко при большом каталоге |
| Код в functions.php с вызовом по кнопке | Автоматизация, контроль через код | Требует базовых знаний PHP |
| Автоматическое удаление при сохранении | Полная автоматизация | Риск удаления важного варианта без проверки |