Диагностика проблемы с неиспользуемыми вариантами товаров в WooCommerce
В крупных магазинах на WooCommerce часто накапливаются варианты товаров, которые не продаются и не используются. Это увеличивает размер базы данных, замедляет админку и усложняет управление товарами. Задача — найти и удалить такие варианты без использования дополнительных плагинов, чтобы сохранить контроль над процессом и избежать излишней нагрузки.
Как определить неиспользуемые варианты?
Неиспользуемые варианты — это товары с типом product_variation, у которых нет продаж (отсутствуют записи в таблице заказов) и которые не отображаются в каталоге (статус «черновик» или «приватный»), либо имеют нулевой остаток и неактивны.
Пошаговое решение: удаление неиспользуемых вариантов через WP-CLI и PHP
1. Подготовка: резервное копирование базы данных
Перед любыми удалениями обязательно сделайте резервную копию базы данных, чтобы иметь возможность восстановить данные.
2. Поиск неиспользуемых вариантов
Пример запроса для поиска вариантов без продаж:
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
WHERE p.post_type = 'product_variation' AND oi.order_item_id IS NULL;Этот пример показывает базовую логику, но лучше использовать WP_Query для корректной работы с WordPress.
3. Скрипт для удаления неиспользуемых вариантов
Ниже пример функции на PHP, которую можно добавить в файл functions.php вашей темы или в отдельный плагин для разовой очистки:
function wc_delete_unused_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private', 'draft'],
];
$variations = get_posts($args);
$deleted = 0;
foreach ($variations as $variation) {
$sales_count = wc_get_product($variation->ID)->get_total_sales();
$stock = wc_get_product($variation->ID)->get_stock_quantity();
// Условие: нет продаж и нет остатка
if ($sales_count == 0 && ($stock === null || $stock <= 0)) {
wp_delete_post($variation->ID, true); // принудительное удаление
$deleted++;
}
}
return $deleted;
}4. Запуск и проверка результата
Вызовите функцию через do_action или временно вставьте вызов в нужное место. Например, для однократного запуска через админку:
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_unused_variations'])) {
$count = wc_delete_unused_variations();
echo "Удалено вариантов: $count";
exit;
}
});Перейдите в админку по адресу https://ваш_сайт/wp-admin/?delete_unused_variations=1. После выполнения вы увидите количество удалённых вариантов.
Проверка результата после внедрения
- Проверьте базу данных через phpMyAdmin или WP-CLI: количество записей
product_variationуменьшилось. - В админке WooCommerce проверьте список товаров: отсутствуют неиспользуемые варианты.
- Проверьте работоспособность каталога и заказов, чтобы убедиться, что удалены только неиспользуемые варианты.
Частые ошибки и как их исправить
- Удаление активных вариантов с остатком или продажами: Проверьте логику условий в коде, используйте
get_total_sales()иget_stock_quantity()корректно. - Отсутствие резервной копии: всегда делайте бэкап перед массовыми удалениями.
- Неправильный статус варианта: учитывайте, что варианты могут иметь статусы не только «publish», но и «private» или «draft».
- Ошибки прав доступа: запускать удаление должен пользователь с правами администратора или менеджера WooCommerce.
Практические советы по безопасности и производительности
- Для больших магазинов используйте WP-CLI с аналогичной логикой, чтобы избежать таймаутов и перегрузки сервера.
- Разбейте удаление на порции (например, по 100 вариантов за раз) — это уменьшит нагрузку.
- Добавьте логирование удалённых ID в файл для последующего аудита.
- Ограничьте запуск функции через URL только авторизованными администраторами.
Сравнение способов удаления неиспользуемых вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, визуально | Медленно, неэффективно для больших магазинов |
| Использование плагинов (например, WP Bulk Delete) | Автоматизация, удобный интерфейс | Дополнительная нагрузка, зависимость от стороннего кода |
| Код на PHP + WP-CLI | Гибкость, полный контроль, без лишних плагинов | Требует навыков, риск ошибок без резервного копирования |