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

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

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

Как правильно реализовать автоматическое удаление товара после продажи

Выбор подхода: удалять или скрывать

Удаление товара полностью с сайта — радикальный вариант, который приведёт к потере данных о товаре. Более щадящий способ — переводить товар в черновики или скрывать из каталога. Тем не менее, если задача именно удалить, ниже представлен пример решения с подтверждением удаления.

Пошаговое решение с примером кода

Мы реализуем удаление товара после успешного оформления заказа, но сначала проверим, что товар продан впервые, и запросим подтверждение перед окончательным удалением.

  1. Добавим кастомное поле для товара с флагом удаления.
  2. После оформления заказа проверим, если это первая продажа, отправим письмо администратору с запросом подтверждения.
  3. По подтверждению удалим товар программно.

Пример кода для файла functions.php вашей темы или отдельного плагина:

add_action('woocommerce_order_status_completed', 'wps_delete_product_after_first_sale');
function wps_delete_product_after_first_sale($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        $product = wc_get_product($product_id);
        // Проверяем, продан ли товар впервые
        $total_sales = $product->get_total_sales();
        if ($total_sales === 1) {
            // Сохраняем ID товара для удаления после подтверждения
            update_post_meta($product_id, '_wps_pending_deletion', 'yes');
            // Отправляем письмо с подтверждением
            wps_send_deletion_confirmation_email($product_id);
        }
    }
}

function wps_send_deletion_confirmation_email($product_id) {
    $product = wc_get_product($product_id);
    $to = get_option('admin_email');
    $subject = 'Подтверждение удаления товара после продажи';
    $link = admin_url('admin-post.php?action=wps_confirm_delete_product&product_id=' . $product_id);
    $message = "Товар: {$product->get_name()} (ID: {$product_id}) был продан впервые. <br>
Для подтверждения удаления перейдите по ссылке:<br>
<a href='{$link}'>Удалить товар</a>";
    wp_mail($to, $subject, $message, ['Content-Type: text/html; charset=UTF-8']);
}

add_action('admin_post_wps_confirm_delete_product', 'wps_confirm_delete_product_handler');
function wps_confirm_delete_product_handler() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die('Доступ запрещён');
    }
    $product_id = intval($_GET['product_id']);
    $pending = get_post_meta($product_id, '_wps_pending_deletion', true);
    if ($pending === 'yes') {
        wp_delete_post($product_id, true); // Удаляем товар без возможности восстановления
        wp_redirect(admin_url('edit.php?post_type=product&wps_delete=success'));
        exit;
    }
    wp_redirect(admin_url('edit.php?post_type=product&wps_delete=fail'));
    exit;
}

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

1. Создайте тестовый товар с количеством 1.

2. Оформите заказ с этим товаром и завершите его (статус completed).

3. Проверьте почту администратора — должно прийти письмо с ссылкой на удаление.

4. Перейдите по ссылке под пользователем с правами администратора — товар должен исчезнуть из каталога и базы.

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

  • Письмо не приходит: проверьте работу wp_mail(), настройки SMTP, папку спама, и правильность email администратора.
  • Ссылка удаления не работает: убедитесь, что пользователь авторизован и имеет права manage_woocommerce.
  • Товар не удаляется: проверьте, что метаполе _wps_pending_deletion действительно установлено и совпадает с проверкой в обработчике.
  • Удаление происходит сразу без подтверждения: проверьте, что код удаления вызывается только внутри функции обработчика admin_post, а не сразу после изменения статуса.

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

  • Для безопасности добавьте nonce-проверку при подтверждении удаления.
  • Удаление товаров — необратимая операция, убедитесь, что администратор действительно хочет удалить.
  • Если товаров много, используйте очередь задач или WP-Cron для обработки массовых удалений.
  • Для простых сценариев лучше скрывать товар переводом в статус draft, чтобы сохранить историю и данные.

Сравнение вариантов: удаление товара после продажи

МетодПлюсыМинусыПример использования
Удаление товара (код)Полное удаление, освобождение базыПотеря данных, риск ошибкиКод из статьи с подтверждением
Скрытие товара (перевод в draft)Сохраняет данные, легко отменитьТовар остаётся в базеwp_update_post(['ID' => $product_id, 'post_status' => 'draft']);
Ограничение продажи (stock management)Автоматически снимает с продажи при отсутствии запасаТовар виден, но не доступен для покупкиСтандартные настройки WooCommerce
Как использовать REST API в WordPress для создания панели настроек
17.11.2025
Добавление поддержки масштабирования изображений в WordPress
23.02.2026
WooCommerce: автоматическое удаление неактивных товаров по срокам
23.06.2026
Автоматическое удаление отзывов в WooCommerce после их модерации
22.05.2026
Как отключить XML-RPC в WordPress и защитить сайт от атак
27.01.2026