Если на страницах корзины или оформления заказа в WooCommerce внезапно перестают работать обновление доставки, купоны, смена способа оплаты или пересчёт итогов, одна из частых причин — отложенная загрузка JavaScript. На обычных страницах это помогает ускорить сайт, но на checkout и cart может ломать логику WooCommerce, особенно если оптимизатор трогает jquery, wc-cart-fragments, wc-checkout или скрипты платежного шлюза.
Ниже — практический разбор: как понять, что проблема именно в отложенной загрузке, как отключить её точечно и как проверить, что после правки корзина и checkout снова работают стабильно.
Когда проблема действительно в отложенной загрузке
Сначала не трогайте код. Проверьте, что ломается именно фронтенд-оптимизацией, а не темой или плагином оплаты. Типичные симптомы:
- на checkout не пересчитывается доставка после смены адреса;
- кнопка «Оформить заказ» не реагирует или срабатывает с задержкой;
- купон применяется, но сумма не обновляется;
- способ оплаты выбирается, но форма не подгружается;
- в консоли браузера есть ошибки вроде
jQuery is not defined,wc_checkout_params is not defined,Cannot read properties of undefined.
Что смотреть в первую очередь
Откройте страницу корзины или checkout в режиме инкогнито и проверьте:
- есть ли ошибки в DevTools → Console;
- не отключены ли скрипты WooCommerce через плагин оптимизации;
- не включена ли опция типа «Delay JavaScript execution», «Defer JS», «Load JS deferred»;
- не добавлен ли checkout в исключения кеша и оптимизации только частично, без нужных JS-файлов.
Если после отключения оптимизации на время всё начинает работать, значит задача не в WooCommerce как таковом, а в конфликте с отложенной загрузкой.
Какие скрипты WooCommerce нельзя ломать на cart и checkout
На этих страницах обычно критичны не только сами файлы WooCommerce, но и скрипты темы, платежных модулей и доставки. Минимальный набор, который часто нужен без задержек:
wc-cart-fragments— обновление фрагментов корзины;wc-checkout— логика оформления заказа;jquery— базовая зависимость для многих расширений;selectWoo— если используется выпадающий выбор адреса/страны;- скрипты конкретного шлюза оплаты или доставки.
Если оптимизатор умеет исключать файлы по имени, добавляйте именно их, а не только URL страниц. Иначе проблема может остаться на AJAX-обновлениях внутри checkout.
Пошаговое решение: отключить отложенную загрузку только для корзины и checkout
Самый безопасный вариант — не выключать оптимизацию целиком, а убрать её только на страницах WooCommerce, где она мешает. Это можно сделать кодом в дочерней теме или в небольшом mu-plugin.
Вариант 1: отключить defer/delay для cart и checkout через фильтр
Если ваш плагин оптимизации поддерживает фильтр на список исключений, используйте его. Но универсального фильтра для всех плагинов нет, поэтому ниже — рабочий подход на уровне WordPress: не добавлять атрибуты defer и async на критичные скрипты WooCommerce на нужных страницах.
<?php
add_filter( 'script_loader_tag', function( $tag, $handle, $src ) {
if ( ! function_exists( 'is_cart' ) || ! function_exists( 'is_checkout' ) ) {
return $tag;
}
if ( ! is_cart() && ! is_checkout() ) {
return $tag;
}
$critical_handles = array(
'jquery',
'wc-cart-fragments',
'wc-checkout',
'selectWoo',
);
if ( in_array( $handle, $critical_handles, true ) ) {
$tag = str_replace( array( ' defer', ' async' ), '', $tag );
}
return $tag;
}, 10, 3 );Этот код не отключает оптимизацию для всех скриптов подряд. Он лишь убирает атрибуты у ключевых файлов на cart и checkout. Если ваш плагин вставляет JS через inline-обёртку или меняет загрузку другим способом, понадобятся исключения уже в настройках плагина.
Вариант 2: исключить страницы из оптимизации в плагине кеша
Если вы используете плагин кеширования/оптимизации, проверьте настройки исключений. Обычно нужно:
- исключить URL
/cart/и/checkout/из кеша HTML; - отключить delay/defer для этих страниц;
- добавить в исключения
wc-cart-fragmentsиwc-checkout; - если есть отдельные настройки для inline JS, не переносить критичные inline-скрипты в конец страницы.
Если оптимизатор позволяет задавать исключения по шаблону, лучше исключать не только страницы, но и конкретные хэндлы скриптов. Это снижает риск, что checkout сломается после обновления темы или плагина оплаты.
Сравнение подходов
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Отключить оптимизацию на всех страницах | Быстро и просто | Потеря части ускорения сайта | Только для временной диагностики |
| Исключить cart/checkout и критичные скрипты | Сохраняет ускорение на остальных страницах | Нужно проверить список исключений | Лучший вариант для боевого сайта |
| Править тему и плагины оплаты | Можно убрать точечный конфликт | Дороже в поддержке | Если проблема в конкретном расширении |
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой страницы. Нужно пройти сценарий пользователя:
- открыть корзину в инкогнито;
- изменить количество товара и убедиться, что сумма пересчиталась;
- применить купон;
- перейти на checkout и сменить адрес/город;
- проверить обновление доставки и итоговой суммы;
- выбрать способ оплаты и убедиться, что форма и кнопка работают;
- посмотреть Console на отсутствие новых ошибок JavaScript.
Если есть доступ к серверным логам или логам плагина оптимизации, проверьте, не продолжают ли на этих страницах применяться правила delay/defer. Иногда визуально всё выглядит нормально, но часть скриптов всё ещё загружается с задержкой и ломает редкие сценарии, например оплату через модальное окно.
Частые ошибки и как их исправить
Исключили только URL, но не скрипты
Это частая ошибка. Страница открывается без кеша, но JS всё равно отложен. В результате checkout может частично работать, а AJAX-обновления — нет. Решение: добавьте в исключения не только URL, но и wc-checkout, wc-cart-fragments, зависимости платежного модуля.
Отключили defer для всех скриптов на сайте
Так делают, когда хотят «быстро починить». Сайт действительно может заработать, но вы теряете смысл оптимизации. Лучше ограничить правку только cart и checkout, а на остальных страницах оставить отложенную загрузку.
Не проверили конфликт с темой
Некоторые темы добавляют собственные скрипты для мини-корзины, sticky checkout или кастомных полей. Если они завязаны на jQuery и грузятся позже нужного момента, проблема может остаться даже после исключения стандартных файлов WooCommerce. В таком случае временно переключитесь на стандартную тему и повторите тест.
Сломали оплату сторонним плагином
Платежные шлюзы часто подгружают свои JS-файлы и inline-инициализацию. Если их тоже отложить, кнопка оплаты может не сработать. Проверьте документацию конкретного шлюза и добавьте его скрипты в исключения.
Практические советы по безопасности и производительности
Если вы отключаете отложенную загрузку только на cart и checkout, это обычно разумный компромисс. Но есть несколько правил, которые стоит соблюдать:
- не правьте плагины оптимизации напрямую — обновление затрёт изменения;
- вынесите код в mu-plugin или дочернюю тему;
- после обновления WooCommerce повторяйте тест checkout, особенно если менялись шаблоны;
- не исключайте лишние скрипты без необходимости: чем больше исключений, тем слабее эффект оптимизации;
- если используете агрессивный оптимизатор, держите список исключений в документации проекта, чтобы не потерять его при переносе сайта.
Если вам нужен более широкий контроль над чисткой и оптимизацией WordPress, иногда удобнее вынести часть настроек в отдельный инструмент вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже в этом случае логику checkout всё равно нужно проверять вручную на конкретном магазине.
Мини-чек-лист перед публикацией правок
- cart и checkout открываются без ошибок в Console;
- количество товаров пересчитывается;
- купон применяется и снимается корректно;
- доставка обновляется после смены адреса;
- способ оплаты и кнопка заказа работают;
- критичные скрипты WooCommerce не получают defer/async на этих страницах;
- плагины кеша не кэшируют HTML checkout для авторизованных и неавторизованных пользователей одинаково.
Если после всех исключений проблема остаётся, ищите не в оптимизации, а в конкретном конфликте темы, платежного модуля или кастомного JavaScript, который вмешивается в стандартный поток WooCommerce.