wpwebsite.ru wordpress WPWebSite

Как удалить вариант товара WooCommerce после первой продажи

Диагностика проблемы: когда и зачем удалять варианты товаров

В 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Полное удалениеПотеря истории продаж, ошибки отчетов
Скрытие и очистка данных варианта (рекомендуется)Безопасно для отчетности, вариант не доступенВариант остается в базе
Удаление атрибута у родительского товара без очистки вариантаВариант не виден в выбореВариант доступен через прямую ссылку, возможны ошибки
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »