Диагностика задачи: зачем удалять товар после продажи
В WooCommerce иногда возникает необходимость автоматически удалять товар из каталога сразу после первой продажи. Например, если это уникальный лот, разовая акция или эксклюзивный товар с ограниченным количеством. В стандартном WooCommerce таких настроек нет — нужно реализовать кастомный функционал.
Основные вопросы:
- Как отследить факт первой продажи товара?
- Как автоматически изменить статус товара или удалить его?
- Как избежать конфликта с кешированием и другими плагинами?
Пошаговое решение: реализация через хук WooCommerce
1. Отслеживаем факт продажи товара
Лучший хук для отслеживания успешных заказов — woocommerce_order_status_completed. Он срабатывает после смены статуса заказа на "завершён".
add_action('woocommerce_order_status_completed', 'wps_remove_product_after_first_sale', 10, 1);2. Функция удаления товара после первой продажи
В функции перебираем товары из заказа, проверяем, была ли уже продажа этого товара, и если нет — удаляем его.
function wps_remove_product_after_first_sale($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, был ли товар продан ранее
$total_sales = get_post_meta($product_id, 'total_sales', true);
if (!$total_sales || intval($total_sales) <= 1) {
// Устанавливаем статус товара в "черновик" или удаляем
// Рекомендуется сначала менять статус, чтобы избежать потери данных
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
// Если хотите полностью удалить товар, раскомментируйте следующую строку
// wp_delete_post($product_id, true);
}
}
}3. Возможные варианты действия с товаром
Удалять товар полностью — радикально и необратимо. Лучше сначала переводить в статус draft или private. Это позволит сохранить данные товара и при необходимости восстановить.
| Действие | Описание | Плюсы | Минусы |
|---|---|---|---|
| Изменение статуса на draft | Товар скрывается из каталога, но сохраняется в админке | Безопасно, можно вернуть | Товар не удаляется, занимает место |
| Удаление поста товара | Полное удаление товара из базы данных | Освобождает ресурсы, полностью убирает товар | Невозможно восстановить без бэкапа |
Проверка результата после внедрения
- Создайте тестовый товар с типом «Простой продукт».
- Оформите заказ с этим товаром и переведите заказ в статус «Завершён».
- Перейдите в каталог WooCommerce и проверьте статус товара — он должен быть «черновик» или удалён, в зависимости от реализации.
- Проверьте, что товар не отображается в каталоге для покупателей.
Частые ошибки и как их исправить
- Функция не срабатывает после оплаты: Убедитесь, что заказ действительно получил статус «completed». Для тестов можно вручную сменить статус заказа через админку.
- Товар не скрывается или не удаляется: Проверьте права пользователя, под которым выполняется скрипт, и наличие ошибок в логах PHP.
- Удаление товара ломает сайт: Лучше сначала использовать смену статуса, чтобы избежать ошибок связанных с удалёнными товарами в заказах.
- Кэш не обновляется: Очистите кеш сайта и браузера, особенно если используете плагины кеширования.
Практические советы по безопасности и производительности
- Используйте смену статуса товара вместо удаления для сохранения истории и возможности отката.
- Добавьте проверку nonce и прав пользователя, если функция вызывается через AJAX или форму.
- Оптимизируйте функцию, чтобы она не выполнялась избыточно, например, добавьте проверку, что товар удаляется только один раз.
- Регулярно создавайте резервные копии базы данных перед внедрением подобных автоматизаций.