Добавить дополнительную кнопку "Оформить заказ" рядом с кнопкой "В корзину" на странице товара WooCommerce
Я пытаюсь найти функцию, которая добавит ДОПОЛНИТЕЛЬНУЮ кнопку рядом со стандартной кнопкой "В корзину" на странице товара WooCommerce.
- Я добавил папку woocommerce в дочернюю тему для модификации single-product => add-to-cart => simple.php
- Внутри simple.php я нашел стандартную кнопку "В корзину", и после нее я хочу добавить свою дополнительную кнопку "Оформить заказ"
Я нашел такую функцию:
function woo_redirect_to_checkout() {
$checkout_url = WC()->cart->get_checkout_url();
return $checkout_url;
}
Которая работает нормально, НО она модифицирует ВСЕ кнопки "В корзину" на сайте, а я пытаюсь добавить её ТОЛЬКО к новой пользовательской кнопке, которую я пытаюсь добавить (Новая кнопка оформления заказа). Мне удалось добавить кнопку, которая перенаправляет на страницу оформления заказа, но она не добавляет товар в корзину перед переходом на страницу оформления заказа
Кто-нибудь знает, как добавить НОВУЮ кнопку + эта кнопка должна не только переходить на страницу оформления заказа, но и одновременно запускать действие "Добавить в корзину"
Спасибо

Вам не нужно изменять файлы шаблона для этого, вместо этого вы можете использовать хук WooCommerce woocommerce_after_add_to_cart_button
. Этот хук добавит контент после кнопки "Добавить в корзину".
Если клиент нажимает на эту кнопку, товар должен быть добавлен в корзину, и клиент должен быть перенаправлен на страницу оформления заказа, верно?!
По сути, вы можете добавлять товары в корзину с помощью ссылки такого вида:
http://example.com/cart/?add-to-cart=<ID товара>
Таким образом, используя хук, упомянутый выше, и учитывая этот URL, мы можем добавить вторую кнопку с помощью этого сниппета:
function add_content_after_addtocart() {
// получаем текущий ID поста/товара
$current_product_id = get_the_ID();
// получаем товар на основе ID
$product = wc_get_product( $current_product_id );
// получаем URL страницы оформления заказа
$checkout_url = WC()->cart->get_checkout_url();
// выполняем только для простых товаров
if( $product->is_type( 'simple' ) ){
echo '<a href="'.$checkout_url.'?add-to-cart='.$current_product_id.'" class="single_add_to_cart_button button alt">Оформить заказ</a>';
}
}
add_action( 'woocommerce_after_add_to_cart_button', 'add_content_after_addtocart' );
Это добавит кнопку после обычной кнопки "Добавить в корзину" на страницах отдельных товаров. Как вы можете видеть, я также добавил проверку, является ли текущий товар простым или нет. Если вы хотите использовать это с вариациями, это сложнее. Для таких товаров необходимо сгенерировать URL вида:
http://example.com/cart/?add-to-cart=123&variation_id=456&attribute_pa_colour=black
Возможно, вам также потребуется проверить стандартную опцию WooCommerce Включить AJAX добавление в корзину
(WooCommerce > Товары > Отображение). Я не тестировал это с данной настройкой.
Обновление для включения количества
Если вы хотите добавить количество, вы также можете добавить параметр к URL нашей кнопки, например:
http://example.com/cart/?add-to-cart=<ID товара>&quantity=<количество>
Однако, поскольку клиент может изменить количество с помощью поля ввода WooCommerce, нам нужен способ получить текущее значение этого поля.
Таким образом, у нас есть несколько вариантов:
отслеживать событие изменения поля количества для обновления нашего URL,
или добавить текущее значение поля количества к URL только при нажатии нашей кастомной кнопки.
Следующий код использует второй подход: параметр добавляется только при нажатии кнопки.
Внутри функции if( $product->is_type( 'simple' ) )
, перед выводом, вставьте этот скрипт:
<script>
jQuery(function($) {
<?php /* если наша кастомная кнопка нажата, добавляем строку "&quantity=", а также количество к URL */ ?>
// если наша кастомная кнопка нажата
$(".custom-checkout-btn").on("click", function() {
// получаем значение атрибута "href"
$(this).attr("href", function() {
// возвращаем значение "href" + строку "&quantity=" + текущее выбранное количество
return this.href + '&quantity=' + $('input.qty').val();
});
});
});
</script>
Я не включил открывающие и закрывающие PHP-теги в коде выше! Поэтому вам нужно завершить PHP перед скриптом (?>) и начать его снова после скрипта (

Спасибо @LWS-Mo, всё работает отлично. Я понимаю, что использование вариаций намного сложнее, потому что цена устанавливается в зависимости от выбора пользователя. Большое спасибо!

Можно ли как-то добавить и количество? Сейчас это работает только с единичным товаром. Спасибо.

@gilhamer Я отредактировал ответ и добавил jQuery-код для добавления количества. Поскольку это не так просто (нам нужно получить текущее значение поля ввода количества), нам пришлось использовать JS.

Только что зашел сюда, чтобы поделиться своим кодом, который помог мне решить проблему клиента с двумя кнопками - одна для оформления заказа, другая для добавления в корзину. Я использовал другой подход, который также работает с вариативными товарами.
function wpcoderpro_direct_checkout_button() {
global $product;
$id = $product->get_id();
if( $product->is_type( 'variable' ) ){
echo '
<script>
jQuery(document).ready(function($){
$(".redirect_to_checkout").click(function(){
$("button.single_add_to_cart_button ").click();
window.location.href="/checkout/";
});
});
</script>
<div class="button alt redirect_to_checkout" style="cursor:pointer;">ОФОРМИТЬ ЗАКАЗ</div>
';
}
elseif( $product->is_type( 'simple' ) ){
echo '
<script>
jQuery(document).ready(function($){
$(".input-text.qty").change(function(){
$(".redirect_to_checkout a").attr("href", "/checkout/?add-to-cart='. $id .'" + "&quantity= " + $(this).val());
});
});
</script>
<div class="button alt redirect_to_checkout" style="cursor:pointer;"><a href="/checkout/?add-to-cart='. $id .'">ОФОРМИТЬ ЗАКАЗ</a></div>
';
}
}
add_action( 'woocommerce_after_add_to_cart_button', 'wpcoderpro_direct_checkout_button', 20 );
Обратите внимание, что я использую плагин для AJAX добавления в корзину для вариативных товаров, но не использую AJAX добавление в корзину для простых товаров.
Код нужно добавить в файл function.php вашей дочерней темы. Дайте знать, если нужно объяснение :)
