Проблема: накопление неиспользуемых вариантов товаров в WooCommerce
Нередко в интернет-магазинах на WooCommerce с течением времени накапливаются вариации товаров, которые не продаются и не нужны. Они занимают место в базе данных, замедляют работу сайта и усложняют администрирование. Задача — быстро и безопасно массово удалить все варианты товаров, которые не имеют продаж (то есть по которым не было заказов), чтобы очистить магазин и улучшить производительность.
Диагностика: как определить варианты без продаж
Для начала нужно понять, какие именно варианты товаров не проданы. В WooCommerce продажи связаны с таблицей wp_woocommerce_order_items и метаданными заказа. Варианты товаров — это дочерние продукты типа variation в таблице wp_posts. Связать их с заказами можно по order_item_id и product_id.
Для быстрой диагностики можно использовать SQL-запрос, чтобы получить ID вариантов без продаж:
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_woocommerce_order_itemmeta oim ON p.ID = oim.meta_value AND oim.meta_key = '_variation_id'
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'product_variation' AND oi.order_item_id IS NULL;Этот запрос выбирает все вариации товаров, по которым нет записей в таблице заказов — то есть без продаж.
Пошаговое решение: как массово удалить варианты без продаж
1. Резервное копирование
Перед выполнением любых операций с базой данных сделайте полное резервное копирование сайта и базы данных.
2. Создание WP-CLI скрипта для удаления вариантов
Самый безопасный и удобный способ — использовать WP-CLI для выборочного удаления. Вот пример команды на PHP, которую можно выполнить через WP-CLI или добавить временно в файл темы:
function delete_unsold_variations() {
global $wpdb;
// Получаем ID вариаций без продаж
$variations = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON p.ID = oim.meta_value AND oim.meta_key = '_variation_id'
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'product_variation' AND oi.order_item_id IS NULL");
if (empty($variations)) {
echo "Нет вариаций без продаж для удаления.\n";
return;
}
foreach ($variations as $var_id) {
wp_delete_post($var_id, true); // принудительное удаление без перемещения в корзину
echo "Удалена вариация ID: $var_id\n";
}
echo "Удалено " . count($variations) . " вариаций без продаж.\n";
}Запустите функцию через WP-CLI с помощью:
wp eval 'delete_unsold_variations();'3. Очистка кэша и обновление метаданных
После удаления рекомендуется очистить кэш сайта и WooCommerce, а также проверить целостность метаданных:
wp cache flush
wp transient delete --allПроверка результата после внедрения
- В админке WooCommerce и в разделе «Вариации» проверьте, что не осталось товаров без продаж.
- Запустите SQL-запрос из раздела диагностики повторно — он должен вернуть пустой результат.
- Проверьте работу фронтенда, чтобы убедиться, что удалённые вариации не отображаются.
Частые ошибки и как их исправить
- Ошибка: удаление не всех вариаций.
Причина: кеширование или неполный запрос.
Решение: очистите кеш, проверьте префиксы таблиц, убедитесь, что используется правильная база данных. - Ошибка: удаление вариаций с продажами.
Причина: неправильное сопоставление по_variation_idили ошибки в запросе.
Решение: внимательно проверьте SQL, протестируйте на выборке. - Ошибка: слишком долгое выполнение удаления при большом количестве вариаций.
Решение: разбейте удаление на партии (batch), используйте WP-CLI с параметром--skip-plugins.
Таблица сравнения способов удаления вариантов без продаж
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| SQL-запрос напрямую | Удаление через SQL DELETE | Быстро | Риск повредить данные, нет очистки метаданных |
| WP-CLI с PHP скриптом | Удаление через wp_delete_post() | Безопасно, удаляет всю связанную информацию | Медленнее, требует доступа к серверу |
| Плагины очистки | Использование плагинов типа Clearfy Pro | Удобно, без кода | Могут не иметь нужной фильтрации |
Практические советы по безопасности и производительности
- Всегда делайте резервную копию перед массовыми удалениями.
- Тестируйте код на тестовом сайте, чтобы избежать потери данных.
- Используйте WP-CLI для ускорения и контроля процесса.
- Очищайте кеш и transient после удаления.
- Проверяйте нагрузку на сервер при массовых операциях, разбивайте задачи на части.