Диагностика задачи: зачем удалять товар после первого заказа
В WooCommerce иногда требуется ограничить продажу уникальных товаров, например, единичных коллекционных предметов или услуг, доступных только для одного покупателя. Автоматическое удаление товара после первого успешного заказа помогает избежать ручного контроля, предотвращает повторные покупки и упрощает управление каталогом.
Как определить, что товар был заказан впервые
Для реализации автоматического удаления необходимо отследить факт успешного завершения заказа с конкретным товаром. В WooCommerce есть хук woocommerce_order_status_completed, который срабатывает при смене статуса заказа на "завершен".
Основная логика — при переходе заказа в статус completed проверяем, есть ли в нем нужный товар, и затем удаляем этот товар из каталога.
Пример кода для автоматического удаления товара после первого заказа
add_action('woocommerce_order_status_completed', 'wc_remove_product_after_first_order', 10, 1);
function wc_remove_product_after_first_order($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, была ли уже продажа этого товара
$orders_with_product = wc_get_orders(array(
'limit' => 1,
'status' => array('completed', 'processing'),
'product_id' => $product_id,
'exclude' => array($order_id),
));
// Если заказ с этим товаром встречается только один (текущий), удаляем товар
if (empty($orders_with_product)) {
wp_delete_post($product_id, true); // true — удалить навсегда
}
}
}Пошаговое внедрение решения
- Добавьте указанный код в файл
functions.phpвашей дочерней темы или создайте небольшой плагин для управления кастомными функциями. - Убедитесь, что у вас есть резервная копия базы данных, поскольку удаление товаров — необратимая операция.
- Тестируйте на тестовом сайте с несколькими товарами, создайте заказ с новым товаром, завершите заказ и проверьте, что товар удалился из каталога.
Проверка результата после внедрения
- Создайте заказ с тестовым товаром и переведите его в статус "завершен".
- Перейдите в админку WooCommerce → Товары и убедитесь, что товар отсутствует.
- Попробуйте создать новый заказ с тем же товаром — он не должен отображаться в каталоге и в поиске.
- Проверьте логи ошибок сервера на предмет возможных сбоев.
Частые ошибки и как их исправить
- Товар не удаляется после оформления заказа: возможно, хук
woocommerce_order_status_completedне срабатывает из-за нестандартного статуса или плагина, который изменяет обработку заказов. Проверьте, что заказ действительно получает статусcompleted. - Удаляются не все нужные товары: убедитесь, что в заказе действительно есть товары, и используйте
$item->get_product_id(), а не$item->get_variation_id()для корректного получения ID товара. - Потеря товара при тестах: всегда работайте на тестовой копии сайта, чтобы избежать случайного удаления реальных товаров.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($product_id, true)с осторожностью — удаление навсегда нельзя отменить. - Для предотвращения случайного удаления добавьте проверку по категории или метке товара, если автоматическое удаление должно применяться не ко всем товарам.
- Для больших магазинов с тысячами заказов использование параметра
product_idвwc_get_ordersможет замедлять запросы — рассмотрите кеширование результатов. - Рекомендуется логировать удаляемые товары в отдельный файл или опцию для аудита и восстановления.
Альтернативные подходы: сравнение методов удаления товара после заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Удаление товара через хук woocommerce_order_status_completed | Автоматическое удаление товара после завершения первого заказа | Полная автоматизация, не требует вмешательства | Нельзя отменить удаление, требует осторожности |
| Изменение статуса товара на "скрытый" | Меняем статус товара, чтобы он не отображался в каталоге | Безопаснее, товар можно восстановить | Товар не удаляется физически, может влиять на SEO |
| Использование кастомного метаполя для ограничения покупки | Запретить повторные заказы через проверку метаполя | Не удаляет товар, гибкий контроль | Сложнее администрировать, требует доработок |