Диагностика проблемы с вариациями в WooCommerce
На больших интернет-магазинах WooCommerce часто накапливаются неиспользуемые вариации товаров — например, вариации без заказов, которые создавались для тестов или остались от изменённых атрибутов. Такие вариации занимают место в базе данных, замедляют загрузку страниц и усложняют управление товарами.
Чтобы определить, есть ли неиспользуемые вариации, можно проверить наличие вариаций без продаж и без наличия на складе. Простой SQL-запрос для диагностики:
SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_itemmeta oim ON p.ID = oim.meta_value
WHERE p.post_type = 'product_variation'
AND oim.meta_key = '_variation_id'
AND oim.meta_value IS NULL;Этот запрос возвращает вариации, которые не связаны с заказами в магазине.
Пошаговое решение: удаление неиспользуемых вариаций через PHP
1. Создаём функцию для выборки неиспользуемых вариаций
Ниже пример кода, который ищет вариации без заказов и без остатков на складе, а затем удаляет их:
function delete_unused_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->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
GROUP BY p.ID
HAVING COUNT(oim.meta_value) = 0 AND (pm.meta_value IS NULL OR pm.meta_value = '0')"
);
if (empty($variations)) {
return "Не найдено неиспользуемых вариаций для удаления.";
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true);
}
return 'Удалено вариаций: ' . count($variations);
}2. Запуск функции через WP-CLI или временный вызов
Для безопасного удаления запускайте функцию через WP-CLI или добавьте временный хук в functions.php, например:
add_action('init', function() {
if (current_user_can('administrator') && isset($_GET['delete_unused_variations'])) {
echo delete_unused_variations();
exit;
}
});После вызова удалите этот код или уберите параметр из URL.
Проверка результата после внедрения
- Запустите SQL-запрос из раздела «Диагностика» повторно. Он должен вернуть пустой результат.
- Проверьте админку WooCommerce — количество вариаций должно уменьшиться.
- Просмотрите журнал ошибок и логи сервера: не должно быть ошибок удаления.
Частые ошибки и способы их исправления
- Удаляются активные вариации с остатками — Проверьте правильность условий в запросе, особенно проверку наличия на складе (
_stock). - Функция ничего не удаляет — Возможно, вариаций без заказов и остатков нет. Проверьте выборку в SQL отдельно.
- Зависания при большом количестве вариаций — Реализуйте удаление пакетами, добавляя
LIMITи вызывая функцию несколько раз.
Практические советы по производительности и безопасности
- Перед удалением сделайте резервную копию базы данных.
- Используйте WP-CLI для запуска массовых операций — это снижает нагрузку на сайт и позволяет удобнее контролировать процесс.
- Удаляйте вариации пакетами по 100–200 штук, чтобы избежать тайм-аутов.
- Для автоматизации можно настроить WP-Cron с запуском функции удаления раз в месяц.
Сравнение подходов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Sweep, Advanced Database Cleaner) | Удобный интерфейс, безопасные проверки, автоматизация | Могут быть избыточными, влияют на производительность, не всегда гибкие |
| Код (как в статье) | Полный контроль, минимальная нагрузка, гибкость под задачу | Требует навыков, риск ошибок без тестирования |