Проблема: пустые варианты и атрибуты в товарах WooCommerce
При работе с вариативными товарами WooCommerce часто возникает ситуация, когда в товаре остаются пустые варианты (без доступного запаса или цены) или атрибуты, к которым не привязаны варианты. Это создаёт лишний «мусор» в админке и на фронтенде, снижая удобство управления и пользовательский опыт.
Стандартных средств WooCommerce для массового удаления таких пустых элементов нет, а плагины могут быть избыточными и влиять на производительность. Поэтому эффективное решение — автоматизировать эту задачу через кастомный код.
Как диагностировать наличие пустых вариантов и атрибутов
Для проверки пустых вариантов и атрибутов можно использовать следующий подход:
- В админке откройте товар с вариациями и посмотрите, есть ли варианты без цены или без статуса "В наличии";
- Для атрибутов — проверьте, есть ли атрибуты, которые не используются ни в одном варианте;
- через запросы к базе можно выявить вариации с нулевым запасом или пустыми метаданными.
Для удобства диагностики приведём пример запроса для пустых вариаций с нулевым запасом:
SELECT p.ID, p.post_parent, pm.meta_value AS stock_quantity
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
AND (pm.meta_value IS NULL OR pm.meta_value = '0');Если таких записей много — пора очищать.
Пошаговое решение: удаление пустых вариантов и неиспользуемых атрибутов через код
1. Удаление пустых вариаций
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций:
function wpcat_remove_empty_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private'],
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC',
],
],
];
$variations = get_posts($args);
foreach ($variations as $variation) {
wp_delete_post($variation->ID, true); // Удаляем без возможности восстановления
}
}
// Запускайте функцию вручную или через WP-CLI
// wpcat_remove_empty_variations();Эта функция удалит все вариации с запасом 0. Если нужно учитывать другие критерии (например, отсутствие цены), добавьте соответствующие meta_query.
2. Удаление неиспользуемых атрибутов товаров
Атрибуты, которые не используются ни в одном товаре, можно удалить через следующий код:
function wpcat_delete_unused_product_attributes() {
global $wpdb;
// Получаем все атрибуты (термины в таксономиях типа pa_*)
$attribute_taxonomies = wc_get_attribute_taxonomies();
foreach ( $attribute_taxonomies as $attribute ) {
$taxonomy = wc_attribute_taxonomy_name( $attribute->attribute_name );
// Получаем ID терминов атрибута
$terms = get_terms( [
'taxonomy' => $taxonomy,
'hide_empty' => false,
] );
foreach ( $terms as $term ) {
// Проверяем, используется ли термин в товарах
$count = $term->count;
if ( $count === 0 ) {
// Термин не используется - удаляем
wp_delete_term( $term->term_id, $taxonomy );
}
}
}
}
// Запускайте функцию вручную или через WP-CLI
// wpcat_delete_unused_product_attributes();Как проверить результат удаления
- Перейдите в админку WooCommerce → Товары → Вариации выбранного товара. Пустые варианты должны исчезнуть.
- В разделе Атрибуты в WooCommerce или через «Товары → Атрибуты» проверьте, что удалились неиспользуемые термины.
- Можно повторно запустить SQL-запрос из блока диагностики — пустых вариаций и атрибутов с нулевым использованием быть не должно.
Частые ошибки и как их исправить
- Удаление вариаций не срабатывает: Проверьте, что функция вызывается. Код лишь описывает логику, для автоматизации вызов нужно добавить самостоятельно, например, через WP-CLI или cron.
- Удаляются нужные варианты: Проверьте условия в
meta_query. Например, запас может быть 0, но вариант доступен по предзаказу — учитывайте бизнес-логику. - Отсутствие прав на удаление: Функция
wp_delete_postтребует прав администратора. Запускайте код от имени администратора. - Ошибка при удалении терминов: Проверьте, что таксономия существует и термин не используется в других местах.
Практические советы по безопасности и производительности
- Запускайте скрипты удаления вручную или через WP-CLI, чтобы избежать нагрузки на сайт в пиковые часы.
- Перед массовым удалением сделайте резервную копию базы данных.
- Делайте удаление партиями, если товаров и вариаций много, чтобы избежать таймаута.
- Для ускорения работы запросов используйте индексы по метаданным в базе MySQL.
Сравнение способов очистки пустых вариаций и атрибутов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, нет риска автокода | Много времени, ошибка человека | Для единичных случаев |
| Плагины (например, WP Clean Up) | Автоматизация, удобный интерфейс | Дополнительная нагрузка, возможные конфликты | Для средних сайтов |
| Кастомный код (описанный выше) | Контроль, легковесность, безопасность | Требует технических знаний | Оптимально для опытных разработчиков |