Puppy City — диагностика и починка checkout (WooCommerce)
Интернет-магазин щенков (зоо-ритейл, США) · E-commerce / зоотовары (продажа щенков от заводчиков)
- PHP
- WordPress
- WooCommerce
- JavaScript
- jQuery
- ACF
- Elementor
- MySQL
- HTML
- CSS/SCSS
- Select2
- Slick
- платежи (NMI Gateway / Collect.js)
- 5
- 31
- 1.6 ГБ
- WooCommerce 10.6.1
- 128M
Контекст и задача
Puppy City (puppycity.com) — действующий интернет-магазин продажи щенков от заводчиков на WordPress + WooCommerce (классический checkout, платёжный шлюз NMI Gateway). На странице оформления заказа наблюдалась «бесконечная загрузка»: оплатить картой было невозможно. Ранее уже было найдено и частично устранено несколько проблем, но симптом сохранялся. Задача — провести углублённую диагностику, найти настоящую корневую причину и предложить проверяемое решение, не ломая остальной функционал магазина.
Что я сделал
Это работа в формате аудита/диагностики на существующей legacy-теме (не разработка с нуля). Конкретно:
- Реконструировал полную цепочку отказа checkout от клиента до сервера и оформил её в
CHECKOUT_DIAGNOSTIC_REPORT.mdс доказательствами (фрагменты HTML/CSS/JS, ссылки на файлы и строки). - Локализовал корневую причину — прелоадер LoftLoader, блокирующий страницу overlay (см. «Решение и подход»).
- Разобрал ранее найденные проблемы и зафиксировал их статус: нехватка PHP-памяти (JetEngine → Fatal Error на AJAX
update_order_review), удаление всех billing/shipping-полей фильтрами темы, отсутствие способа доставки, мёртвый код PayPal blockUI. - Провёл удалённую диагностику прод-сервера: анализ
debug.log(фильтрация fatal/error/nmi/checkout/collect) и проверку доступностиCollect.jsпод NMI — команды формализованы в конфиге Claude Code. - Подготовил архитектурную документацию темы (
AGENTS.md,CLAUDE.md) для дальнейшей AI-ассистированной поддержки.
Граница ролей: часть ранних правок («3 из 4») по отчёту вносил заказчик; вклад автора — преимущественно диагностика, формулировка корневой причины и конкретных правок (с указанием файлов и строк).
Решение и подход
Ключевой инсайт — симптом «вечного спиннера» имел не одну, а несколько наложенных причин, и «очевидные» (память, поля, доставка) маскировали настоящую:
- Корневая причина — LoftLoader. Плагин показывал полноэкранный полупрозрачный overlay (opacity ~0.55,
position: fixed,z-index: 999999) на всех страницах, включая checkout. Overlay снимается по событиюwindow.load, ноCollect.js(NMI) создаёт iframes с внешнегоsandbox.nmi.com, которые задерживаютwindow.load; приdata-max-load-time=0у плагина не было fallback-таймаута → overlay висел бесконечно и блокировал все взаимодействия (поля видны «сквозь», но кликабельность заблокирована). Предложены три варианта (dequeue + скрытие разметки на checkout/cart; «Homepage only»; полное отключение). - Память и AJAX. JetEngine при
update_order_reviewупирался в 128M → Fatal Error → AJAX без ответа → WooCommerceblockUIне снимался. Рекомендация — поднятьmemory_limitи очистить раздувшийсяdebug.log. - Поля заказа. Фильтры в
functions.php(строки 140–151) удаляли все секцииbilling/shipping, конфликтуя с Checkout Field Editor Pro и лишая NMI обязательных billing-данных (AVS). Рекомендация — отдать управление полями плагину. - Доставка. Зафиксирован конфликт двух кастомных плагинов доставки (дублирующие функции → Fatal Error при одновременной активации) и отключение нативной доставки фильтром
woocommerce_cart_needs_shipping → __return_false(строка 1201). - Чистка. Указан мёртвый код
puppycity_fix_paypal_blockui(строки 1217–1253) при деактивированном PayPal.
Косвенное свидетельство хирургического подхода к шаблонам — переопределения checkout-темы были выведены из работы переименованием каталогов (woocommerce/checkout.bak, woocommerce/checkout.copy), чтобы checkout рендерился штатным шаблоном WooCommerce при диагностике.
Результат
- Подготовлен подробный диагностический отчёт с воспроизводимыми доказательствами и приоритизированным планом действий (
CHECKOUT_DIAGNOSTIC_REPORT.md). - Корневая причина «бесконечной загрузки» (LoftLoader) идентифицирована и помечена в отчёте как ещё не исправленная на момент сдачи — финальное подтверждение устранения симптома не зафиксировано (уточнить у автора).
- Ранее найденные проблемы по отчёту: 3 из 4 отмечены исправленными (память/512M — с расхождением в данных, billing/shipping-поля, нативная доставка), мёртвый код PayPal — к удалению.
- Сайт публично доступен (главная отвечает HTTP 200,
https://www.puppycity.com/, проверено). - Числовые показатели — см. блок
metrics(со ссылкой на источник).
Стек и обоснование
WordPress + WooCommerce (классический checkout принудительно включён фильтром woocommerce_checkout_is_block_checkout → __return_false) как платформа магазина; дочерняя тема twentytwentyone-child со «своей» логикой на PHP/jQuery (кастомная AJAX-авторизация покупателей и заводчиков, OTP-сброс пароля через transients, AJAX-фильтры товаров-щенков, кастомная корзина). ACF — кастомные поля товаров/таксономий; Elementor, Select2, Slick, Fancybox, SweetAlert2 — UI. Платёжный слой — NMI Gateway с токенизацией через Collect.js (PCI DSS), что и стало источником задержки window.load. Оптимизация загрузки — ручной dequeue/deregister ассетов по page ID в deque-enque.php.
Роль ИИ в проекте
Проект — выраженный пример AI-augmented диагностики:
Инженерные вызовы
- Многослойный симптом. Один и тот же «вечный спиннер» порождался несколькими независимыми причинами; «очевидные» правки не снимали проблему и маскировали корневую (LoftLoader). Потребовалась диагностика именно на уровне событий браузера (
window.load) и взаимодействия со сторонними iframes платёжного провайдера. - Хрупкая legacy-среда. 31 плагин (WooCommerce, Elementor, JetEngine, ACF Pro, Wordfence и др.), захардкоженные ID страниц, дублирующие кастомные плагины доставки, конфликтующие фильтры полей — изменения нужно было предлагать точечно и обратимо.
- Внешняя зависимость в платеже. Поведение Collect.js (sandbox.nmi.com, сеть/VPN/блокировщики) напрямую влияло на снятие overlay — диагностика учитывала клиент-серверную и сетевую составляющие.
Услуги в проекте
- аудит
- диагностика checkout
- доработка legacy
- поддержка
- удалённая диагностика прод-сервера