Проблема: почему нужно автоматически удалять товар после продажи
В WooCommerce иногда требуется удалять товар из каталога сразу после первой продажи. Это актуально для ограниченных предложений, уникальных товаров или товаров с ограниченным тиражом. Однако стандартного функционала для этого нет, и нужно реализовать это через код.
Диагностика задачи: когда и как удалять товар
Для автоматического удаления товара нужно отследить момент успешного завершения заказа, проверить, что товар был куплен, и затем удалить товар из базы. Важно, чтобы товар удалялся только после подтверждения оплаты, иначе пользователь может оплатить, но товар исчезнет преждевременно.
Выбор правильного хука
Для этого подходит хук woocommerce_order_status_completed — он срабатывает, когда заказ получает статус «завершён» (оплата подтверждена).
Пошаговое решение с примером кода
1. Создайте или откройте файл functions.php в дочерней теме или подключаемом плагине.
2. Добавьте следующий код:
add_action('woocommerce_order_status_completed', 'auto_delete_products_after_sale', 10, 1);
function auto_delete_products_after_sale($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();
// Удаляем товар без возможности восстановления
wp_delete_post($product_id, true);
}
}Этот код перебирает все товары в заказе и удаляет их из базы при установке статуса «завершён».
Проверка результата после внедрения
- Создайте тестовый заказ с одним или несколькими товарами.
- Оплатите заказ (можно в тестовом режиме).
- Убедитесь, что заказ сменил статус на «завершён».
- Проверьте в админке WooCommerce > Товары, что купленные товары удалены.
Для дополнительной проверки можно вывести лог ошибок или использовать плагин Query Monitor, чтобы подтвердить выполнение функции.
Частые ошибки и их исправление
- Товары не удаляются: проверьте, что код добавлен в правильное место и активен. Убедитесь, что статус заказа действительно меняется на «завершён».
- Удаляются не те товары: проверьте, что используете
$item->get_product_id(), а не$item->get_variation_id(), если не хотите удалять вариации. - Ошибка доступа или прав: убедитесь, что пользователь с правами администратора тестирует удаление, и что функция
wp_delete_postне блокируется другими плагинами безопасности.
Практические советы по безопасности и производительности
- Удаление товара — необратимый процесс, используйте параметр
trueво втором аргументеwp_delete_postс осторожностью. - Рекомендуется перед удалением создавать резервные копии, особенно на продуктивных сайтах.
- Если товар имеет вариации, дополнительно удаляйте их через
get_children()по ID товара. - Для сайтов с большим количеством заказов рекомендуется добавить ограничение, например, удалять только определённые категории товаров.
Расширение функционала: удаление вариаций товаров
add_action('woocommerce_order_status_completed', 'auto_delete_products_and_variations', 10, 1);
function auto_delete_products_and_variations($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();
// Удаляем вариации товара
$children = get_children(array(
'post_parent' => $product_id,
'post_type' => 'product_variation',
'fields' => 'ids',
));
foreach ($children as $child_id) {
wp_delete_post($child_id, true);
}
// Удаляем сам товар
wp_delete_post($product_id, true);
}
}Чек-лист для внедрения и тестирования
- Добавлен код в functions.php дочерней темы или в плагин
- Подключён хук
woocommerce_order_status_completed - Проверена работа на тестовом заказе
- Проведена проверка удаления товаров и вариаций
- Убедились в отсутствии ошибок в логах
- Создана резервная копия перед запуском на продакшене