WooCommerce

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

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

Один платёж и несколько заказов чаще указывают на повторную обработку checkout, webhook или callback платёжного модуля. Несколько реальных списаний — уже платёжный инцидент, где эксперименты на рабочем магазине лучше прекратить до выяснения причины.

Что проверить в первую очередь

Быстрая проверка: откройте оба заказа и сравните время создания, состав корзины, email покупателя, сумму, способ оплаты и transaction ID. Затем откройте личный кабинет платёжного сервиса и проверьте, сколько фактических транзакций прошло.

Если transaction ID одинаковый или платёж в кабинете провайдера только один, не делайте автоматический возврат по каждому дублю. Сначала определите, какой заказ связан с реальной транзакцией. Иначе можно вернуть деньги там, где второго списания вообще не было.

Если дубли появились одновременно с проблемами оплаты, сначала полезно проверить, почему не проходит оплата в WooCommerce: ошибки шлюза, callback и 3-D Secure часто находятся в той же диагностической цепочке.

Почему WooCommerce может создавать дубли заказов

1. Два запроса checkout приходят почти одновременно

Классический сценарий: покупатель нажимает кнопку оформления, запрос выполняется медленно, затем браузер или интерфейс отправляет ещё один запрос. Но проблема не всегда в «двойном клике».

В январе 2026 года в официальном репозитории WooCommerce зарегистрирован подтверждённый баг с конкурентными checkout-запросами на инфраструктуре с несколькими серверами или контейнерами. Несколько процессов могли одновременно пройти проверку корзины до появления заказа в базе и создать отдельные заказы.

Что это значит: блокировка кнопки после клика полезна для UX, но она не является полноценной защитой от серверной гонки. Два HTTP-запроса могут возникнуть и без второго клика пользователя.

2. Платёжный webhook и возврат покупателя обрабатываются параллельно

Платёжная система обычно сообщает магазину о результате несколькими каналами: пользователь возвращается на сайт, а сервер провайдера отдельно отправляет webhook. Хорошая интеграция должна безопасно переживать повтор одного и того же события.

В 2026 году в репозитории WooCommerce PayPal Payments разбирались случаи, когда webhook приходил до создания локального заказа, а параллельные PHP-процессы затем создавали несколько WooCommerce-заказов для одного PayPal Order ID. В отдельных отчётах платёж при этом списывался один раз, а остаток товара уменьшался несколько раз.

Если видите это — вероятнее всего: дубли появились в пределах нескольких секунд, у них одинаковый покупатель и корзина, а в платёжном кабинете одна транзакция. Проверяйте webhook, журналы шлюза и последовательность событий, а не настройки товара.

3. Store API или кастомный checkout повторно создаёт заказ

Современный Checkout Block работает через Store API. Кастомные интерфейсы, мобильные приложения и headless-магазины тоже могут отправлять запросы к checkout напрямую.

В мае 2026 года WooCommerce исправлял регрессию, при которой повторный POST к Store API /checkout мог создавать новый заказ вместо повторного использования существующего draft/pending-заказа. Это хороший пример универсального правила: после обновления нужно проверять не только PHP-ошибки, но и изменение жизненного цикла заказа.

Если проблема появилась сразу после обновления, сопоставьте дату первых дублей с обновлениями WooCommerce и платёжного плагина. Если одновременно возникли другие сбои, используйте алгоритм из материала про поиск причины Fatal Error в WordPress, но не откатывайте рабочий магазин вслепую.

4. Платёжный плагин или сторонняя интеграция повторно вызывает обработчик

CRM, 1С, webhook-плагины, подписки, кастомный код и интеграции доставки могут слушать события WooCommerce и выполнять дополнительные действия. Ошибка возникает, когда обработчик не проверяет, выполнялось ли действие раньше.

Здесь важен принцип идемпотентности: повтор одного и того же события не должен создавать новый бизнес-результат. Это полезный принцип далеко за пределами WooCommerce — для платежей, складского учёта, email и API-интеграций.

Пошаговая диагностика дублей заказов

Шаг 1. Сравните сами заказы

Запишите ID дублей, точное время создания, статус, сумму, товары, email, способ оплаты и transaction ID. Посмотрите примечания заказа: там часто видно переходы статусов, результат оплаты и сообщения расширений.

Если один заказ Pending/Failed, а второй Processing и только у второго есть подтверждённая транзакция, это важный признак повторного сценария checkout. Если оба имеют разные успешные transaction ID, ситуация серьёзнее: возможны два списания.

Шаг 2. Проверьте платёжный кабинет

WooCommerce показывает состояние магазина, но источником истины по факту списания остаётся платёжный провайдер. Сверьте сумму, время, ID транзакции и статус операции.

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

Шаг 3. Проверьте журналы WooCommerce и шлюза

Откройте WooCommerce → Статус → Журналы и найдите записи платёжного модуля на время инцидента. Ищите повторяющиеся запросы, одинаковые external order/payment ID, webhook-события, ошибки callback и несколько попыток capture.

Если журнал показывает один внешний платёж и несколько локальных заказов, проблема находится между checkout и созданием заказа. Если внешних попыток тоже несколько, проверять нужно и frontend, и платёжную интеграцию.

Шаг 4. Посмотрите Network в браузере

На тестовом заказе откройте DevTools → Network и выполните checkout один раз. Проверьте, сколько запросов отправляется при нажатии «Оформить заказ» или «Оплатить».

Два одинаковых запроса — сильная зацепка, но не окончательный диагноз. Серверная гонка между webhook и callback может происходить без видимого дубля в браузере.

Шаг 5. Исключите кэширование Checkout

Корзина, Checkout и My Account не должны обслуживаться как обычные статические страницы. Проверьте page cache, CDN, серверный кэш и правила оптимизатора.

Кэш сам по себе не объясняет каждый дубль, поэтому отключать всё подряд не нужно. Сначала посмотрите логи и Network, затем меняйте одну переменную за раз. Иначе диагностика превращается в комнату, где одновременно выключили весь свет.

Шаг 6. Проведите conflict test безопасно

На staging-копии оставьте WooCommerce, тему по умолчанию и проблемный платёжный модуль. Затем воспроизведите тестовый заказ. Если дубль исчез, возвращайте расширения по одному.

На живом магазине с заказами не стоит массово отключать платежи, кэш, интеграцию склада и тему. Если при диагностике появляется ошибка 500 в WordPress, сначала восстановите стабильную работу сайта, а уже потом продолжайте checkout-тесты.

Почему дубли заказов опаснее, чем кажется

Первый уровень последствий — путаница в админке. Второй — неверное уменьшение остатков. Третий — повторные письма, задания на сборку и передачу в CRM. Четвёртый — риск повторной отгрузки. Пятый — если созданы две реальные транзакции, финансовая претензия покупателя.

Поэтому «просто удалять второй заказ» — плохая стратегия. Она лечит видимый симптом, но оставляет механизм, который завтра может затронуть более дорогой заказ.

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

Когда проблема связана со статусами, а не с дублями

Иногда владелец магазина видит два похожих события в примечаниях и принимает их за два заказа. Проверьте ID: если заказ один, а статус менялся несколько раз, это другая проблема.

В этом случае поможет диагностика ситуации, когда не меняется статус заказа в WooCommerce. Не смешивайте эти сценарии: повторный status hook и создание второго заказа требуют разных исправлений.

Коротко: что делать сейчас

  1. Не удаляйте дубли до проверки платежей.
  2. Сравните transaction ID и данные в кабинете провайдера.
  3. Проверьте order notes и WooCommerce logs.
  4. На тестовом заказе изучите Network.
  5. Сопоставьте начало проблемы с обновлениями WooCommerce и шлюза.
  6. Проверьте Checkout на кэширование.
  7. Conflict test проводите на staging, а не на магазине с живыми заказами.

FAQ

Почему WooCommerce создаёт два одинаковых заказа?

Частые причины — два параллельных checkout-запроса, повторная обработка webhook/callback, ошибка платёжного расширения, Store API или сторонней интеграции. Определить источник можно по времени создания, transaction ID и журналам.

Два заказа означают, что покупателя списали дважды?

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

Можно просто удалить второй заказ?

До диагностики — не стоит. Сначала определите, какой заказ связан с реальной оплатой, проверьте остатки и интеграции. Удаление может скрыть полезные данные и усложнить восстановление склада.

Может ли кэш создавать дубли?

Некорректное кэширование checkout способно нарушать динамический процесс оформления, но не является единственной причиной. Проверять его нужно вместе с Network, логами и платежными событиями.

Что делать, если дубли появились после обновления WooCommerce?

Зафиксируйте версии WooCommerce и платёжного модуля, дату первого инцидента, изучите changelog и Issues, затем воспроизведите проблему на staging. Не откатывайте рабочий магазин без резервной копии и проверки совместимости базы.

Дубли заказов повторяются?

Если проблема затрагивает реальные платежи, склад, CRM или отгрузку, дальнейшие эксперименты на рабочем магазине могут стоить дороже самой диагностики. В такой ситуации разумнее сохранить логи, остановить рискованные изменения и проверить checkout и платёжную цепочку профессионально.

Устранить дубли заказов WooCommerce