Диагностика проблемы: пустые варианты товаров в WooCommerce
Пустые варианты товаров — это вариации, у которых нет заданных атрибутов, цены или наличия. Они часто появляются после массового импорта товаров или некорректных изменений в базе. Такие варианты создают путаницу в каталоге и могут негативно влиять на UX и SEO. Выявить их можно через админку WooCommerce или напрямую в базе данных.
Как обнаружить пустые варианты в админке WooCommerce
- Перейдите в «Товары» → «Вариации» (если есть отдельный фильтр по типу варианта) или откройте нужный товар с вариациями;
- Обратите внимание на вариации без цены, без атрибутов или со статусом «Черновик»;
- Если вариантов слишком много, используйте фильтры или экспорт CSV для анализа.
Диагностика через базу данных
Варианты товаров — это записи с типом post_type = 'product_variation' в таблице wp_posts. Чтобы найти пустые варианты, можно выполнить SQL-запрос:
SELECT p.ID, p.post_title, pm.meta_key, pm.meta_value FROM wp_posts p LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND (pm.meta_key = '_price' AND (pm.meta_value IS NULL OR pm.meta_value = ''));Этот запрос покажет варианты без установленной цены. Аналогично можно проверить атрибуты и наличие.
Пошаговое решение: удаление пустых вариантов через код
Для безопасного удаления пустых вариантов создадим функцию, которую можно вызвать через functions.php или создать отдельный плагин-маленький скрипт.
Код для удаления пустых вариантов
function delete_empty_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_price',
'value' => '',
'compare' => '='
]
]
];
$variations = get_posts($args);
$deleted_count = 0;
foreach ($variations as $variation) {
wp_delete_post($variation->ID, true); // принудительное удаление
$deleted_count++;
}
return $deleted_count;
}
// Вызов функции (например, в admin_init, но желательно после резервного копирования)
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_empty_variations'])) {
$count = delete_empty_variations();
wp_die("Удалено пустых вариантов: " . $count . ". <a href=\"admin.php?page=wc-settings\">Вернуться</a>");
}
});После добавления кода в functions.php перейдите по URL https://example.com/wp-admin/admin.php?delete_empty_variations=1 (замените example.com на ваш домен). Скрипт удалит все варианты без цены.
Расширение: удаление вариантов без цены и без атрибутов
function delete_empty_variations_extended() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
];
$variations = get_posts($args);
$deleted_count = 0;
foreach ($variations as $variation) {
$price = get_post_meta($variation->ID, '_price', true);
$attributes = get_post_meta($variation->ID, '_variation_attributes', true);
if (empty($price) || empty($attributes)) {
wp_delete_post($variation->ID, true);
$deleted_count++;
}
}
return $deleted_count;
}Проверка результата после внедрения
- Перейдите в админку WooCommerce → Товары и откройте любой товар с вариациями;
- Проверьте, что пустые варианты исчезли;
- Запустите SQL-запрос из раздела диагностики повторно — пустых вариантов с пустой ценой больше не будет;
- Проверьте работу фронтенда: вариации отображаются корректно, нет пустых опций.
Частые ошибки и как их исправить
- Ничего не удаляется: возможно, критерии поиска пустых вариантов заданы неправильно (например, цена задана, но атрибуты пустые). Проверьте, что именно считать «пустыми» вариантами.
- Удалились нужные варианты: перед удалением сделайте бэкап базы. Можно добавить дополнительную проверку на мета-данные или дату создания.
- Функция не срабатывает при вызове по URL: убедитесь, что у пользователя есть права
manage_woocommerce, и параметры GET передаются корректно. - Появились ошибки при удалении: проверьте, нет ли конфликтов с другими плагинами, которые блокируют удаление записей.
Практические советы по безопасности и производительности
- Всегда делайте полную резервную копию базы данных перед массовыми удалениями.
- Запускайте удаление вне пиковых часов — если вариантов очень много, можно реализовать пакетную обработку с лимитом на количество удалений за один запрос.
- Чтобы избежать появления пустых вариантов в будущем, контролируйте импорт и редактирование товаров, используйте валидацию.
- Для регулярной чистки можно настроить Cron-задачу с вызовом функции удаления.
Сравнение вариантов удаления пустых вариантов
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Много времени при большом количестве | Удаление вариаций по одной |
| SQL-запросы в базе | Быстро и массово | Риск ошибочных удалений, требует опыта | DELETE из wp_posts по условиям |
| PHP код с wp_delete_post | Безопаснее, можно кастомизировать | Нужно писать и тестировать код | Функция delete_empty_variations() |
| Плагины очистки WooCommerce | Автоматизация, интерфейс | Зависимости и нагрузка | Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpcat.ru&medium=article&campaign=woocommerce-samostoyatelno-udalit-pustye-varianti-tovarov) |