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)Удобный интерфейс, расширенные функцииНе всегда поддерживает удаление товаров, нагрузка на сайт
Удаление вручную через админкуПростота, контрольРучной труд, риск забыть удалить
Как создать собственный shortcode в WordPress с примером кода
03.12.2025
Как использовать Metabox для создания дополнительных полей в WordPress
15.12.2025
Как удалить порты в WordPress для блокировки внешних запросов
30.03.2026
Как использовать WP Actions для автоматизации обработки заказов WooCommerce
09.07.2026
WooCommerce: автоматическое обновление остатков и цен из внешних источников
02.07.2026