Проблема: зачем отключать 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 |