Краткий ответ: WooCommerce не добавляет товар в корзину чаще всего из-за кеша, отключённых cookies, ошибки JavaScript, конфликта темы или плагина, неправильных страниц Cart/Checkout, проблем с AJAX add to cart, вариативного товара без выбранной вариации, статуса товара “нет в наличии” или сломанной WooCommerce-сессии.
Исправлять нужно по цепочке: сначала проверить сам товар и кнопку, потом корзину, cookies, кеш, AJAX-запросы, консоль браузера, WooCommerce pages, тему, плагины и только после этого менять код. Нельзя сразу отключать cart fragments или кеш глобально, потому что можно ускорить сайт, но сломать мини-корзину, checkout или динамическое обновление корзины.
Добавление товара в корзину WooCommerce зависит не только от кнопки “Add to cart”. В процессе участвуют товар, форма, JavaScript, AJAX, cookies, PHP-сессия WooCommerce, страницы Cart/Checkout, кеш, тема, плагины и иногда CDN.
Поэтому проблема может выглядеть одинаково, но иметь разные причины:
Если проблема появилась после доработки магазина, лучше проверить не только корзину, но и код, который меняет карточку товара, AJAX, checkout или WooCommerce hooks. Это уже относится к доработке WooCommerce.
| Симптом | Вероятная причина | Где проверять |
|---|---|---|
| Кнопка не реагирует | JavaScript-ошибка или конфликт темы | Console, Network, тема, плагины |
| Корзина пустая после добавления | Кеш, cookies, WooCommerce session | Кеш-плагин, серверный кеш, браузер |
| AJAX возвращает 400/500 | PHP-ошибка, nonce, конфликт плагина | Network, debug.log, WooCommerce logs |
| Вариативный товар не добавляется | Не выбрана вариация или сломана форма вариаций | Product variations, JS, шаблон single-product |
| У гостя не работает, у админа работает | Кеш для гостей или cookies | Page cache, CDN, browser cookies |
| На мобильном не работает | JS-конфликт, мобильная мини-корзина, lazy/optimization | Mobile DevTools, оптимизация JS |
| После добавления редирект не туда | Неверные страницы Cart/Checkout или настройки | WooCommerce → Settings → Advanced |
| Кнопки вообще нет | Товар не покупаемый, catalog mode, out of stock | Настройки товара, склад, плагины каталога |
Сначала нужно понять, где ломается процесс: на фронтенде, в AJAX, в WooCommerce-сессии, в товаре или в кеше.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправление нужно делать от простого к сложному. Если сразу менять код, можно спрятать настоящую причину и получить новую проблему в checkout.
У товара должны быть базовые условия для покупки:
Страницы корзины, оформления заказа и аккаунта должны быть назначены отдельно. Нельзя использовать одну и ту же страницу для Cart и Checkout.
Проверьте:
Корзина, checkout и аккаунт должны оставаться динамическими. Если кеш отдаёт старый HTML, пользователь может видеть пустую корзину или чужое состояние мини-корзины.
Исключите из кеша:
Если после оптимизации сайт стал быстрее, но корзина перестала работать, отдельно проверьте настройки кеша и cart fragments. Подробно эта тема связана с ускорением WooCommerce, но отключать динамические функции нужно очень аккуратно.
WooCommerce использует cookies и сессии для хранения корзины пользователя. Если cookies блокируются браузером, CDN, кешем или security-плагином, товар может добавляться только “визуально”, а потом исчезать.
На страницах каталога WooCommerce может добавлять товар через AJAX без перезагрузки страницы. Если JavaScript сломан, кнопка может не работать или корзина не обновляется.
Проверьте в Network:
Частая причина — тема переопределяет шаблоны WooCommerce или выводит кастомную кнопку без правильных атрибутов.
На тестовой копии можно временно переключиться на стандартную тему и проверить добавление в корзину. Если на стандартной теме всё работает, причина почти точно в теме или её WooCommerce templates.
Корзину могут ломать:
Проверять конфликты лучше на staging-копии, а не на живом магазине. Безопасный порядок описан в статье про конфликт плагинов WordPress.
Важно: код ниже предназначен для диагностики WooCommerce. Не вставляйте всё сразу на рабочий магазин. Сначала сделайте бэкап и проверьте на тестовой копии. Ошибки в хуках корзины могут повлиять на добавление товара, checkout, оплату и сессии.
Куда вставлять: в файл wp-config.php перед строкой /* That’s all, stop editing! */.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Куда вставлять: лучше во временный служебный плагин или в functions.php дочерней темы только для диагностики.
<?php
if (!defined('ABSPATH')) {
exit;
}
add_filter('woocommerce_add_to_cart_validation', 'sc_debug_add_to_cart_validation', 10, 5);
function sc_debug_add_to_cart_validation($passed, $product_id, $quantity, $variation_id = 0, $variations = array()) {
error_log('================ SC ADD TO CART DEBUG ================');
error_log('Product ID: ' . (int) $product_id);
error_log('Quantity: ' . (int) $quantity);
error_log('Variation ID: ' . (int) $variation_id);
error_log('Passed: ' . ($passed ? 'yes' : 'no'));
if (!empty($variations)) {
error_log('Variations: ' . print_r($variations, true));
}
error_log('User ID: ' . get_current_user_id());
error_log('Request URI: ' . (isset($_SERVER['REQUEST_URI']) ? sanitize_text_field($_SERVER['REQUEST_URI']) : ''));
error_log('=======================================================');
return $passed;
}
Этот код помогает увидеть, подключены ли скрипты WooCommerce на странице. Не используйте его как постоянное решение.
<?php
add_action('wp_footer', 'sc_debug_wc_scripts_loaded', 99);
function sc_debug_wc_scripts_loaded() {
if (!current_user_can('manage_options')) {
return;
}
if (!function_exists('is_woocommerce')) {
return;
}
echo '<!-- SC WooCommerce scripts debug: ';
echo 'wc-add-to-cart=' . (wp_script_is('wc-add-to-cart', 'enqueued') ? 'yes' : 'no') . '; ';
echo 'wc-cart-fragments=' . (wp_script_is('wc-cart-fragments', 'enqueued') ? 'yes' : 'no') . '; ';
echo 'woocommerce=' . (wp_script_is('woocommerce', 'enqueued') ? 'yes' : 'no') . '; ';
echo '-->';
}
Важно: используйте только для диагностики простого товара. Для вариативного товара нужен variation_id и выбранные атрибуты.
https://example.com/?add-to-cart=123
Замените example.com на домен сайта, а 123 на ID простого товара. Если такая ссылка работает, а кнопка на карточке товара нет — проблема часто в теме, JavaScript, шаблоне кнопки или AJAX.
Важно: это пример для кастомной кнопки. Не заменяйте штатные кнопки WooCommerce без необходимости. Для вариативных товаров нужна отдельная логика выбора вариации.
<button type="button" class="sc-custom-add-to-cart" data-product-id="123">Добавить в корзину</button>
<div id="sc_add_to_cart_result"></div>
<script>
jQuery(document).ready(function() {
jQuery(document).on('click', '.sc-custom-add-to-cart', function() {
var productId = jQuery(this).data('product-id');
jQuery.ajax({
url: '<?php echo admin_url("admin-ajax.php") ?>',
type: 'POST',
dataType: 'json',
data: {
action: 'sc_custom_add_to_cart',
product_id: productId,
nonce: '<?php echo wp_create_nonce("sc_custom_add_to_cart_nonce") ?>'
},
success: function(response) {
if (response.success) {
jQuery('#sc_add_to_cart_result').html(response.data.message);
jQuery(document.body).trigger('wc_fragment_refresh');
} else {
jQuery('#sc_add_to_cart_result').html(response.data.message);
}
},
error: function() {
jQuery('#sc_add_to_cart_result').html('Ошибка добавления товара.');
}
});
});
});
</script>
PHP-обработчик:
<?php
add_action('wp_ajax_sc_custom_add_to_cart', 'sc_custom_add_to_cart');
add_action('wp_ajax_nopriv_sc_custom_add_to_cart', 'sc_custom_add_to_cart');
function sc_custom_add_to_cart() {
check_ajax_referer('sc_custom_add_to_cart_nonce', 'nonce');
if (!function_exists('WC')) {
wp_send_json_error(array(
'message' => 'WooCommerce не активен.'
));
}
$product_id = isset($_POST['product_id']) ? (int) $_POST['product_id'] : 0;
if ($product_id <= 0) {
wp_send_json_error(array(
'message' => 'Неверный ID товара.'
));
}
$product = wc_get_product($product_id);
if (!$product || !$product->is_purchasable()) {
wp_send_json_error(array(
'message' => 'Товар недоступен для покупки.'
));
}
if (!$product->is_in_stock()) {
wp_send_json_error(array(
'message' => 'Товара нет в наличии.'
));
}
$added = WC()->cart->add_to_cart($product_id, 1);
if (!$added) {
wp_send_json_error(array(
'message' => 'Не удалось добавить товар в корзину.'
));
}
wp_send_json_success(array(
'message' => 'Товар добавлен в корзину.'
));
}
Важно: это дополнительная страховка, а не замена настройкам кеш-плагина или серверного кеша. Если у вас Nginx, Cloudflare или серверный page cache, исключения нужно настроить именно там.
<?php
add_action('template_redirect', 'sc_no_cache_for_woocommerce_dynamic_pages');
function sc_no_cache_for_woocommerce_dynamic_pages() {
if (!function_exists('is_cart') || !function_exists('is_checkout') || !function_exists('is_account_page')) {
return;
}
if (is_cart() || is_checkout() || is_account_page()) {
nocache_headers();
}
}
После правильного исправления товар должен добавляться в корзину стабильно: у гостей и авторизованных пользователей, на компьютере и мобильном, после обновления страницы, при включённом кешировании обычных страниц и без поломки checkout.
Подходит, если проблема в страницах корзины, настройках товаров, AJAX add to cart или неправильных страницах Cart/Checkout.
Плюсы: быстро, без кода, минимальный риск.
Минусы: не поможет при конфликте темы, плагинов или кеша.
Подходит, если товар добавляется, но корзина пустая, старая или разная для гостей и авторизованных пользователей.
Плюсы: часто решает проблему без правок WooCommerce.
Минусы: нужно проверять кеш-плагин, серверный кеш, CDN, cookies и исключения.
Подходит, если проблема появилась после обновления, установки плагина или смены темы.
Плюсы: устраняет настоящую причину.
Минусы: лучше делать на staging-копии, чтобы не ломать рабочий магазин.
Подходит, если кнопка была сделана вручную в шаблоне, Elementor, кастомном блоке или отдельном плагине.
Плюсы: можно сохранить нужный дизайн и UX.
Минусы: нужно правильно обработать простые, вариативные, grouped и external товары.
Подходит, если корзина сломалась после минификации, defer, delay JS, объединения скриптов или отключения WooCommerce assets.
Плюсы: часто быстро возвращает работу кнопки.
Минусы: часть оптимизаций придётся исключить для WooCommerce-страниц.
Корзина связана с покупкой, checkout, оплатой и персональными данными. Нельзя чинить её хаотичными сниппетами из интернета без проверки.
Корзина WooCommerce динамическая. Её нельзя ускорять теми же методами, что обычную информационную страницу. Если отключить нужные скрипты или кешировать cart fragments неправильно, сайт может выглядеть быстрым, но продажи сломаются.
Проблема часто не в браузере, а в page cache, серверном кеше, CDN или кешировании WooCommerce cookies. Нужно чистить и проверять все уровни.
Cart fragments отвечают за обновление мини-корзины. Если мини-корзина используется в шапке, отключение может сломать визуальное обновление корзины.
Вариативный товар нельзя добавить как простой, если не выбрана конкретная вариация. Нужны variation_id и атрибуты.
Администратор часто видит некешированную версию сайта. Гость может получать кешированную страницу, где корзина работает неправильно.
Без Network непонятно, отправляется ли AJAX-запрос, какой статус он возвращает и что пришло в ответе.
Если WooCommerce cookies не создаются или блокируются, корзина может очищаться после перехода на другую страницу.
После обновления WooCommerce такие правки пропадут или начнут конфликтовать с новой версией.
Мини-корзина, side cart, ajax cart, checkout optimizer и theme cart drawer могут конфликтовать между собой.
Чаще всего причина в кеше, cookies, WooCommerce-сессиях, AJAX-ошибке, конфликте темы или плагина, неправильных страницах Cart/Checkout, вариациях товара или отключённых WooCommerce scripts.
Сначала проверьте товар: опубликован ли он, есть ли цена, есть ли наличие, работает ли простой товар. Затем проверьте Console, Network, cookies, кеш и WooCommerce pages.
Корзина часто становится пустой из-за кеширования Cart page, блокировки cookies, проблем с WooCommerce session, CDN, неправильных редиректов HTTP/HTTPS или кеша для гостей.
AJAX add to cart может не работать из-за JavaScript-ошибки, оптимизации JS, отключённого wc-add-to-cart, конфликта темы, security-плагина, PHP-ошибки или неправильного ответа wc-ajax.
Чаще всего гостям отдаётся кешированная версия сайта или у них не сохраняются WooCommerce cookies. Проверьте page cache, CDN, cookies и работу в режиме инкогнито.
Администратор часто не получает полный кеш страницы. Обычный пользователь или гость может видеть кешированную версию, где AJAX или cookies работают неправильно.
Нет, как обычную статическую страницу — нельзя. Cart, Checkout и My account должны быть исключены из полного кеширования, потому что показывают персональные данные и состояние корзины.
Только после проверки. Если сайт использует мини-корзину в шапке, cart fragments нужны для её обновления. Полное отключение может сломать отображение корзины.
Нужно проверить, выбраны ли все атрибуты, есть ли активная вариация, указана ли цена, есть ли наличие и не ломает ли форму вариаций тема или plugin swatches.
Причины: товар без цены, нет в наличии, catalog mode, внешний товар, ограничение по роли, ошибка шаблона темы или плагин, который заменяет кнопку.
Проверьте security-плагин, nonce, правила WAF, Cloudflare, admin-ajax.php, wp_ajax hooks и кеш страницы. Иногда 403 даёт защита от ботов или firewall.
Включите debug.log, повторите добавление товара и проверьте последнюю PHP fatal error. 500 почти всегда требует смотреть серверную ошибку, а не только настройки WooCommerce.
Да. Delay JS, defer, minify, combine JS, отключение WooCommerce assets и агрессивный кеш могут сломать кнопку добавления, AJAX и обновление мини-корзины.
Иногда да: очистить кеш, исключить Cart/Checkout/Account из кеша, проверить товар, страницы WooCommerce и отключить конфликтный плагин. Если есть PHP-ошибки, кастомная тема или AJAX-код, нужен разработчик.
Если WooCommerce не добавляет товар в корзину, причина редко находится в одной кнопке. Нужно проверить товар, вариации, страницы Cart/Checkout, cookies, WooCommerce sessions, кеш, AJAX, Console, Network, тему, плагины и debug.log.
Правильный подход — не отключать всё подряд, а идти по цепочке. Сначала простой товар и базовые настройки WooCommerce, потом кеш и cookies, затем AJAX и JavaScript, после этого тема, плагины и кастомный код. Так можно исправить корзину без поломки checkout, оплаты и дальнейших заказов.
Об авторе