wpmake.ru wordpress WPMake

Как отладить неработающий AJAX в WooCommerce после обновления

После обновления WooCommerce или темы чаще всего ломаются не «все AJAX сразу», а один конкретный сценарий: добавление в корзину без перезагрузки, обновление мини-корзины, фильтры товаров, изменение количества в корзине, выбор вариации. Внешне это выглядит одинаково — кнопка нажимается, но ничего не происходит, либо запрос уходит с ошибкой 400/403/500.

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

Что именно сломалось: сначала определяем сценарий

Не начинайте с отключения всех плагинов. Сначала зафиксируйте, какой AJAX-эндпоинт не работает. В WooCommerce это обычно один из типовых запросов:

  • ?wc-ajax=add_to_cart — добавление товара в корзину;
  • ?wc-ajax=get_refreshed_fragments — обновление фрагментов корзины;
  • admin-ajax.php — кастомные действия темы или плагинов;
  • запросы к REST API WooCommerce, если фронтенд собран на JS-компонентах.

Откройте DevTools в браузере, вкладку Network, повторите действие и посмотрите статус ответа. Это сразу покажет, куда копать дальше.

Диагностика по коду ответа

  • 200, но интерфейс не меняется — чаще всего ошибка в JavaScript или конфликт с другим скриптом.
  • 400 — запрос сформирован неправильно, часто из-за устаревшего шаблона или неверных параметров.
  • 403 — блокировка со стороны безопасности, кэша, WAF или nonce.
  • 500 — PHP-ошибка, несовместимость плагина, тема или серверная проблема.

Быстрая проверка: конфликт или сервер

Если проблема появилась сразу после обновления, сначала проверьте две вещи: кэш и консоль браузера. Очень часто фронтенд продолжает отдавать старые JS/CSS, а новый код WooCommerce уже работает по другой логике.

  1. Очистите кэш сайта, CDN и браузера.
  2. Откройте страницу в режиме инкогнито.
  3. Посмотрите Console на наличие ошибок JavaScript.
  4. Проверьте, не подменяет ли тема стандартные шаблоны WooCommerce.

Если в консоли есть ошибка вроде Uncaught TypeError или $ is not a function, проблема почти наверняка в JS-конфликте, а не в самом WooCommerce.

Пошаговое решение: от простого к точечному

1. Включите логирование ошибок WordPress

Если AJAX возвращает 500 или просто обрывается, сначала посмотрите PHP-лог. Для локальной диагностики удобно временно включить отладку в wp-config.php:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

После повторения ошибки проверьте файл wp-content/debug.log. Там обычно видно, какой плагин или шаблон падает.

2. Проверьте, не ломает ли тему стандартные шаблоны WooCommerce

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

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

3. Исключите конфликт плагинов

Не отключайте всё подряд без плана. Начните с плагинов, которые вмешиваются во фронтенд: кэш, оптимизация JS, фильтры товаров, мини-корзина, конструкторы страниц, security-плагины.

Удобный порядок проверки:

  • кэш и оптимизация;
  • security/WAF;
  • плагины фильтрации и поиска;
  • плагины, которые добавляют AJAX-кнопки и виджеты корзины;
  • кастомный код в functions.php или mu-plugins.

4. Проверьте, не минифицируется ли критичный JS

После обновления часто ломается именно связка минификации и объединения скриптов. Если у вас включены оптимизации, временно отключите:

  • объединение JS;
  • отложенную загрузку скриптов, если она затрагивает WooCommerce;
  • defer/async для скриптов, от которых зависит корзина и вариации.

Если после этого AJAX начинает работать, добавьте исключения для скриптов WooCommerce и темы. Не пытайтесь лечить это «ещё одной минификацией» — проблема обычно в порядке загрузки.

Когда нужен код: точечная проверка и исправление

Если проблема связана с кастомным скриптом, полезно проверить, загружается ли wc-cart-fragments и не отключили ли его вручную. Ниже пример, который показывает, как безопасно подключить зависимость для собственного фронтенд-скрипта:

add_action( 'wp_enqueue_scripts', function () {
    if ( function_exists( 'is_woocommerce' ) && ( is_woocommerce() || is_cart() || is_checkout() ) ) {
        wp_enqueue_script(
            'my-shop-script',
            get_stylesheet_directory_uri() . '/assets/js/my-shop.js',
            array( 'jquery', 'wc-cart-fragments' ),
            '1.0.0',
            true
        );
    }
}, 20 );

Если ваш код обращается к admin-ajax.php, проверьте, что:

  • в JS передаётся корректный action;
  • nonce создаётся и проверяется;
  • обработчик зарегистрирован и для авторизованных, и для гостей, если это нужно.

Пример серверного обработчика:

add_action( 'wp_ajax_my_cart_action', 'my_cart_action_handler' );
add_action( 'wp_ajax_nopriv_my_cart_action', 'my_cart_action_handler' );

function my_cart_action_handler() {
    check_ajax_referer( 'my_cart_nonce', 'nonce' );

    $product_id = isset( $_POST['product_id'] ) ? absint( $_POST['product_id'] ) : 0;

    if ( ! $product_id ) {
        wp_send_json_error( array( 'message' => 'Некорректный product_id' ), 400 );
    }

    wp_send_json_success( array( 'message' => 'OK' ) );
}

Что проверить после исправления

Недостаточно увидеть, что кнопка снова нажимается. Проверьте весь связанный сценарий:

  • товар добавляется в корзину без перезагрузки;
  • мини-корзина обновляется;
  • количество товара меняется и пересчитывается итог;
  • вариации подставляются корректно;
  • ошибок в Console больше нет;
  • в Network нет повторяющихся 403/500 на одном и том же запросе.

Если вы меняли кэш или исключения для JS, откройте сайт в инкогнито и повторите тест на мобильном и десктопе. Иногда проблема проявляется только в одной версии кэширующего плагина или только на сжатом mobile bundle.

Сравнение подходов: плагин, код или настройка

ПодходКогда подходитМинус
Настройка кэша/оптимизацииЕсли AJAX сломался после включения минификации, defer или объединения скриптовНужно аккуратно исключать зависимости WooCommerce
Отключение конфликтующего плагинаЕсли ошибка появилась после обновления конкретного расширенияНе решает проблему, если конфликт в теме или кастомном коде
Точечный код в теме или mu-pluginЕсли нужен контроль над загрузкой скриптов и обработчикамиТребует проверки nonce, зависимостей и логов

Частые ошибки и как их исправить

  • Очищают только кэш браузера. Если есть CDN или серверный кэш, старый JS всё равно может отдаваться оттуда.
  • Отключают весь AJAX в WooCommerce. Это маскирует проблему, но ломает корзину и UX.
  • Не смотрят Console. Без ошибок JavaScript вы теряете половину картины.
  • Проверяют только авторизованного пользователя. У гостей часто другой путь выполнения, особенно в корзине и checkout.
  • Оставляют устаревшие шаблоны WooCommerce в теме. После обновления ядра это один из самых частых источников поломок.

Безопасность и производительность: что не стоит делать

Не отключайте nonce и не оставляйте открытые AJAX-обработчики без проверки прав, если они меняют данные. Для публичных действий используйте минимально необходимую валидацию и возвращайте только те данные, которые действительно нужны фронтенду.

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

Когда нужна более широкая чистка конфликтов, полезно сначала убрать лишние дубли и мусорные настройки, а уже потом возвращать оптимизацию по одному параметру. Для этого иногда удобнее использовать инструменты вроде Clearfy Pro, если он уже есть в стеке, но сам по себе плагин не заменяет диагностику.

Если после всех проверок AJAX всё ещё падает, соберите минимум данных: URL страницы, точный запрос из Network, статус ответа, текст ошибки из Console и фрагмент из debug.log. С таким набором уже можно быстро понять, где именно разрыв — в JS, в PHP или в кэше.

×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙