WooCommerce: как автоматически удалять товар после отмены заказа

Диагностика проблемы: зачем удалять товар после отмены заказа

В стандартной логике WooCommerce отмена заказа не влияет на наличие товаров в каталоге. Однако в ряде бизнес-сценариев необходимо, чтобы товар автоматически удалялся из базы после отмены заказа, например, если товар предоставляется по подписке или является уникальным и не должен быть доступен повторно.

Основные признаки задачи:

  • Товар должен исчезать из каталога сразу после статуса заказа "Отменён".
  • Обеспечение целостности данных и отсутствие ошибок в админке.
  • Автоматизация действий без ручного вмешательства.

Пошаговое решение: как реализовать автоматическое удаление товара

1. Использование хука для отслеживания смены статуса заказа

WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при изменении статуса заказа. На его основе можно запустить функцию удаления товаров.

2. Получение товаров из заказа и удаление их программно

Ниже пример кода, который удаляет все товары из заказа при переводе его в статус "отменён":

add_action('woocommerce_order_status_changed', 'delete_products_on_order_cancelled', 10, 4);function delete_products_on_order_cancelled($order_id, $old_status, $new_status, $order) {    if ($new_status === 'cancelled') {        $items = $order->get_items();        foreach ($items as $item) {            $product_id = $item->get_product_id();            if ($product_id) {                wp_delete_post($product_id, true); // Полное удаление товара из базы            }        }    }}

Обратите внимание: wp_delete_post с параметром true удаляет товар без возможности восстановления из корзины.

Проверка результата после внедрения

Чтобы убедиться, что код работает корректно:

  • Создайте тестовый заказ с несколькими товарами.
  • Переведите статус заказа в "Отменён" через админку WooCommerce.
  • Проверьте, что соответствующие товары исчезли из каталога и базы данных (через wp-admin или SQL-запрос).
  • Проверьте, что нет ошибок PHP в логе сервера или на экране.

Частые ошибки и как их исправить

1. Товары не удаляются после отмены

  • Ошибка в названии статуса заказа: используйте именно cancelled, а не "cancel" или "отменён".
  • Отсутствие прав на удаление постов у пользователя, под которым выполняется код (чаще всего PHP-скрипт). Проверьте права и роли.
  • Кэширование: если используется плагин кэширования, может казаться, что товар остался. Очистите кеш.

2. Удаление не тех товаров или всех подряд

  • Проверьте, что вы получаете именно product_id через $item->get_product_id(), а не variation_id или другие данные.
  • Если нужно удалять только определённые типы товаров, добавьте проверку get_post_type($product_id).

Практические советы по безопасности и производительности

  • Перед удалением товара лучше создать резервную копию базы, особенно на рабочем сайте.
  • Если товар связан с заказами или другими данными, их целостность может нарушиться. Можно вместо полного удаления использовать статус "черновик" или "скрытый".
  • Для больших заказов с десятками товаров удаление может занять время. Используйте асинхронную обработку через WP-Cron или фоновые задачи.
  • Ограничьте удаление только товарам, которые действительно должны быть удалены, например, через метаполя или категории.

Альтернативные подходы: сравнение вариантов

МетодПлюсыМинусы
Полное удаление через wp_delete_postТовар полностью исчезает из базыРиск потери данных, неоткат
Смена статуса товара на "черновик"Безопаснее, товар можно вернутьТовар остается в базе, возможна путаница
Удаление через SQL-запросыБыстрее при больших объёмахРиск ошибок, сложнее поддерживать

Чек-лист для внедрения автоматического удаления товара после отмены заказа

  • Убедитесь, что у вас есть резервная копия сайта и базы данных.
  • Добавьте код в файл functions.php дочерней темы или в кастомный плагин.
  • Проверьте, что статус заказа именно cancelled.
  • Проверьте права пользователя и сервера на удаление постов.
  • Проведите тестовый заказ и отмену, проверьте удаление.
  • Обработайте возможные исключения и ошибки (например, отсутствие товара).
  • Очистите кеш сайта и браузера после тестов.
Как добавить автоматический отзыв на сайт WordPress после покупки
12.01.2026
Как создать собственный ключ авторизации в WordPress
25.11.2025
Как создать автоматический бэкап базы данных WordPress с помощью плагинов
16.12.2025
Как создать динамический фильтр по метаданным в WordPress с AJAX
03.03.2026
Как использовать шорткоды в WooCommerce для расширения функционала на WPBegin
04.12.2025