Сценарий типичный: пользователь нажимает «Добавить в корзину», а вы хотите сразу вести его на страницу оформления заказа. Это полезно для магазинов с небольшим каталогом, продажей одного товара, услуг или быстрых повторных покупок. Но простое перенаправление работает не во всех случаях: вариации, AJAX-кнопки, мини-корзина и сторонние темы могут вести себя по-разному.
Ниже разберём, как сделать редирект на checkout после добавления товара в WooCommerce, как не сломать добавление вариативных товаров и как проверить, что всё действительно работает.
Когда это нужно и что именно ломается
Чаще всего задача выглядит так: покупатель добавил товар, и вместо страницы корзины должен попасть сразу на /checkout/. На практике проблемы возникают в трёх местах:
- тема или плагин переопределяет поведение кнопки «Добавить в корзину»;
- для простых товаров редирект работает, а для вариаций — нет;
- AJAX-добавление в корзину остаётся включённым, и переход не происходит.
Если у вас уже есть кастомные кнопки, быстрый заказ или отдельный checkout-плагин, сначала проверьте, не конфликтует ли новая логика с ними. Иначе вы получите двойные редиректы, пустую корзину или потерю выбранной вариации.
Диагностика проблемы перед изменениями
Перед правкой кода полезно понять, где именно находится точка конфликта. Это экономит время и помогает не править лишнее.
Что проверить в админке WooCommerce
- Включено ли добавление в корзину через AJAX на страницах каталога.
- Не используется ли плагин быстрого заказа, который перехватывает кнопку.
- Не заменяет ли тема стандартные шаблоны WooCommerce.
Что проверить в браузере
- Откройте страницу товара и добавьте простой товар.
- Проверьте, меняется ли URL после клика.
- Посмотрите, появляется ли товар в мини-корзине и в самой корзине.
- Для вариативного товара выберите атрибуты и убедитесь, что кнопка активируется корректно.
Если товар добавляется, но редиректа нет, значит нужно менять поведение после успешного добавления. Если товар вообще не добавляется, сначала чините форму вариации или конфликт JS.
Пошаговое решение через код
Самый предсказуемый вариант — отключить лишние переходы и после успешного добавления отправлять пользователя на checkout. Для этого обычно достаточно двух шагов: убрать AJAX там, где он мешает, и добавить фильтр редиректа.
1. Отключить AJAX-добавление на страницах каталога, если оно мешает редиректу
Если вам не критичен AJAX на архивных страницах, проще всего убрать его для стандартных кнопок. Это снижает количество «магии» и делает поведение стабильнее.
<?php
add_filter( 'woocommerce_loop_add_to_cart_link', function( $html, $product ) {
if ( ! $product instanceof WC_Product ) {
return $html;
}
// Оставляем стандартную ссылку WooCommerce без AJAX-обёрток темы/плагина.
if ( $product->is_purchasable() && $product->is_in_stock() ) {
$url = $product->add_to_cart_url();
$label = $product->add_to_cart_text();
return sprintf(
'<a href="%s" rel="nofollow" data-product_id="%d" data-quantity="1" class="button add_to_cart_button">%s</a>',
esc_url( $url ),
absint( $product->get_id() ),
esc_html( $label )
);
}
return $html;
}, 10, 2 );
Этот вариант нужен не всегда. Если тема уже корректно работает без AJAX, пропустите его и используйте только редирект после добавления.
2. Перенаправлять на страницу оформления заказа после добавления в корзину
Для простых товаров и большинства стандартных сценариев достаточно фильтра woocommerce_add_to_cart_redirect. Он срабатывает после успешного добавления товара и позволяет отправить пользователя на checkout.
<?php
add_filter( 'woocommerce_add_to_cart_redirect', function( $url ) {
if ( is_admin() ) {
return $url;
}
return wc_get_checkout_url();
} );
Такой код можно добавить в functions.php дочерней темы или в небольшой сайт-специфичный плагин. Если у вас есть отдельные товары, для которых корзина всё-таки нужна, лучше добавить исключение по ID.
<?php
add_filter( 'woocommerce_add_to_cart_redirect', function( $url ) {
$skip_redirect_products = array( 123, 456 );
if ( isset( $_REQUEST['add-to-cart'] ) ) {
$product_id = absint( wp_unslash( $_REQUEST['add-to-cart'] ) );
if ( in_array( $product_id, $skip_redirect_products, true ) ) {
return wc_get_cart_url();
}
}
return wc_get_checkout_url();
} );
3. Для вариативных товаров проверить шаблон и поведение формы
У вариаций редирект часто не срабатывает не из-за фильтра, а из-за того, что форма не отправляет товар как положено. Если кнопка «Купить» не активируется после выбора атрибутов, проблема обычно в JS темы или в конфликте с плагином вариаций.
В этом случае сначала убедитесь, что стандартный шаблон вариаций WooCommerce не переопределён. Если переопределён, сравните его с актуальной версией из плагина WooCommerce. Иногда достаточно вернуть штатный шаблон variable.php и variation-add-to-cart-button.php.
Сравнение подходов: код, плагин или настройки темы
| Подход | Когда подходит | Минус |
|---|---|---|
Фильтр woocommerce_add_to_cart_redirect | Стандартный магазин, нужен редирект на checkout | Не решает конфликты AJAX и сломанные вариации |
| Правка шаблонов/JS темы | Тема переопределяет поведение кнопок | Нужно аккуратно обновлять при апдейтах темы |
| Плагин быстрого заказа | Нужны модальные окна, телефон, упрощённый checkout | Больше зависимостей и риск конфликтов |
Если задача только в том, чтобы убрать корзину как промежуточный шаг, код обычно надёжнее. Если нужен отдельный сценарий покупки с полями телефона и доставки, тогда логичнее смотреть в сторону специализированного решения, а не собирать всё вручную.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. После внедрения кода пройдитесь по короткому чек-листу:
- добавьте простой товар и убедитесь, что открывается checkout;
- проверьте товар с вариациями: выбор атрибутов, добавление, переход;
- посмотрите, что товар реально появился в корзине на странице оформления заказа;
- обновите страницу checkout и проверьте, не пропал ли товар;
- если есть кэш-плагин, очистите кэш и повторите тест в приватном окне.
Полезно открыть консоль браузера и проверить, нет ли JS-ошибок на странице товара. Если ошибки есть, редирект может не сработать даже при правильном PHP-коде.
Частые ошибки и как их исправить
Редирект не срабатывает вообще
Чаще всего фильтр добавлен не туда или его перезаписывает другой код. Проверьте, что код загружается на фронтенде, а не только в админке. Если используете плагин для сниппетов, убедитесь, что сниппет активен для сайта целиком.
После редиректа корзина пустая
Такое бывает, если сторонний плагин перехватывает добавление через AJAX и не завершает стандартный процесс WooCommerce. В этом случае отключите AJAX-добавление для каталога или временно выключите конфликтующий плагин и повторите тест.
Вариативный товар не добавляется
Обычно причина в сломанной форме вариаций или в переопределённом шаблоне. Проверьте, не устарел ли шаблон в теме, и сравните его с текущей версией WooCommerce. Если тема давно не обновлялась, это первое место для поиска.
Редирект мешает отдельным товарам
Если часть товаров должна вести в корзину, а часть — сразу в checkout, не делайте один общий редирект без исключений. Проще завести список ID или условие по категории товара.
Практика безопасности и производительности
Даже такой небольшой кусок логики лучше держать в дочерней теме или в отдельном мини-плагине. Так вы не потеряете правку при обновлении темы. Не вставляйте код прямо в шаблоны WooCommerce, если задача решается фильтром: это усложняет поддержку.
Если на сайте уже есть кэширование страниц, проверьте, не кэшируется ли checkout. Страницу оформления заказа кэшировать нельзя: это может привести к неверным данным корзины и проблемам с сессией WooCommerce. Для этого обычно настраивают исключения в кэширующем плагине или на сервере.
Если нужен более управляемый сценарий без ручной сборки логики, иногда удобнее взять готовую тему или набор инструментов, где поведение магазина уже продумано. Например, для интернет-магазинов можно посмотреть тему Bono, если нужен магазинный шаблон с нормальной базой под WooCommerce.
Если нужен не просто редирект, а быстрый заказ
Иногда задача звучит как «убрать корзину», но по факту нужен не редирект, а упрощённый checkout: телефон, имя, доставка, оплата в один экран. В таком случае редирект на стандартную страницу оформления заказа может быть недостаточен. Тогда лучше сравнить два пути: доработать WooCommerce под ваш сценарий или использовать отдельный быстрый заказ/попап.
Если вы идёте по пути доработки, сначала зафиксируйте базовое поведение без AJAX и без лишних плагинов. Только после этого добавляйте упрощение формы, иначе будет сложно понять, что именно ломает покупку.