Диагностика задачи: зачем нужно автоматическое удаление товаров после продажи
В WooCommerce часто возникает необходимость удалять товар из каталога сразу после его продажи — например, для уникальных товаров, услуг с ограниченным количеством или товаров под заказ. Если этого не сделать, покупатель или администратор могут случайно повторно продать товар, что вызовет проблемы с логистикой и репутацией.
Стандартного решения в WooCommerce для автоматического удаления товара после успешной продажи нет, поэтому требуется кастомизация через хуки и код.
Пошаговое решение: удаление товара после оплаты заказа
1. Определяем событие для удаления товара
Лучший момент для удаления товара — после успешной оплаты (статус "processing" или "completed"). Для этого используем хук woocommerce_order_status_completed или woocommerce_order_status_processing.
2. Получаем список товаров из заказа и удаляем их
В функции-обработчике пробегаемся по всем товарам заказа, получаем ID товара и удаляем запись из базы через wp_delete_post().
3. Пример рабочего кода
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_id => $item ) {
$product_id = $item->get_product_id();
// Проверяем, что это простой или вариативный продукт
if ( $product_id ) {
// Удаляем товар
wp_delete_post( $product_id, true ); // true - принудительное удаление без корзины
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ, добавив уникальный товар.
- Оплатите заказ (можно использовать тестовый платежный шлюз).
- После смены статуса заказа на "завершён" проверьте, что товар исчез из админки (Раздел "Товары").
- Если товар не удалился, проверьте логи ошибок и наличие прав у пользователя веб-сервера.
Частые ошибки и как их исправить
- Товар не удаляется после оплаты — возможно, используется нестандартный статус заказа. Проверьте, что событие срабатывает на нужном хуке. Для других статусов подключите дополнительные хуки
woocommerce_order_status_processing. - Удаляются все товары без исключения — если нужно удалять только определённые товары, добавьте проверку по ID, категории или метаполям.
- Ошибка прав доступа — убедитесь, что процесс запускается с достаточными правами, и функция
wp_delete_post()не блокируется плагинами безопасности. - Удаление товара с вариациями — убедитесь, что удаляются все посты вариаций (post_type = 'product_variation'). Можно добавить дополнительный цикл удаления вариаций перед удалением основного товара.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($product_id, true)для полного удаления товара без помещения в корзину, чтобы избежать лишних данных в базе. - Добавьте проверку nonce и прав пользователя, если добавляете интерфейс для включения этой функции.
- Если у вас большой магазин, удаление товаров может замедлить процесс обработки заказа — сделайте удаление асинхронным через WP-Cron или очередь.
- Резервное копирование базы перед автоматическим удалением поможет избежать потери данных.
Дополнительная настройка: удаление вариаций и товаров по условию
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_id => $item ) {
$product_id = $item->get_product_id();
if ( $product_id ) {
// Удаляем вариации если есть
$variations = get_posts(array(
'post_type' => 'product_variation',
'post_parent' => $product_id,
'numberposts' => -1
));
foreach ( $variations as $variation ) {
wp_delete_post( $variation->ID, true );
}
// Условие удаления: только товары из категории "уникальные"
if ( has_term( 'unikalnye', 'product_cat', $product_id ) ) {
wp_delete_post( $product_id, true );
}
}
}
}Сравнение вариантов реализации
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Быстрое внедрение, полная кастомизация | Нужно тех. знание, возможны ошибки при обновлениях |
| Плагин автоматизации (например, Custom Order Actions) | Удобный интерфейс, расширенные функции | Не всегда поддерживает удаление товаров, нагрузка на сайт |
| Удаление вручную через админку | Простота, контроль | Ручной труд, риск забыть удалить |