Проблема: накопление неиспользуемых вариантов товаров в WooCommerce
В WooCommerce часто накапливаются варианты товаров, которые больше не нужны — например, устаревшие размеры, цвета или сложные вариации, которые не продаются. Это увеличивает нагрузку на базу данных и усложняет админку. При этом многие пользователи ищут способ удалить такие варианты без установки дополнительных плагинов, чтобы не перегружать сайт.
Диагностика неиспользуемых вариантов товаров
Для начала нужно четко определить, какие варианты считать неиспользуемыми. Чаще всего это варианты, у которых нет продаж и которые не отображаются на сайте.
- Проверяем варианты без заказов и без остатков на складе.
- Ищем варианты, которые не были обновлены или просмотрены долгое время.
- Отличаем переменные товары от простых — удаляем только дочерние варианты.
Для диагностики используйте SQL-запросы к базе данных или WP_Query с мета-параметрами.
Пример SQL-запроса для выявления неиспользуемых вариантов
SELECT p.ID, p.post_parent, p.post_title 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
AND p.post_status = 'publish';Этот запрос ищет варианты товаров без связанных заказов. Для более точной фильтрации можно добавить условия по мета-данным (например, остаткам).
Пошаговое решение удаления неиспользуемых вариантов
- Создайте резервную копию базы данных — удаление вариантов влияет напрямую на данные.
- Подключитесь к сайту через FTP или SSH, чтобы выполнить PHP-скрипт или WP-CLI команды.
- Напишите PHP-скрипт для выборки и удаления вариантов по критериям:
function delete_unused_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
],
],
'fields' => 'ids',
];
$variations = get_posts($args);
foreach ($variations as $variation_id) {
$orders = wc_get_orders([
'limit' => 1,
'variation_id' => $variation_id,
]);
if (empty($orders)) {
wp_delete_post($variation_id, true);
}
}
}
add_action('init', 'delete_unused_variations');Этот код удалит варианты с нулевым остатком и без заказов. Можно доработать фильтры по другим параметрам.
Проверка результата удаления
- В админке WooCommerce проверьте количество вариаций у продуктов — их должно стать меньше.
- Выполните повторный SQL-запрос, чтобы убедиться, что неиспользуемые варианты удалены.
- Проверьте логи ошибок, чтобы исключить сбои.
- Проверьте работу сайта и корзины, чтобы убедиться, что не удалены нужные варианты.
Частые ошибки и их исправление
- Удаление активных вариантов — исправляется доработкой фильтров (например, исключением вариантов с остатком или недавно проданных).
- Скрипт не удаляет варианты — проверьте права пользователя, убедитесь, что хук init срабатывает, или используйте WP-CLI.
- Повреждение базы данных — всегда создавайте резервные копии перед удалением.
- Долгая работа скрипта — разбивайте удаление на партии или запускайте через WP-CLI с ограничением по времени.
Практические советы по безопасности и производительности
- Удаляйте варианты партиями по 50-100 штук, чтобы не нагружать сервер.
- Используйте WP-CLI для массовых операций — быстрее и стабильнее.
- Проверяйте права пользователя, чтобы скрипт запускался только администратором.
- Оптимизируйте базу данных после удаления (например, через Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpexamples.ru&utm_medium=article&utm_campaign=woocommerce-udalit-neispolzuemye-varianti-tovarov-bez-plaginov).
- Добавьте логирование удаляемых вариантов, чтобы можно было откатить ошибочные действия.
Сравнение методов удаления вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP-скрипт через хук init | Простой, без плагинов | Может замедлить загрузку сайта, требует осторожности |
| WP-CLI команда | Быстро, без нагрузки на сайт | Требует доступа к серверу |
| Плагины очистки | Удобный интерфейс, дополнительные функции | Дополнительная нагрузка, риск конфликтов |