Диагностика проблемы с пустыми вариациями в WooCommerce
Пустые вариации товаров — вариации без атрибутов или с нулевым запасом — часто появляются после массового импорта, удаления атрибутов или некорректных ручных изменений. Они не видны клиенту, но занимают место в базе, влияют на отчёты и замедляют работу админки.
Как определить, есть ли такие вариации? В админке WooCommerce перейдите в раздел Товары > Все товары, отфильтруйте товары с вариациями и проверьте наличие вариаций с пустыми атрибутами или нулевыми запасами. Для точной диагностики используйте SQL-запрос:
SELECT p.ID, p.post_parent FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND (pm.meta_key LIKE 'attribute_%' AND (pm.meta_value IS NULL OR pm.meta_value = ''))
OR (pm.meta_key = '_stock' AND pm.meta_value = '0');Если запрос возвращает записи — проблема есть.
Пошаговое решение: скрипт для автоматического удаления пустых вариаций
Для автоматизации удаления пустых вариаций используйте следующий PHP-код. Он проверяет вариации с пустыми атрибутами и нулевым запасом и удаляет их программно.
function wpbook_delete_empty_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$variations = get_posts($args);
$deleted = 0;
foreach ($variations as $variation) {
$variation_id = $variation->ID;
$attributes = wc_get_product_variation_attributes($variation_id);
$stock = get_post_meta($variation_id, '_stock', true);
// Проверяем пустые атрибуты
$empty_attributes = true;
foreach ($attributes as $attr_value) {
if (!empty($attr_value)) {
$empty_attributes = false;
break;
}
}
// Удаляем вариацию если атрибуты пустые или запас 0
if ($empty_attributes || $stock === '0' || $stock === 0) {
wp_delete_post($variation_id, true);
$deleted++;
}
}
return $deleted;
}
// Запуск функции и вывод результата
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_empty_variations'])) {
$count = wpbook_delete_empty_variations();
wp_redirect(admin_url('edit.php?post_type=product&deleted_variations=' . $count));
exit;
}
});Добавьте этот код в файл functions.php вашей активной темы или в кастомный плагин. Для запуска перейдите в админке по адресу https://ваш-сайт/wp-admin/edit.php?post_type=product&delete_empty_variations=1.
Как работает скрипт
- Получает все вариации товаров.
- Проверяет, есть ли у вариаций пустые атрибуты или запас равен нулю.
- Удаляет такие вариации принудительно (без корзины).
Проверка результата после внедрения
После запуска скрипта переходите в Товары > Все товары, откройте любой товар с вариациями и убедитесь, что пустых вариаций больше нет.
Для контрольной проверки выполните SQL-запрос из раздела диагностики — он должен вернуть пустой результат.
Также проверьте, что отчёты WooCommerce обновлены и нет ошибок в админке.
Частые ошибки и как их исправить
- Скрипт не удаляет вариации: Проверьте, что у пользователя есть права
manage_woocommerceи что URL содержит параметрdelete_empty_variations=1. - Удаляются не те вариации: Убедитесь, что проверка атрибутов и запаса корректно реализована — пустые строки и
nullсчитаются пустыми. - Появились ошибки при удалении: Проверьте, что нет ограничений на уровне базы данных или плагинов по безопасности, запрещающих удаление постов.
Практические советы по безопасности и производительности
- Запускайте скрипт на тестовом сервере перед продакшеном.
- Для больших магазинов с тысячами вариаций разбивайте удаление на части, чтобы не перегружать сервер.
- Делайте резервную копию базы данных перед массовым удалением.
- Для регулярной чистки используйте WP-Cron для запуска функции с интервалом (например, раз в неделю), чтобы не нагружать сайт.
Сравнение вариантов удаления пустых вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Много времени, риск пропуска вариаций |
| SQL-запросы напрямую в базе | Быстрое удаление | Риск повреждения данных, требует знаний SQL |
| PHP-скрипт (как в статье) | Автоматизация, безопасное удаление через WP API | Необходимость писать и запускать код |