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

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

В интернет-магазинах на WooCommerce часто возникает задача автоматического удаления товаров с определёнными атрибутами (например, цвет, размер) после того, как они были успешно проданы. Это актуально для ограниченных коллекций, сезонных товаров или уникальных товаров, которые не должны оставаться в каталоге после заказа. Без автоматизации этот процесс требует ручного контроля, что повышает риск ошибок и снижает скорость обновления ассортимента.

Основные сложности:

  • Определить, что товар с нужным атрибутом был продан (заказ завершён).
  • Безопасно удалить или скрыть товар из каталога.
  • Избежать удаления товаров, которые ещё доступны или нужны для других заказов.

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

1. Отслеживаем статус заказа для запуска удаления

Для этого используем хук woocommerce_order_status_completed, который срабатывает, когда заказ переведён в статус «завершён».

add_action('woocommerce_order_status_completed', 'delete_products_by_attributes_after_sale', 10, 1);

2. Функция удаления товаров по атрибутам

В функции получаем все товары заказа, проверяем их атрибуты и удаляем, если они соответствуют заданным условиям.

function delete_products_by_attributes_after_sale($order_id) {
    // Задайте атрибуты для удаления
    $target_attributes = [
        'pa_color' => ['red', 'blue'], // пример: атрибут цвет, значения
        'pa_size' => ['xl']
    ];

    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product) continue;

        $product_id = $product->get_id();
        $attributes = $product->get_attributes();

        // Проверяем атрибуты
        $should_delete = false;
        foreach ($target_attributes as $attr_name => $attr_values) {
            if (isset($attributes[$attr_name])) {
                $attr = $attributes[$attr_name];
                if ($attr->is_taxonomy()) {
                    $terms = wp_get_post_terms($product_id, $attr_name, ['fields' => 'slugs']);
                    foreach ($attr_values as $value) {
                        if (in_array($value, $terms)) {
                            $should_delete = true;
                            break 2;
                        }
                    }
                } else {
                    $value = $attr->get_options();
                    foreach ($attr_values as $target_value) {
                        if (in_array($target_value, $value)) {
                            $should_delete = true;
                            break 2;
                        }
                    }
                }
            }
        }

        if ($should_delete) {
            // Удаляем продукт, учитывая связанные данные
            wp_delete_post($product_id, true);
        }
    }
}

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

  • Создайте тестовый заказ с товаром, у которого есть нужные атрибуты (например, цвет «red»).
  • Переведите заказ в статус «завершён» через админку WooCommerce или программно.
  • Проверьте в каталоге, что товар удалён (его больше нет в списке продуктов и на фронтенде).
  • Для отладки можно добавить логирование внутри функции удаления, например, через error_log() или плагин Query Monitor.

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

  • Товар не удаляется после завершения заказа: Проверьте правильность хука и наличие функции в активной теме или плагине. Убедитесь, что статус заказа действительно меняется на «completed».
  • Атрибуты не распознаются: Убедитесь, что имена атрибутов указаны корректно, с префиксом pa_ для таксономий. Проверьте, что значения атрибутов совпадают по слагам.
  • Удаляется не тот товар или удаляются лишние: Проверьте логику проверки атрибутов и фильтрации. Добавьте дополнительное логирование для отладки.
  • Проблемы с правами на удаление: Убедитесь, что код выполняется с правами администратора (обычно при обработке заказа это так).

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматического удаления продуктов.
  • Подумайте о замене wp_delete_post($product_id, true) на изменение статуса товара на «черновик» или «скрытый», если хотите иметь возможность восстановить товар.
  • Для больших магазинов с частыми заказами можно добавить задержку или поставить задачу в WP-Cron, чтобы не нагружать сервер.
  • Используйте транзакции или проверяйте, что товар не используется в других заказах, прежде чем удалять.

Сравнение вариантов реализации удаления товаров по атрибутам

МетодПреимуществаНедостатки
Удаление через хук woocommerce_order_status_completedАвтоматизация сразу после продажи, простой код, без плагиновРиск удаления нужных товаров, нагрузка на сервер при большом количестве заказов
Изменение статуса товара (скрытие вместо удаления)Безопасно, можно восстановить товарыТребуется дополнительная логика для фильтрации скрытых товаров
Использование плагинов автоматизации (например, WP-Cron + кастомный код)Контроль нагрузки, гибкостьСложнее в настройке, требует мониторинга задач
Как автоматизировать создание резервных копий базы данных WordPress
15.12.2025
WooCommerce: автоматическое удаление товаров из корзины по атрибутам после оплаты
25.05.2026
Как удалить старые ревизии постов WordPress для оптимизации базы данных
01.01.2026
Как создать динамическую таблицу в WordPress с помощью плагинов и кода
12.02.2026
Как автоматизировать удаление старого контента в WordPress с помощью WP-Cron и кода
21.03.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.