Я создаю настраиваемую тему WordPress и WooCommerce и добавляю настраиваемые кнопки «плюс» и «минус» в Поле количества на странице товара. Кнопки обновляют значение вводимого количества, и я также получаю уведомление «Товар был добавлен в вашу корзину» (на странице продукта), когда я отправляю «Добавить в корзину». Но на странице корзины не отображаются товары и нет информации о том, что корзина пуста.
Я не могу понять, к какой функции WooCommerce JS я должен подключиться, ни как к ней подключиться. Могу я попросить о помощи?! Заранее спасибо!
Мой HTML-макет:
<div class = "quantity">
<label class = "quantity__label" for = "<?php echo esc_attr( $input_id ); ?>"><?php esc_html_e( 'Quantity:', 'woocommerce' ); ?></label>
<div class = "quantity__wrapper">
<input type = "button" value = "-" class = "quantity__button quantity__remove js-qty-remove" />
<input
type = "text"
id = "<?php echo esc_attr( $input_id ); ?>"
class = "input-text qty text quantity__input"
step = "<?php echo esc_attr( $step ); ?>"
min = "<?php echo esc_attr( $min_value ); ?>"
max = "<?php echo esc_attr( 0 < $max_value ? $max_value : '' ); ?>"
name = "<?php echo esc_attr( $input_name ); ?>"
value = "<?php echo esc_attr( $input_value ); ?>"
title = "<?php echo esc_attr_x( 'Qty', 'Product quantity input tooltip', 'woocommerce' ); ?>"
size = "4"
pattern = "<?php echo esc_attr( $pattern ); ?>"
inputmode = "<?php echo esc_attr( $inputmode ); ?>"
aria-labelledby = "<?php echo esc_attr( $labelledby ); ?>" />
<input type = "button" value = "+" class = "quantity__button quantity__add js-qty-add" />
</div>
</div>
Моя пользовательская функция jQuery:
function quantityButtons() {
var $qtyAdd = $('.js-qty-add'),
$qtyRemove = $('.js-qty-remove'),
$qtyInput = $('.quantity__input');
$qtyAdd.on('click', addQty);
$qtyRemove.on('click', removeQty);
function addQty() {
var $qtyInput = $('.quantity__input'),
$qtyRemove = $('.js-qty-remove'),
$i = $qtyInput.val();
$i++;
$qtyRemove.attr("disabled", !$i);
$qtyInput.val($i);
}
function removeQty() {
var $qtyInput = $('.quantity__input'),
$qtyRemove = $('.js-qty-remove'),
$i = $qtyInput.val();
if ($i >= 1) {
$i--;
$qtyInput.val($i);
} else {
$qtyRemove.attr("disabled", true);
}
}
$qtyRemove.attr("disabled", !$qtyInput.val());
}
quantityButtons();



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша первая часть кода создана на основе настройки кода шаблона global/quantity-input.php Woocommerce…
Итак, для тестирования я частично изменил этот код шаблона global/quantity-input.php следующим образом (очень близко к вашему коду):
?>
<div class = "quantity">
<label class = "screen-reader-text" for = "<?php echo esc_attr( $input_id ); ?>"><?php esc_html_e( 'Quantity', 'woocommerce' ); ?></label>
<input type = "button" value = "-" class = "qty_button minus" />
<input
type = "number"
id = "<?php echo esc_attr( $input_id ); ?>"
class = "input-text qty text"
step = "<?php echo esc_attr( $step ); ?>"
min = "<?php echo esc_attr( $min_value ); ?>"
max = "<?php echo esc_attr( 0 < $max_value ? $max_value : '' ); ?>"
name = "<?php echo esc_attr( $input_name ); ?>"
value = "<?php echo esc_attr( $input_value ); ?>"
title = "<?php echo esc_attr_x( 'Qty', 'Product quantity input tooltip', 'woocommerce' ); ?>"
size = "4"
pattern = "<?php echo esc_attr( $pattern ); ?>"
inputmode = "<?php echo esc_attr( $inputmode ); ?>"
aria-labelledby = "<?php echo esc_attr( $labelledby ); ?>" />
<input type = "button" value = "+" class = "qty_button plus" />
</div>
<?php
Теперь необходимые CSS и обновленные функции кода jQuery:
// Minimum CSS to remove +/- default buttons on input field type number
add_action( 'wp_head' , 'custom_quantity_fields_css' );
function custom_quantity_fields_css(){
?>
<style>
.quantity input::-webkit-outer-spin-button,
.quantity input::-webkit-inner-spin-button {
display: none;
margin: 0;
}
.quantity input.qty {
appearance: textfield;
-webkit-appearance: none;
-moz-appearance: textfield;
}
</style>
<?php
}
add_action( 'wp_footer' , 'custom_quantity_fields_script' );
function custom_quantity_fields_script(){
?>
<script type='text/javascript'>
jQuery( function( $ ) {
if ( ! String.prototype.getDecimals ) {
String.prototype.getDecimals = function() {
var num = this,
match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
if ( ! match ) {
return 0;
}
return Math.max( 0, ( match[1] ? match[1].length : 0 ) - ( match[2] ? +match[2] : 0 ) );
}
}
// Quantity "plus" and "minus" buttons
$( document.body ).on( 'click', '.plus, .minus', function() {
var $qty = $( this ).closest( '.quantity' ).find( '.qty'),
currentVal = parseFloat( $qty.val() ),
max = parseFloat( $qty.attr( 'max' ) ),
min = parseFloat( $qty.attr( 'min' ) ),
step = $qty.attr( 'step' );
// Format values
if ( ! currentVal || currentVal === '' || currentVal === 'NaN' ) currentVal = 0;
if ( max === '' || max === 'NaN' ) max = '';
if ( min === '' || min === 'NaN' ) min = 0;
if ( step === 'any' || step === '' || step === undefined || parseFloat( step ) === 'NaN' ) step = 1;
// Change the value
if ( $( this ).is( '.plus' ) ) {
if ( max && ( currentVal >= max ) ) {
$qty.val( max );
} else {
$qty.val( ( currentVal + parseFloat( step )).toFixed( step.getDecimals() ) );
}
} else {
if ( min && ( currentVal <= min ) ) {
$qty.val( min );
} else if ( currentVal > 0 ) {
$qty.val( ( currentVal - parseFloat( step )).toFixed( step.getDecimals() ) );
}
}
// Trigger change event
$qty.trigger( 'change' );
});
});
</script>
<?php
}
Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.
Кнопки количества «плюс» и «минус» работают отлично и отображаются следующим образом:
Товары добавляются в корзину в правильном количестве:
если вы измените значение поля количества с помощью кнопок «плюс» и «минус», кнопка «Обновить корзину» активируется при любом изменении поля количества.
Когда вы нажимаете «Обновить корзину», количество обновляется правильно.
Большое спасибо Loic, ваш код отлично работает! Я видел похожую функцию jquery в одном из плагинов wocommerce, но я неправильно применял ее к своей теме. Ваш подробный совет очень поможет! Спасибо еще раз!
У меня это работает. Спасибо за ответ. Проголосовать с моей стороны.
@LoicTheAztec Не могли бы вы взглянуть на этот вопрос, пожалуйста? merci beaucoup stackoverflow.com/questions/67784840/…
/* Show Buttons */
add_action( 'woocommerce_before_add_to_cart_quantity', 'display_quantity_plus' );
function display_quantity_plus() {
echo '<button type = "button" class = "plus" >+</button>';
}
add_action( 'woocommerce_after_add_to_cart_quantity', 'display_quantity_minus' );
function display_quantity_minus() {
echo '<button type = "button" class = "minus" >-</button>';
}
//Note: to place minus @ left and plus @ right replace above add_actions with:
//add_action( 'woocommerce_before_add_to_cart_quantity', 'display_quantity_minus' );
//add_action( 'woocommerce_after_add_to_cart_quantity', 'display_quantity_plus' );
add_action( 'wp_footer', 'add_cart_quantity_plus_minus' );
function add_cart_quantity_plus_minus() {
// Only run this on the single product page
if ( ! is_product() ) return;
?>
<script type = "text/javascript">
jQuery(document).ready(function($){
$('form.cart').on( 'click', 'button.plus, button.minus', function() {
// Get current quantity values
var qty = $( this ).closest( 'form.cart' ).find( '.qty' );
var val = parseFloat(qty.val());
var max = parseFloat(qty.attr( 'max' ));
var min = parseFloat(qty.attr( 'min' ));
var step = parseFloat(qty.attr( 'step' ));
// Change the value if plus or minus
if ( $( this ).is( '.plus' ) ) {
if ( max && ( max <= val ) ) {
qty.val( max );
} else {
qty.val( val + step );
}
} else {
if ( min && ( min >= val ) ) {
qty.val( min );
} else if ( val > 1 ) {
qty.val( val - step );
}
}
});
});
</script>
//add css
.single-product div.product form.cart .quantity {
float: none;
margin: 0;
display: inline-block;
}
Если вам нужен плагин, который добавляет кнопки (- / +) как для страницы продукта, так и для страницы корзины, я только что создал одну: wordpress.org/plugins/qty-increment-buttons-for-woocommerce У него отличный стиль, множество параметров настройки и вместо переопределения шаблонов он использует только хуки.