Диагностика задачи: зачем удалять товар после продажи
В стандартной логике WooCommerce товар остаётся в каталоге после продажи, что подходит для большинства магазинов. Однако в некоторых сценариях, например, при продаже уникальных или ограниченных товаров, требуется автоматически удалить товар из каталога сразу после первого успешного заказа. Это предотвратит повторные продажи и снизит вероятность ошибок.
Пошаговое решение: добавляем автоматическое удаление товара
Обработка изменения статуса заказа
Для автоматического удаления товара нужно отследить изменение статуса заказа на «завершён» (completed) или «оплачен» (processing) — в зависимости от бизнес-логики.
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
add_action('woocommerce_order_status_completed', 'wpchecker_auto_delete_product_after_sale', 10, 1);
function wpchecker_auto_delete_product_after_sale($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, что товар существует и можно удалить
if ($product_id) {
wp_delete_post($product_id, true); // true — удаление без корзины
}
}
}Объяснение кода
woocommerce_order_status_completed— хук, срабатывающий при смене статуса заказа на завершённый;- Получаем объект заказа и перебираем все товары заказа;
- Удаляем каждый товар с помощью
wp_delete_postс параметромtrueдля безвозвратного удаления.
Проверка результата после внедрения
- Создайте тестовый заказ с уникальным товаром;
- Измените статус заказа на «завершён» (можно в админке WooCommerce);
- Перейдите в каталог товаров и убедитесь, что товар удалён;
- Если товар остался, проверьте логи ошибок PHP и активность кода.
Частые ошибки и как их исправить
- Товар не удаляется после изменения статуса заказа
Проверьте, активен ли код и правильно ли подключен. Убедитесь, что статус заказа действительно меняется наcompleted. Иногда используетсяprocessing, если оплата подтверждается сразу. - Удаляются товары, которые не нужно удалять
Если нужно удалять только некоторые товары (например, уникальные), расширьте функцию условием проверки метаданных или категории товара. - Удаление вызывает ошибки безопасности
Убедитесь, что функция вызывается в контексте WordPress, и нет конфликтов с правами доступа.
Практические советы по доработке и безопасности
- Добавьте проверку метаполя, например
_unique_item, чтобы удалять только помеченные товары:
if (get_post_meta($product_id, '_unique_item', true) === 'yes') {
wp_delete_post($product_id, true);
}- Резервное копирование базы данных перед внедрением функций удаления обязательно;
- Для массовых заказов с несколькими товарами продумайте логику: возможно, удалять только первый товар или только уникальные позиции;
- Для производительности лучше избегать удаления через AJAX на фронтенде — делайте это на серверной стороне во время смены статуса.
Альтернативные способы удаления товаров
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Удаление через хук заказа (код) | Автоматизация, точечное удаление | Риск случайного удаления, требует тестирования | Использовать для уникальных товаров |
| Ручное удаление в админке | Контроль, минимальный риск | Затратно по времени | Подходит для небольших магазинов |
| Плагин для управления ограниченными товарами | Дополнительные функции, удобство | Зависимость от сторонних разработчиков, нагрузка | Использовать для сложных сценариев |