Пользовательские кнопки количества плюс и минус в Woocommerce 3

Я создаю настраиваемую тему 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();

Если вам нужен плагин, который добавляет кнопки (- / +) как для страницы продукта, так и для страницы корзины, я только что создал одну: wordpress.org/plugins/qty-increment-buttons-for-woocommerce У него отличный стиль, множество параметров настройки и вместо переопределения шаблонов он использует только хуки.

Ryszard Jędraszyk 17.05.2019 14:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
1
32 783
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша первая часть кода создана на основе настройки кода шаблона 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, но я неправильно применял ее к своей теме. Ваш подробный совет очень поможет! Спасибо еще раз!

Kai 18.09.2018 17:13

У меня это работает. Спасибо за ответ. Проголосовать с моей стороны.

user9437856 26.01.2021 16:55

@LoicTheAztec Не могли бы вы взглянуть на этот вопрос, пожалуйста? merci beaucoup stackoverflow.com/questions/67784840/…

SolaceBeforeDawn 15.06.2021 00:39
/* 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;
 }

Другие вопросы по теме