Перейти к содержимому
Эльдар Шахвалиев
Обсудить проект
← Все проекты
202603.2026 — 03.2026Сданаудитдостоверность: medium

Puppy City — диагностика и починка checkout (WooCommerce)

Интернет-магазин щенков (зоо-ритейл, США) · E-commerce / зоотовары (продажа щенков от заводчиков)

Fullstack-разработчик WordPress/WooCommerce; диагностика и доработка legacy-темы

  • PHP
  • WordPress
  • WooCommerce
  • JavaScript
  • jQuery
  • ACF
  • Elementor
  • MySQL
  • HTML
  • CSS/SCSS
  • Select2
  • Slick
  • платежи (NMI Gateway / Collect.js)
5
выявленных причин сбоя оформления заказа (4 ранних + корневая — LoftLoader)
31
активных плагинов на сайте (источник нагрузки и конфликтов)
1.6 ГБ
размер debug.log из-за повторяющихся PHP Fatal Error
WooCommerce 10.6.1
версия на проде на момент аудита
128M
PHP memory_limit на проде (рекомендовано поднять до 256M)

Контекст и задача

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 без ответа → WooCommerce blockUI не снимался. Рекомендация — поднять 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
  • поддержка
  • удалённая диагностика прод-сервера