Диагностика проблемы с удалением товаров в 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, можно добавить через модуль автоматизации.
Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Создайте тестового пользователя, который ещё не покупал товар.
- Оформите заказ с нужным товаром и подтвердите оплату (статус "завершён").
- Проверьте каталог — товар должен исчезнуть.
- Оформите второй заказ тем же пользователем с тем же товаром — он уже не должен быть доступен.
- Повторите заказ другим пользователем — товар должен остаться до первого заказа.
Частые ошибки и их исправление
- Удаление товара у всех пользователей сразу: отсутствие проверки user_id в коде приводит к глобальному удалению. Исправьте добавлением проверки покупателя.
- Удаление до изменения статуса заказа: если удалять товар сразу после оформления заказа, возможны ошибки. Используйте хук
woocommerce_order_status_completed. - Удаление товара, который ещё нужен: убедитесь, что удаляется именно нужный товар, а не связанный или вариация. Используйте
get_product_id(), а неget_variation_id(). - Потеря данных о товаре: если товар удаляется без предварительного резервного копирования, восстановить данные сложно. Рекомендуется делать бэкап перед изменениями.
Практические советы для безопасности и производительности
- Обязательно тестируйте код на staging-сайте, чтобы избежать сбоев в рабочем магазине.
- Используйте транзакции и проверяйте корректность статуса заказа, чтобы не удалять товар преждевременно.
- Для больших магазинов с высокой нагрузкой используйте кеширование и минимизируйте количество запросов к базе с помощью
wc_get_ordersс лимитом. - Храните логи удалённых товаров для аудита и возможного восстановления.
Сравнение вариантов реализации удаления товара после первого заказа
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Плагин с автоматическим удалением | Простота установки, готовые настройки | Может быть избыточным, не всегда гибок | Нет (зависит от плагина) |
| Кастомный код в functions.php | Точная настройка под задачи, контроль логики | Требует навыков разработки, риск ошибок | Код из статьи выше |
| Удаление вручную через админку | Безопасно, нет риска ошибок в коде | Не автоматизировано, требует времени | Нет |