Диагностика проблемы: почему накапливаются неиспользуемые вариации
В WooCommerce при продаже товаров с вариациями могут оставаться вариации, которые больше не актуальны — например, если вариация распродана или снята с производства и больше не должна отображаться. Такие вариации загромождают базу данных, замедляют работу сайта и усложняют управление каталогом. Ручное удаление вариаций становится трудоемким, особенно при большом ассортименте.
Что значит "неиспользуемые вариации" в контексте WooCommerce?
Под неиспользуемыми вариациями мы понимаем вариации, которые:
- Уже не продаются, т.е. их запас равен нулю и не пополняется;
- Не отображаются в каталоге;
- Не связаны с активными заказами;
- Не используются в других местах сайта, например, в избранном или отложенных товарах.
Пошаговое решение: автоматическое удаление вариаций после продажи
1. Подключение к хуку завершения заказа
Для запуска проверки и удаления неиспользуемых вариаций будем использовать хук woocommerce_order_status_completed. Это событие срабатывает, когда заказ переведен в статус "завершен".
2. Определение вариаций из заказа и проверка их запаса
Из заказа нужно получить все вариации и проверить их наличие на складе. Если запас равен нулю, запускаем удаление.
3. Удаление вариаций с помощью функции wp_delete_post
Удаление вариации — это удаление поста типа product_variation в базе WordPress.
Пример кода для functions.php или собственного плагина:
add_action('woocommerce_order_status_completed', 'auto_delete_unused_variations_after_sale', 10, 1);
function auto_delete_unused_variations_after_sale($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
foreach ($order->get_items() as $item) {
$product = $item->get_product();
// Проверяем, что продукт — вариация
if ($product && $product->is_type('variation')) {
$stock_quantity = $product->get_stock_quantity();
$manage_stock = $product->managing_stock();
// Удаляем вариацию, если управляем запасом и количество 0 или меньше
if ($manage_stock && $stock_quantity <= 0) {
wp_delete_post($product->get_id(), true); // true — принудительное удаление без корзины
}
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ с вариацией товара, у которой запас равен 1.
- Завершите заказ через админку или через фронтенд.
- После завершения заказа проверьте, уменьшился ли запас вариации. Если запас стал 0, вариация должна удалиться из базы.
- Проверьте наличие вариации в списке товаров WooCommerce — её не должно быть.
- Если вариация не удалена — проверьте логи ошибок и права пользователя, под которым запускается код.
Частые ошибки и как их исправить
- Вариации не удаляются: проверьте, что функция вызывается при смене статуса заказа. Логируйте вызов функции и ID вариаций для отладки.
- Удаляются нужные вариации: убедитесь, что проверка запаса корректна и не затрагивает вариации с положительным остатком.
- Ошибка прав доступа: функция
wp_delete_postтребует определенных прав. Запускать код лучше от имени администратора или в контексте WordPress с полными правами. - Конфликты с другими плагинами: отключите кеширование на время теста, чтобы увидеть реальные изменения.
Практические советы по безопасности и производительности
- Добавьте проверку nonce или ограничьте выполнение кода только на фронтенде администратора для исключения сторонних вызовов.
- Используйте транзакции базы данных, если удаление вариаций требует комплексных действий, например, очистки метаданных.
- Периодически делайте бэкап базы перед массовыми удалениями.
- Для больших магазинов с тысячами вариаций рассмотрите выполнение удаления партиями через WP-Cron, чтобы избежать таймаутов.
Сравнение подходов удаления вариаций
| Подход | Преимущества | Недостатки |
|---|---|---|
| Удаление вручную через админку | Простой контроль, не требует кода | Трудозатратно, ошибочно можно удалить нужные вариации |
| Автоматическое удаление через код (хук заказа) | Экономит время, точечное удаление | Требует тестирования, возможны ошибки при неправильной логике |
| Плагины очистки товаров | Готовые решения с интерфейсом | Могут замедлять сайт, не всегда гибкие |