Что такое неиспользуемые варианты товаров в WooCommerce и почему их нужно удалять
В WooCommerce под вариантами товаров понимаются вариации переменных товаров (variable products) с разными атрибутами — цвет, размер, материал и т.д. Иногда после обновления каталога или импорта остаются варианты, которые больше не используются в продаже: устаревшие, дублирующиеся или ошибочные. Они занимают место в базе данных, замедляют работу сайта и могут запутать покупателей.
Автоматическое удаление таких вариантов помогает поддерживать базу данных в чистоте и улучшить производительность магазина.
Диагностика проблемы: как определить неиспользуемые варианты товаров
Чтобы понять, какие варианты товаров можно удалить, нужно определить критерии «неиспользуемости». Частые признаки:
- Варианты без назначенного статуса «в наличии» и без заказов;
- Варианты, которые не отображаются на сайте или выключены (статус «черновик» или «приватный»);
- Варианты без мета-данных или с устаревшими атрибутами, не совпадающими с текущими атрибутами родительского товара;
- Варианты, которые не связаны с активными переменными товарами.
Проверить количество вариантов у товаров можно через запрос к базе данных:
SELECT p.ID, p.post_title, COUNT(v.ID) as variations_count
FROM wp_posts p
LEFT JOIN wp_posts v ON v.post_parent = p.ID AND v.post_type = 'product_variation'
WHERE p.post_type = 'product'
GROUP BY p.ID
ORDER BY variations_count DESC;Так вы получите список товаров и количество их вариантов. Для диагностики вариаций без заказов и неактивных вариантов используйте SQL-запросы с условиями по статусу и связям с заказами.
Пошаговое решение: скрипт для автоматического удаления неиспользуемых вариантов
Оптимальное решение — написать функцию для регулярного запуска (через WP-Cron или вручную), которая:
- Получает все варианты товаров;
- Проверяет статус варианта и наличие заказов;
- Удаляет варианты, подходящие под критерий «неиспользуемый».
Пример кода для functions.php или отдельного плагина:
function wc_delete_unused_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private', 'draft', 'pending'],
'fields' => 'ids',
];
$variation_ids = get_posts($args);
foreach ($variation_ids as $variation_id) {
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing', 'on-hold'],
'meta_key' => '_product_id',
'meta_value' => $variation_id,
]);
$status = get_post_status($variation_id);
// Удаляем вариант, если нет заказов и статус не 'publish'
if (empty($orders) && $status !== 'publish') {
wp_delete_post($variation_id, true);
}
}
}
// Запуск вручную или через WP-Cron
// wc_delete_unused_variations();Ключевые моменты кода:
- Получаем варианты с разными статусами (включая черновики и приватные);
- Проверяем, есть ли связанные с вариантом заказы с определённым статусом;
- Удаляем вариант, если он не опубликован и не используется в заказах.
Как проверить, что удаление сработало корректно
После запуска скрипта проверьте:
- В админке WooCommerce: количество вариантов у переменных товаров уменьшилось;
- Через SQL-запросы нет вариантов с черновым статусом, не связанным с заказами;
- Функция
wp_delete_postсрабатывает без ошибок — логи можно посмотреть в debug.log; - На фронтенде не исчезают нужные варианты и нет ошибок при оформлении заказа.
Частые ошибки и как их исправить
- Удаление активных вариантов с заказами: ошибка в логике проверки заказов. Проверьте, что мета-поля заказа действительно содержат ID варианта, а не родительского товара. Для точной проверки используйте WC_Order_Item_Product и метод
get_variation_id(). - Удаление вариантов с статусом «publish»: скрипт должен исключать опубликованные варианты, иначе удалите активные позиции. Проверьте условие
$status !== 'publish'. - Неверное получение заказов: функция
wc_get_ordersне всегда фильтрует по вариациям. Лучше использовать цикл по заказам и проверять товарные позиции вручную. - Проблемы с производительностью при большом каталоге: запросы без пагинации могут привести к нагрузке. Используйте постраничный обход с
pagedиposts_per_page.
Практические советы по безопасности и производительности
- Перед запуском скрипта сделайте резервное копирование базы данных.
- Используйте транзакции и логи для отслеживания удаления.
- Запускайте удаление не чаще 1 раза в сутки, чтобы избежать перегрузок.
- Для больших магазинов реализуйте постраничное удаление с сохранением состояния.
- Используйте WP-CLI для запуска скрипта командой, чтобы избежать таймаутов веб-сервера.
Сравнение подходов удаления неиспользуемых вариантов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Затратно по времени, риск пропустить варианты | WooCommerce > Товары > Вариации |
| SQL-запросы для массового удаления | Быстро, мощно | Риск удаления нужных данных, требует бэкапа | DELETE FROM wp_posts WHERE post_type='product_variation' AND ... |
| PHP-скрипт с проверкой заказов (рекомендовано) | Точный, безопасный, автоматизируемый | Нужно писать код, тестировать | Пример в статье |