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

Диагностика проблемы с удалением товаров в WooCommerce

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

Типичные симптомы:

  • Товары исчезают из каталога сразу после заказа;
  • Удаление происходит вне зависимости от статуса заказа;
  • Удаляются не все товары, а только некоторые;
  • Ошибка в логах или сайт работает медленнее после удаления.

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

1. Определение текущей реализации

Первым делом проверьте, где реализуется удаление товара. Это может быть в functions.php темы, в кастомном плагине или стороннем плагине. Если вы используете WP7, проверьте раздел автоматизации.

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

Ниже пример кода, который удаляет товар из каталога только после успешной оплаты первого заказа, при этом учитывает статус заказа и удаляет товар только у тех пользователей, которые впервые его купили.

add_action('woocommerce_order_status_completed', 'custom_remove_product_after_first_order', 10, 1);
function custom_remove_product_after_first_order($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();
        $user_id = $order->get_user_id();

        if (!$user_id) continue; // Гость, пропускаем

        // Проверяем, был ли уже куплен этот товар пользователем
        $args = array(
            'limit' => 1,
            'customer_id' => $user_id,
            'status' => array('completed', 'processing'),
            'exclude' => array($order_id),
            'meta_query' => array(
                array(
                    'key' => '_product_id',
                    'value' => $product_id,
                    'compare' => '='
                )
            )
        );

        $orders = wc_get_orders($args);

        if (empty($orders)) {
            // Это первый заказ с этим товаром - удаляем товар
            wp_delete_post($product_id, true); // Удаляем сразу из базы
        }
    }
}

Этот код срабатывает после смены статуса заказа на "завершён", проверяет, если пользователь впервые купил товар, то удаляет его из каталога.

3. Настройка и размещение кода

Код рекомендуется добавить в дочернюю тему functions.php или в кастомный плагин, чтобы не потерять при обновлении. Если используется WP7, можно добавить через модуль автоматизации.

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

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

  1. Создайте тестового пользователя, который ещё не покупал товар.
  2. Оформите заказ с нужным товаром и подтвердите оплату (статус "завершён").
  3. Проверьте каталог — товар должен исчезнуть.
  4. Оформите второй заказ тем же пользователем с тем же товаром — он уже не должен быть доступен.
  5. Повторите заказ другим пользователем — товар должен остаться до первого заказа.

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

  • Удаление товара у всех пользователей сразу: отсутствие проверки user_id в коде приводит к глобальному удалению. Исправьте добавлением проверки покупателя.
  • Удаление до изменения статуса заказа: если удалять товар сразу после оформления заказа, возможны ошибки. Используйте хук woocommerce_order_status_completed.
  • Удаление товара, который ещё нужен: убедитесь, что удаляется именно нужный товар, а не связанный или вариация. Используйте get_product_id(), а не get_variation_id().
  • Потеря данных о товаре: если товар удаляется без предварительного резервного копирования, восстановить данные сложно. Рекомендуется делать бэкап перед изменениями.

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

  • Обязательно тестируйте код на staging-сайте, чтобы избежать сбоев в рабочем магазине.
  • Используйте транзакции и проверяйте корректность статуса заказа, чтобы не удалять товар преждевременно.
  • Для больших магазинов с высокой нагрузкой используйте кеширование и минимизируйте количество запросов к базе с помощью wc_get_orders с лимитом.
  • Храните логи удалённых товаров для аудита и возможного восстановления.

Сравнение вариантов реализации удаления товара после первого заказа

МетодПлюсыМинусыПример кода
Плагин с автоматическим удалениемПростота установки, готовые настройкиМожет быть избыточным, не всегда гибокНет (зависит от плагина)
Кастомный код в functions.phpТочная настройка под задачи, контроль логикиТребует навыков разработки, риск ошибокКод из статьи выше
Удаление вручную через админкуБезопасно, нет риска ошибок в кодеНе автоматизировано, требует времениНет
Как удалить неиспользуемые таблицы в базе данных WordPress
27.03.2026
Уникальные методы бэкапа базы данных WordPress в 2024 году
17.04.2026
WooCommerce: как автоматически удалять товар после первого заказа
16.05.2026
Как создать собственный шорткод в WordPress
31.10.2025
WooCommerce: как автоматически удалять товары после первого заказа
25.05.2026