WooCommerce: как автоматически удалять товары после продажи

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

В WooCommerce часто возникает необходимость удалять товар из каталога сразу после его продажи — например, для уникальных товаров, услуг с ограниченным количеством или товаров под заказ. Если этого не сделать, покупатель или администратор могут случайно повторно продать товар, что вызовет проблемы с логистикой и репутацией.

Стандартного решения в WooCommerce для автоматического удаления товара после успешной продажи нет, поэтому требуется кастомизация через хуки и код.

Пошаговое решение: удаление товара после оплаты заказа

1. Определяем событие для удаления товара

Лучший момент для удаления товара — после успешной оплаты (статус "processing" или "completed"). Для этого используем хук woocommerce_order_status_completed или woocommerce_order_status_processing.

2. Получаем список товаров из заказа и удаляем их

В функции-обработчике пробегаемся по всем товарам заказа, получаем ID товара и удаляем запись из базы через wp_delete_post().

3. Пример рабочего кода

add_action('woocommerce_order_status_completed', 'auto_delete_products_after_sale', 10, 1);

function auto_delete_products_after_sale( $order_id ) {
    if ( ! $order_id ) return;

    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    foreach ( $order->get_items() as $item_id => $item ) {
        $product_id = $item->get_product_id();
        // Проверяем, что это простой или вариативный продукт
        if ( $product_id ) {
            // Удаляем товар
            wp_delete_post( $product_id, true ); // true - принудительное удаление без корзины
        }
    }
}

Проверка результата после внедрения

  • Создайте тестовый заказ, добавив уникальный товар.
  • Оплатите заказ (можно использовать тестовый платежный шлюз).
  • После смены статуса заказа на "завершён" проверьте, что товар исчез из админки (Раздел "Товары").
  • Если товар не удалился, проверьте логи ошибок и наличие прав у пользователя веб-сервера.

Частые ошибки и как их исправить

  • Товар не удаляется после оплаты — возможно, используется нестандартный статус заказа. Проверьте, что событие срабатывает на нужном хуке. Для других статусов подключите дополнительные хуки woocommerce_order_status_processing.
  • Удаляются все товары без исключения — если нужно удалять только определённые товары, добавьте проверку по ID, категории или метаполям.
  • Ошибка прав доступа — убедитесь, что процесс запускается с достаточными правами, и функция wp_delete_post() не блокируется плагинами безопасности.
  • Удаление товара с вариациями — убедитесь, что удаляются все посты вариаций (post_type = 'product_variation'). Можно добавить дополнительный цикл удаления вариаций перед удалением основного товара.

Практические советы по безопасности и производительности

  • Используйте wp_delete_post($product_id, true) для полного удаления товара без помещения в корзину, чтобы избежать лишних данных в базе.
  • Добавьте проверку nonce и прав пользователя, если добавляете интерфейс для включения этой функции.
  • Если у вас большой магазин, удаление товаров может замедлить процесс обработки заказа — сделайте удаление асинхронным через WP-Cron или очередь.
  • Резервное копирование базы перед автоматическим удалением поможет избежать потери данных.

Дополнительная настройка: удаление вариаций и товаров по условию

function auto_delete_products_after_sale( $order_id ) {
    if ( ! $order_id ) return;

    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    foreach ( $order->get_items() as $item_id => $item ) {
        $product_id = $item->get_product_id();
        if ( $product_id ) {
            // Удаляем вариации если есть
            $variations = get_posts(array(
                'post_type' => 'product_variation',
                'post_parent' => $product_id,
                'numberposts' => -1
            ));
            foreach ( $variations as $variation ) {
                wp_delete_post( $variation->ID, true );
            }

            // Условие удаления: только товары из категории "уникальные"
            if ( has_term( 'unikalnye', 'product_cat', $product_id ) ) {
                wp_delete_post( $product_id, true );
            }
        }
    }
}

Сравнение вариантов реализации

МетодПреимуществаНедостатки
Код в functions.phpБыстрое внедрение, полная кастомизацияНужно тех. знание, возможны ошибки при обновлениях
Плагин автоматизации (например, Custom Order Actions)Удобный интерфейс, расширенные функцииНе всегда поддерживает удаление товаров, нагрузка на сайт
Удаление вручную через админкуПростота, контрольРучной труд, риск забыть удалить
Как создать автозаполняемый формат даты в WordPress с примером кода
04.04.2026
Как удалить или изменить выставку данных в WordPress без поддержки плагинов
19.12.2025
Как отключить автоматические обновления WordPress
03.01.2026
Как использовать WPRemark для анализа качества контента в WordPress
16.02.2026
Динамическая пагинация в WordPress с использованием AJAX без перезагрузки страницы
23.03.2026