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

Проблема: зачем отключать AJAX добавление в корзину для отдельных товаров в WooCommerce

По умолчанию WooCommerce использует AJAX для добавления товаров в корзину без перезагрузки страницы. Это улучшает UX для большинства товаров, но может создавать проблемы, если для некоторых товаров нужно перенаправление на страницу корзины или особая логика после добавления. Например:

  • Товары с опциями, требующими подтверждения до оформления заказа.
  • Товары с ограничениями по количеству или уникальным процессом покупки.
  • Товары, для которых нужно обязательно показать уведомление или форму, недоступные при AJAX.

Поэтому возникает задача: отключить AJAX добавление в корзину только для конкретных товаров, сохранив его для остальных.

Диагностика проблемы: как определить, что AJAX добавление мешает для конкретных товаров

Для диагностики стоит:

  • Проверить, есть ли ошибки JavaScript при добавлении товара в корзину.
  • Оценить, корректно ли обновляется интерфейс после AJAX-запроса.
  • Посмотреть, нужно ли перенаправление для товара, и происходит ли оно.

Если AJAX не позволяет показать нужное поведение, значит отключение для таких товаров оправдано.

Пошаговое решение: как отключить AJAX добавление в корзину для отдельных товаров

1. Определяем ID или категорию товаров

Например, у нас есть товары с ID 15, 27 и 33, для которых нужно отключить AJAX.

2. Добавляем фильтр для изменения поведения кнопки "Добавить в корзину"

WooCommerce выводит кнопку через функцию woocommerce_loop_add_to_cart_link. Можно отфильтровать её HTML и убрать класс ajax_add_to_cart для нужных товаров.

add_filter('woocommerce_loop_add_to_cart_link', 'custom_disable_ajax_add_to_cart', 10, 2);
function custom_disable_ajax_add_to_cart($html, $product) {
    $disable_ajax_ids = array(15, 27, 33); // ID товаров
    if (in_array($product->get_id(), $disable_ajax_ids)) {
        // Убираем класс ajax_add_to_cart
        $html = str_replace('ajax_add_to_cart', '', $html);
    }
    return $html;
}

3. Отключаем AJAX и на странице одиночного товара

Для одиночного товара отключим AJAX добавление, заменив кнопку на обычную форму отправки.

add_filter('woocommerce_product_single_add_to_cart_text', 'custom_single_add_to_cart_text');
function custom_single_add_to_cart_text($text) {
    global $product;
    $disable_ajax_ids = array(15, 27, 33);
    if (in_array($product->get_id(), $disable_ajax_ids)) {
        // Можно изменить текст, если нужно
        return __('Добавить в корзину', 'woocommerce');
    }
    return $text;
}

add_action('wp_enqueue_scripts', 'custom_disable_ajax_for_specific_products');
function custom_disable_ajax_for_specific_products() {
    if (is_product()) {
        global $product;
        $disable_ajax_ids = array(15, 27, 33);
        if (in_array($product->get_id(), $disable_ajax_ids)) {
            // Отключаем скрипт ajax добавления в корзину
            wp_dequeue_script('wc-add-to-cart');
        }
    }
}

Проверка результата после внедрения

  • Перейдите на страницу архива товаров и убедитесь, что кнопки «Добавить в корзину» для указанных товаров не используют AJAX (кнопка должна вести на перезагрузку страницы или перенаправление).
  • Проверьте на странице одиночного товара, что при нажатии происходит обычная отправка формы и страница обновляется.
  • Отсутствуют ли ошибки в консоли браузера при добавлении в корзину этих товаров.
  • Для остальных товаров AJAX добавление работает как и раньше.

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

  • Кнопка не меняется или AJAX всё равно срабатывает: возможно, тема или плагин переопределяют шаблоны WooCommerce. Проверьте кастомные шаблоны и убедитесь, что фильтр применяется.
  • Удаление скрипта wp_dequeue_script влияет на другие товары: убедитесь, что условие проверки ID товара срабатывает корректно, иначе скрипт отключится для всех.
  • Кэширование мешает увидеть изменения: очистите кэш браузера и плагинов кэширования после внесения изменений.

Практические советы по производительности и безопасности

  • Отключая AJAX для части товаров, вы снижаете нагрузку на клиентский скрипт, но увеличиваете количество перезагрузок страниц. Балансируйте UX и производительность.
  • Если у вас много товаров с отключённым AJAX, подумайте о создании метаполя для управления этим параметром, чтобы не править код при добавлении новых товаров.
  • Используйте wp_localize_script для передачи списка ID товаров с отключённым AJAX, чтобы не хардкодить их в PHP.

Сравнение вариантов отключения AJAX добавления в корзину

МетодПлюсыМинусы
Удаление класса ajax_add_to_cart через фильтрПростой, локальный контроль для архивных страницНе влияет на одиночные товары, нужен доп. код
Отключение скрипта wc-add-to-cart на странице товараПолное отключение AJAX для одиночного товараЕсли условие неверно, отключит AJAX для всех товаров
Использование метаполей и JS фильтрацииГибкое, можно менять без кодаСложнее в реализации, требует JS
Как использовать WordPress Transients для эффективного кэширования данных
07.02.2026
Как удалить или изменить атрибуты товаров WooCommerce через код
01.05.2026
Как настроить индивидуальные ценовые правила в WooCommerce для разных ролей пользователей
13.05.2026
Как создать свой шорткод в WordPress
03.11.2025
Как удалить категории в WordPress правильно с помощью кода и плагинов
04.02.2026