Диагностика задачи: зачем нужно удалять товар после покупки?
В стандартном WooCommerce после оформления заказа товар остаётся в каталоге, что логично для большинства магазинов. Однако в ряде случаев, например, при продаже цифровых товаров с ограниченным тиражом, эксклюзивных предложений или одноразовых услуг, требуется автоматически удалять товар из каталога после покупки. Это предотвращает повторные продажи и освобождает место в базе.
Основные признаки необходимости автоматического удаления товара:
- Товар доступен к покупке только один раз.
- Необходимо исключить повторное появление товара в каталоге.
- Автоматизация процесса без ручного удаления.
Пошаговое решение: как настроить автоматическое удаление товаров после покупки в WooCommerce
1. Используем хук woocommerce_order_status_completed для обработки статуса заказа
Для удаления товаров после успешного завершения заказа нужно отследить момент смены статуса заказа на «завершён». Для этого используется хук woocommerce_order_status_completed.
add_action('woocommerce_order_status_completed', 'auto_delete_products_after_purchase', 10, 1);2. Получаем товары из заказа и удаляем их программно
Внутри функции обработчика нужно получить все товары из заказа и вызвать функцию удаления каждого товара по ID.
function auto_delete_products_after_purchase($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 && get_post_type($product_id) === 'product') {
// Удаляем товар без попадания в корзину мусора
wp_delete_post($product_id, true);
}
}
}3. Ограничиваем удаление только для нужных товаров
Если требуется удалять только определённые товары, например, с конкретной категорией или меткой, добавьте проверку перед удалением.
function auto_delete_products_after_purchase($order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if (!$product_id) {
continue;
}
// Проверка категории товара
if (has_term('one-time-sale', 'product_cat', $product_id)) {
wp_delete_post($product_id, true);
}
}
}Проверка результата после внедрения
Чтобы убедиться, что автоматическое удаление работает корректно:
- Оформите тестовый заказ с товаром, который должен удалиться.
- Переведите заказ в статус «завершён» (если не происходит автоматически).
- Проверьте в панели WordPress в разделе Товары, что товар удалён.
- Попробуйте найти старую ссылку на товар — должна выдаваться 404 ошибка.
Частые ошибки и как их исправить
Ошибка 1: Товары не удаляются после смены статуса заказа
Причина: функция не подключена или неправильно указан хук.
Проверьте, что код добавлен в файл functions.php темы или в кастомный плагин, а хук woocommerce_order_status_completed используется правильно.
Ошибка 2: Удаляются все товары без фильтрации
Причина: отсутствует проверка категории или метки товара.
Добавьте проверку с помощью has_term(), чтобы ограничить удаление целевой группой товаров.
Ошибка 3: Удаление вызывает ошибки или блокирует заказ
Причина: удаление товара происходит слишком рано или без проверки существования.
Добавьте проверки на существование товара, а также используйте приоритет хука не ниже 10, чтобы дать WooCommerce завершить внутренние процессы.
Практические советы по безопасности и производительности
- Удаление товаров — необратимая операция, рекомендуется делать резервное копирование базы данных перед внедрением.
- Для магазинов с большим количеством заказов и товаров лучше реализовать очередь удаления через WP Cron, чтобы не нагружать сервер при массовых заказах.
- Добавьте логирование удаляемых товаров для отслеживания операций и возможного восстановления данных.
- Избегайте удаления товаров, которые могут быть связаны с другими заказами или настроены как вариации — это может привести к ошибкам.
Сравнение подходов: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Готовый плагин | Простота установки, интерфейс управления, поддержка обновлений | Может быть избыточным, замедлять сайт, ограниченная кастомизация |
| Кастомный код | Точный функционал, лёгкий, полностью под контролем разработчика | Требует навыков программирования, возможные ошибки при неправильной реализации |