Диагностика задачи: зачем удалять товар после первого заказа
В WooCommerce иногда возникает необходимость настроить автоматическое удаление товара из каталога после того, как он был куплен один раз. Это актуально для ограниченных тиражей, эксклюзивных предложений или цифровых продуктов с ограниченным доступом. В стандартном функционале WooCommerce такого поведения нет, поэтому задача требует кастомного решения.
Пошаговое решение: удаление товара после первого заказа
1. Подключение к хуку после завершения заказа
Для реализации механизма нужно использовать хук woocommerce_order_status_completed, который срабатывает, когда заказ переводится в статус "завершён". В этом момент можно получить список товаров из заказа и обработать их.
2. Проверка, был ли товар уже куплен ранее
Чтобы не удалять товар, если он уже был куплен, нужно проверить историю заказов пользователя. Но в нашей задаче требуется удалять товар после первого заказа с ним — то есть сразу после первого успешного заказа товара. Значит, удаляем без дополнительных проверок.
3. Код для удаления товаров после первого заказа
add_action('woocommerce_order_status_completed', 'wp7_remove_products_after_first_order', 10, 1);function wp7_remove_products_after_first_order($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_trash_post($product_id); } }}Этот код помещается в файл functions.php вашей темы или в отдельный кастомный плагин. Функция переводит товар в корзину (trash), что безопаснее, чем полное удаление.
Проверка результата после внедрения
1. Создайте тестовый товар в WooCommerce и опубликуйте его.
2. Оформите заказ с этим товаром и переведите его в статус "завершён" (можно вручную в админке).
3. Проверьте каталог товаров — заказанный товар должен быть перемещён в корзину (trash), то есть исчез из витрины.
Для проверки можно зайти в админку Товары > Корзина и убедиться, что товар там.
Частые ошибки и как их исправить
- Товар не удаляется после заказа: проверьте, что статус заказа действительно меняется на "завершён", и что хук подключён правильно.
- Ошибка при удалении товара: убедитесь, что
wp_trash_post()вызывается с корректным ID. Иногда в заказе бывают вариации товаров — используйте$item->get_product_id(), а не$item->get_id(). - Удаляется не тот товар: если в заказе есть вариации, и вы хотите удалять только родительский товар, используйте
$item->get_variation_id()и дополнительно проверяйте тип товара. - Пользователь может купить товар повторно: если нужно ограничить покупку, лучше дополнительно ограничить количество продаж через WooCommerce настройки или отдельный фильтр.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post(), а неwp_delete_post(), чтобы сохранить возможность восстановления товара. - Если на сайте много заказов, добавьте ограничение на запуск кода только для нужных товаров, чтобы не влиять на производительность.
- Для цифровых товаров лучше использовать статусы доступа (например, ограничение покупки через настройки товара), а не удалять их из базы.
- Для массового контроля продаж и удаления товаров рассмотрите интеграцию с WPShop Clearfy для оптимизации базы данных и удаления устаревших записей.
Сравнение вариантов реализации удаления товара после заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Удаление через wp_trash_post() на хуке завершения заказа | Автоматическое перемещение в корзину товаров из завершённого заказа | Простота, безопасность (возможность восстановления), быстрый запуск | Товар не полностью удалён, может занимать место |
Полное удаление через wp_delete_post() | Удаление товара из базы данных | Не занимает место, товар полностью удалён | Риск утраты данных, невозможность восстановления |
| Ограничение покупки товара через фильтры WooCommerce | Запрет повторных заказов товара без удаления | Безопасность, контроль продаж | Не удаляет товар из каталога |