Диагностика проблемы: когда и зачем удалять варианты товаров
В WooCommerce вариант товара (variation) — это отдельный товар с уникальным ID, который может иметь собственный запас, цену и атрибуты. Иногда после первой продажи возникает задача удалить этот конкретный вариант, например, если он больше не производится или не доступен для повторной продажи. Однако просто удаление варианта из админки может привести к ошибкам в заказах и базе данных, если продажа уже есть.
Основная проблема: стандартные инструменты WooCommerce не позволяют безопасно удалить вариант после первой продажи без потери данных и сбоев в отчетности.
Как проверить статус варианта товара и продажи
Для начала убедитесь, что у варианта есть продажи. Используйте следующий SQL-запрос в базе данных (через phpMyAdmin или wp-cli):
SELECT order_item_id FROM wp_woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = VARIANT_ID LIMIT 1;Замените VARIANT_ID на ID варианта. Если запрос возвращает результат — есть хотя бы одна продажа.
Или программно с помощью PHP:
function has_sales( $product_id ) {
$args = [
'limit' => 1,
'status' => 'completed',
'return' => 'ids',
'meta_query' => [
[
'key' => '_product_id',
'value' => $product_id,
],
],
];
$orders = wc_get_orders( $args );
return !empty( $orders );
}Пошаговое решение: безопасное удаление варианта товара после первой продажи
Шаг 1: Снять вариант с продажи (скрыть)
Удаление варианта из публичного каталога — первый и обязательный шаг. Это можно сделать программно:
$variation = wc_get_product( VARIANT_ID );
if ( $variation ) {
$variation->set_status( 'private' ); // скрыть вариант
$variation->save();
}Или через админку — смените статус варианта на "Черновик" или "Приватный".
Шаг 2: Отключить возможность добавления варианта в корзину
Чтобы покупатели не могли добавить вариант в корзину, даже если он виден, добавьте фильтр:
add_filter( 'woocommerce_variation_is_purchasable', function( $purchasable, $variation ) {
if ( $variation->get_id() === VARIANT_ID ) {
return false;
}
return $purchasable;
}, 10, 2 );Шаг 3: Удалить вариацию из базы (с условием сохранения истории заказов)
Удалять вариант напрямую через стандартный метод wp_delete_post() нельзя, потому что WooCommerce хранит связи с заказами. Вместо удаления, очистите данные варианта, чтобы он не использовался:
- Обнулите остаток
- Сбросьте цены
- Удалите атрибуты
$variation = wc_get_product( VARIANT_ID );
if ( $variation ) {
$variation->set_regular_price( '' );
$variation->set_sale_price( '' );
$variation->set_stock_quantity( 0 );
$variation->set_manage_stock( true );
$variation->set_status( 'private' );
$variation->save();
}Так вариант останется в базе для отчетов, но будет полностью недоступен для покупателей.
Шаг 4: Обновить родительский товар
Если необходимо, обновите атрибуты родительского товара, чтобы вариант не отображался в списках выбора.
$parent = wc_get_product( PARENT_PRODUCT_ID );
if ( $parent && $parent->is_type( 'variable' ) ) {
$attributes = $parent->get_attributes();
// удаляем атрибут варианта из массива
// затем сохраняем измененный массив
$parent->set_attributes( $attributes );
$parent->save();
}Проверка результата после внедрения
- Вариант отсутствует в каталоге и на странице товара.
- Попытка добавить в корзину возвращает ошибку или невозможна.
- История заказов с этим вариантом сохраняется без ошибок.
- В базе данных вариант присутствует, но с нулевыми запасами и без цены.
Частые ошибки и как их исправить
- Удаление варианта напрямую через wp_delete_post: приводит к потере связи с заказами и ошибкам в отчетах WooCommerce. Используйте метод «скрытия» и очистки данных.
- Вариант остается доступен для покупки: проверьте фильтр
woocommerce_variation_is_purchasableи статус варианта. - Атрибут варианта не удален у родительского товара: обновите атрибуты родителя, иначе вариант будет отображаться в списках выбора.
Практические советы по безопасности и производительности
- Перед внесением изменений сделайте полный бэкап базы и файлов.
- Используйте транзакции базы данных, если работаете с несколькими изменениями одновременно.
- Для массовой обработки вариантов после первой продажи пишите WP-CLI команды, чтобы не нагружать сайт.
- Ограничьте права доступа к скриптам удаления вариантов, чтобы избежать несанкционированных операций.
Сравнение вариантов удаления варианта товара WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Прямое удаление через wp_delete_post | Полное удаление | Потеря истории продаж, ошибки отчетов |
| Скрытие и очистка данных варианта (рекомендуется) | Безопасно для отчетности, вариант не доступен | Вариант остается в базе |
| Удаление атрибута у родительского товара без очистки варианта | Вариант не виден в выборе | Вариант доступен через прямую ссылку, возможны ошибки |