Диагностика проблемы: зачем удалять неиспользуемые вариации
В WooCommerce вариации продуктов — это отдельные записи типа product_variation. При частых изменениях каталога, тестировании или импортах в базе накапливаются вариации, которые больше не связаны с родительским товаром или не используются в каталоге. Это увеличивает размер базы, замедляет запросы и усложняет админку.
Как определить неиспользуемые вариации
Обычно неиспользуемые вариации — это:
- вариации без существующего родительского товара;
- вариации, отключённые или скрытые, которые не продаются и не отображаются;
- вариации с нулевой остаточной доступностью и без возможности заказа.
Для диагностики можно выполнить SQL-запрос, чтобы найти вариации без родителя:
SELECT p.ID FROM wp_posts p LEFT JOIN wp_posts parent ON p.post_parent = parent.ID WHERE p.post_type = 'product_variation' AND (parent.ID IS NULL OR parent.post_status != 'publish');Если таких записей много — пора чистить.
Пошаговое решение: удаление неиспользуемых вариаций через код
1. Создаём WP-CLI команду для безопасного удаления
WP-CLI позволяет выполнять команды из терминала. Создадим кастомную команду, которая удалит вариации без родителей и скрытые вариации с нулевой доступностью.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc-clean-unused-variations', function() {
global $wpdb;
// Получаем вариации без родителя
$orphans = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID WHERE p.post_type = 'product_variation' AND (parent.ID IS NULL OR parent.post_status != 'publish')");
// Удаляем вариации без родителей
foreach ($orphans as $variation_id) {
wp_delete_post($variation_id, true);
}
// Получаем вариации с нулевым запасом и скрытые
$hidden_variations = $wpdb->get_col(
"SELECT p.ID FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock'
JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_stock_status'
WHERE p.post_type = 'product_variation' AND
(p.post_status = 'private' OR pm2.meta_value = 'outofstock') AND
pm1.meta_value = '0'"
);
foreach ($hidden_variations as $variation_id) {
wp_delete_post($variation_id, true);
}
WP_CLI::success('Удалены неиспользуемые вариации продуктов: ' . count($orphans) . ' без родителей, ' . count($hidden_variations) . ' скрытых с нулевым запасом.');
});
}2. Запуск команды
Подключитесь к серверу по SSH, перейдите в папку сайта и выполните:
wp wc-clean-unused-variationsКоманда удалит найденные вариации и выведет количество удалённых.
Проверка результата после внедрения
- В админке WooCommerce проверьте раздел «Вариации» у продуктов — не должно быть мёртвых записей.
- Запустите повторно SQL-запрос из диагностики — он должен вернуть пустой результат.
- Проверьте размер таблиц
wp_posts,wp_postmeta— уменьшение данных будет заметно при большом количестве удалённых вариаций.
Частые ошибки и как их исправить
- Ошибка: WP-CLI команда не найдена
Причина: WP-CLI не установлен или не подключена команда.
Решение: Установите WP-CLI и убедитесь, что файл с командой загружается (например, в functions.php или через mu-плагин). - Ошибка: Некоторые вариации не удаляются
Причина: Вариации имеют зависимости или кэш.
Решение: Очистите кэш сайта и проверьте, нет ли сторонних плагинов, блокирующих удаление. - Ошибка: SQL-запрос возвращает ошибки
Причина: Неправильный префикс таблиц.
Решение: Используйте глобальную переменную$wpdb->postsвместо хардкодаwp_posts.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Выполняйте удаление на тестовом сервере, чтобы исключить удаление нужных данных.
- Оптимизируйте таблицы после удаления, выполнив
OPTIMIZE TABLE wp_posts, wp_postmeta;через phpMyAdmin или командную строку. - Для крупных магазинов запускайте очистку в ночное время, чтобы не нагружать сервер при пиковых посещениях.
- Если не хотите писать код — можно использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=premiumwp.ru&utm_medium=article&utm_campaign=woocommerce-kak-udalit-neispolzuemye-variacii-produktov), который содержит функции очистки базы.
Сравнение вариантов удаления неиспользуемых вариаций
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Долго при большом количестве вариаций, риск пропуска | Маленькие магазины с редкими изменениями |
| WP-CLI скрипт (код) | Автоматизация, быстро, гибко настраивается | Требует доступа к серверу и навыков | Средние и крупные магазины, регулярная очистка |
| Плагины (Clearfy Pro и др.) | Простота, дополнительные функции оптимизации | Потенциально лишние функции, стоимость | Если нужна комплексная очистка и SEO-оптимизация |