Диагностика задачи: зачем удалять товары после продажи в WooCommerce
В стандартной конфигурации WooCommerce товары остаются в каталоге после продажи, даже если их больше нет в наличии. В некоторых случаях, например, при продаже уникальных или ограниченных товаров, требуется автоматическое удаление товара после успешной продажи, чтобы исключить повторную покупку и убрать товар из каталога.
Главный вопрос — как реализовать эту логику без постоянного ручного контроля? Автоматизация решения поможет экономить время и избежать ошибок.
Пошаговое решение: удаление товара после успешного заказа
1. Используем хук для отслеживания успешной оплаты
Для удаления товара после продажи нужно реагировать на изменение статуса заказа на completed или processing (в зависимости от способа оплаты). Для этого используем хук woocommerce_order_status_completed или woocommerce_order_status_processing.
2. Получаем ID товаров из заказа и удаляем их
Пример кода, который удаляет все товары, присутствующие в заказе, при смене статуса на completed:
add_action('woocommerce_order_status_completed', 'custom_delete_products_after_order_completed');
function custom_delete_products_after_order_completed($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) {
// Удаляем товар из базы WordPress
wp_delete_post($product_id, true); // true — принудительное удаление
}
}
}3. Учитываем вариации товаров
Если у вас есть вариации, их ID отличаются от главного товара. Чтобы удалить вариацию, нужно получить ID вариации:
foreach ($order->get_items() as $item) {
$variation_id = $item->get_variation_id();
if ($variation_id) {
wp_delete_post($variation_id, true);
} else {
$product_id = $item->get_product_id();
wp_delete_post($product_id, true);
}
}Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и оплатите его, чтобы статус сменился на
completed. - Перейдите в раздел «Товары» в админке WordPress и убедитесь, что проданные товары (или их вариации) удалены.
- Попробуйте повторно заказать удалённый товар — он должен отсутствовать в каталоге.
Частые ошибки и как их исправить
- Товары не удаляются после смены статуса заказа.
Проверьте, что хук привязан к правильному статусу, и что функция подключена в правильном месте (например, в functions.php темы или в плагине). Также проверьте, не отключена ли функцияwp_delete_postиз-за прав. - Удаляются не все товары, особенно вариации.
Убедитесь, что в коде обрабатываются и вариации товаров, а не только главные продукты. - Удалённые товары отображаются в кэше.
Очистите кэш сайта и браузера, если используете кеширующие плагины.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($product_id, true)с осторожностью. Этот вызов удаляет товар без возможности восстановления из корзины. - Добавьте проверку прав текущего пользователя, если ваш код запускается через интерфейс.
- Для больших магазинов и массовых заказов рассмотрите добавление логирования удалённых товаров для аудита.
- Если товары удаляются слишком часто, можно добавить дополнительный флаг или метаполе, чтобы контролировать удаление.
Чек-лист для внедрения автоматического удаления товаров после продажи
- Определить, на каком статусе заказа удалять товар (completed, processing и т.д.).
- Реализовать функцию удаления товаров с учётом вариаций.
- Добавить функцию в functions.php или создать отдельный плагин.
- Провести тестирование на тестовом заказе.
- Очистить кэш сайта и проверить отображение каталога.
- Добавить логирование (по необходимости) для контроля.
Сравнение вариантов реализации удаления товаров после продажи
| Метод | Преимущества | Недостатки |
|---|---|---|
| Удаление через хук статуса заказа (код) | Быстро, без сторонних плагинов, гибко настраивается | Риск удаления нужных товаров без бэкапа; требует навыков PHP |
| Ручное удаление товаров в админке | Полный контроль, нет риска ошибочного удаления | Трудозатратно при большом количестве заказов |
| Использование сторонних плагинов (редко встречается) | Простота использования, готовые решения | Плагины могут быть ненадёжными, влиять на производительность |