Диагностика задачи: зачем удалять продукт после первой продажи?
В WooCommerce иногда возникает потребность автоматически удалять товар из каталога после его первой продажи. Например, если это уникальный, ограниченный или единичный товар. В стандартном функционале WooCommerce нет такой опции, поэтому приходится решать задачу через кастомный код или плагины.
Как отследить первую продажу товара в WooCommerce
Для решения задачи нужно отследить момент первой покупки товара. WooCommerce хранит данные о заказах и заказанных товарах, и мы можем проверять количество продаж для конкретного продукта через функцию wc_get_product()->get_total_sales().
Если количество продаж равно 1, значит, товар был продан впервые. Именно в этот момент можно запустить удаление.
Пример кода для проверки количества продаж
function is_first_sale($product_id) {
$product = wc_get_product($product_id);
if (!$product) return false;
return $product->get_total_sales() === 1;
}Пошаговое решение: автоматическое удаление товара после первой продажи
Мы будем использовать хук woocommerce_order_status_completed, который вызывается, когда заказ помечается как выполненный. В обработчике проверим товары в заказе, если для товара это первая продажа — удалим его.
add_action('woocommerce_order_status_completed', 'delete_product_after_first_sale', 10, 1);
function delete_product_after_first_sale($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
if (!$product) continue;
// Проверяем, что это первая продажа
if ($product->get_total_sales() === 1) {
// Удаляем продукт без возможности восстановления
wp_delete_post($product_id, true);
}
}
}Этот код удалит товар сразу после того, как заказ со статусом "выполнен" содержит его первую продажу.
Проверка результата после внедрения
- Создайте тестовый продукт в WooCommerce.
- Оформите заказ, купив этот продукт.
- Переведите заказ в статус "выполнен" (в админке или программно).
- Проверьте, что товар удалён — зайдите в раздел товаров WooCommerce и убедитесь, что его нет.
- Попробуйте оформить второй заказ с этим же продуктом, чтобы убедиться, что он недоступен.
Частые ошибки и как исправить
- Товар не удаляется после первой продажи
Проверьте, что заказ действительно меняет статус на "выполнен". Если используется другая схема статусов, нужно применить соответствующий хук или дополнительно проверить статус. - Удаляется не тот продукт или несколько раз
Убедитесь, что в заказе нет вариаций, для которых ID отличается. В таком случае используйте$item->get_variation_id()и проверяйте именно вариацию, если нужно. - Проблемы с кэшированием
Если вы используете кэш или плагин оптимизации, проверьте, что изменения видны сразу, очистите кэш.
Практические советы по безопасности и производительности
- Удаление товара без возможности восстановления: параметр
trueвwp_delete_post($product_id, true)удаляет товар окончательно. Если хотите иметь возможность восстановления, используйтеfalse. - Проверка прав пользователя: если код планируется использовать в административной части, учитывайте права текущего пользователя, чтобы избежать ошибок.
- Обработка вариаций: если продаются вариации, можно менять логику удаления, чтобы удалять вариацию, а не товар целиком.
- Журналирование: для отладки добавляйте логирование в файл или систему ошибок — это поможет отследить процесс удаления.
Альтернативные подходы: плагины и код
| Метод | Плюсы | Минусы |
|---|---|---|
| Кастомный код (как в статье) | Полный контроль, легко адаптировать | Требует навыков PHP, может понадобиться отладка |
| Плагины для автоматического управления товарами | Простота использования, часто есть поддержка | Могут быть не гибкими, возможно лишний функционал |
| Ручное удаление после уведомления | Просто и безопасно | Требует участия администратора, не автоматично |