Диагностика проблемы неиспользуемых вариаций в WooCommerce
В WooCommerce часто накапливаются вариации товаров, которые больше не нужны: устаревшие размеры, цвета, комбинации. Это увеличивает размер базы данных, замедляет работу админки и влияет на производительность сайта. Чтобы убедиться, что у вас есть неиспользуемые вариации, откройте страницу редактирования товара и проверьте список вариаций. Если там есть варианты, которые не продаются или не используются в каталоге, их стоит удалить.
Другой способ диагностики — запрос к базе данных для подсчёта вариаций:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';Если число вариаций значительно превышает количество активных товаров, вероятно, есть «мусор».
Пошаговое решение: удаление неиспользуемых вариаций через код
1. Создание резервной копии базы данных
Перед любыми изменениями сделайте полную резервную копию базы данных. Можно использовать плагины типа UpdraftPlus или экспортировать базу через phpMyAdmin.
2. Идентификация вариаций для удаления
Чаще всего нужно удалить вариации без заказов, без активности или с определёнными атрибутами. Ниже пример кода для удаления вариаций, у которых нет заказов и которые не продаются более 6 месяцев:
function delete_unused_variations() {
global $wpdb;
$date_threshold = date('Y-m-d', strtotime('-6 months'));
// Получаем ID вариаций, которые не были проданы и не обновлялись
$variations = $wpdb->get_col(
$wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN {$wpdb->posts} o ON oi.order_id = o.ID AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product_variation'
AND (o.ID IS NULL OR o.post_date < %s)
AND p.post_modified < %s",
$date_threshold, $date_threshold
)
);
if (!empty($variations)) {
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Жёсткое удаление
}
}
}3. Запуск удаления вручную или через WP-CLI
Для однократного запуска добавьте вызов функции в файл functions.php активной темы или в отдельный плагин:
add_action('admin_init', 'delete_unused_variations');После выполнения удалите этот хук, чтобы функция не запускалась постоянно.
Альтернативно можно использовать WP-CLI для запуска SQL-запросов и удаления, что быстрее и безопаснее на больших сайтах.
Проверка результата после внедрения
После удаления проверьте количество вариаций с помощью SQL-запроса:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';Также убедитесь, что на сайте не сломались страницы товаров с вариациями, и что удалённые варианты не отображаются в каталоге и в админке.
Частые ошибки и как их исправить
- Удаление нужных вариаций. Ошибка в критериях отбора может привести к удалению активных вариантов. Всегда тестируйте на тестовом сайте и делайте резервные копии.
- Неправильный SQL-запрос. Специфика таблиц WooCommerce требует аккуратности с JOIN и условиями. Используйте подготовленные запросы и проверяйте результат выборки до удаления.
- Кэширование. Не забывайте очищать кэш сайта и Object Cache после удаления, чтобы изменения отобразились.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед массовым удалением.
- Запускайте удаление в периоды низкой нагрузки, чтобы не перегрузить сервер.
- Используйте WP-CLI для больших сайтов — это безопаснее и быстрее.
- Очищайте кэш (например, через плагин Clearfy Pro) после изменений в базе.
- Регулярно оптимизируйте таблицы базы данных с помощью
OPTIMIZE TABLE wp_posts;.
Сравнение способов удаления вариаций
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление через админку | Ручное удаление вариаций в интерфейсе товара | Просто, визуально контролируемо | Медленно, неудобно для большого количества |
| Код в functions.php | Автоматическое удаление по критериям | Автоматизация, гибкость | Риск ошибок, требует тестирования |
| WP-CLI | Удаление через командную строку | Быстро, удобно для больших сайтов | Требует доступа к серверу и навыков |