Диагностика проблемы с неиспользуемыми вариациями в WooCommerce
В WooCommerce часто накапливаются вариации продуктов, которые не используются или устарели. Это происходит из-за частых изменений в ассортименте, автоматического импорта и тестирования различных вариантов. Наличие лишних вариаций негативно влияет на производительность сайта, увеличивает размер базы данных и усложняет админку.
Чтобы проверить, есть ли неиспользуемые вариации, можно выполнить запрос к базе данных или использовать WP-CLI. Например, запрос SQL для подсчёта вариаций, не связанных с активными продуктами:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish');Если результат велик — пора очистить базу.
Пошаговое решение: удаляем неиспользуемые вариации через пользовательский PHP-скрипт
1. Создаём функцию для удаления «осиротевших» вариаций
Вариации, у которых нет активного родительского продукта, считаются неиспользуемыми. Удалим их программно.
function premiumwp_delete_unused_variations() {
global $wpdb;
// Получаем ID вариаций без существующего опубликованного родителя
$query = "
SELECT v.ID FROM {$wpdb->posts} v
LEFT JOIN {$wpdb->posts} p ON v.post_parent = p.ID
WHERE v.post_type = 'product_variation'
AND (p.ID IS NULL OR p.post_status != 'publish')
";
$variations = $wpdb->get_col($query);
if (empty($variations)) {
return 'Неиспользуемые вариации не найдены.';
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Полное удаление
}
return 'Удалено вариаций: ' . count($variations);
}2. Запускаем удаление через WP-CLI или временно добавляем вызов функции
Лучше всего вызвать эту функцию через WP-CLI:
wp eval 'echo premiumwp_delete_unused_variations();'Или временно добавьте вызов функции в functions.php темы и обновите сайт один раз:
add_action('init', function() {
if (current_user_can('administrator') && isset($_GET['delete_unused_variations'])) {
echo premiumwp_delete_unused_variations();
exit;
}
});После запуска удалите этот код.
Проверка результата после внедрения
После удаления повторите SQL-запрос из раздела диагностики. Количество неиспользуемых вариаций должно быть нулевым. В админке WooCommerce проверьте список вариаций — лишних не должно остаться.
Также можно запустить WP-CLI команду для подсчёта вариаций:
wp post list --post_type=product_variation --format=ids | wc -wЧастые ошибки и как их исправить
- Удаление нужных вариаций: Если родитель не опубликован, но планируется публикация — вариация удалится. Решение: запускать удаление на сайтах с актуальным статусом продуктов.
- Ошибка прав доступа: Функция wp_delete_post требует прав администратора. Запускайте только под админом.
- Больше вариаций, чем ожидалось: В WooCommerce возможны вариации с родителями в черновиках или на паузе — они тоже удалятся. Проверьте статус, если это критично, и модифицируйте запрос.
Практические советы по безопасности и производительности
- Перед запуском очистки сделайте резервную копию базы данных.
- Запускайте удаление в периоды низкой нагрузки.
- Для больших магазинов разбивайте удаление на части, чтобы не перегружать сервер.
- Используйте WP-CLI для удобства и безопасности.
Альтернативные способы удаления вариаций: сравнение
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, визуальный контроль | Долго, неудобно при большом количестве |
| Плагины очистки базы (например, WP Sweep) | Автоматизация, дополнительные функции | Могут удалять лишнее, нагрузка на сайт |
| Кодовое решение (описано в статье) | Точный контроль, можно адаптировать | Требует знаний, риск удаления нужных данных |