Woocommerce 3 中的自定义加减数量按钮

Posted

技术标签:

【中文标题】Woocommerce 3 中的自定义加减数量按钮【英文标题】:Custom plus and minus quantity buttons in Woocommerce 3 【发布时间】:2019-02-21 09:12:00 【问题描述】:

我正在构建自定义 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覆盖模板,它只使用钩子。 【参考方案1】:

您的第一个代码部分是由 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,您的代码运行良好!我在其中一个 wocommerce 插件中看到了类似的 jquery 函数,但我没有将它正确地应用到我的主题中。你的详细建议很有帮助!再次感谢! 它对我有用。感谢您的回答。从我这边投票。 @LoicTheAztec 你能看看这个问题吗?谢谢美女***.com/questions/67784840/…【参考方案2】:
/* 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;
 

【讨论】:

以上是关于Woocommerce 3 中的自定义加减数量按钮的主要内容,如果未能解决你的问题,请参考以下文章

基于 Woocommerce 中的自定义单选按钮的动态运费

根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用

通过 WooCommerce 产品设置中的自定义复选框禁用添加到购物车按钮

基于产品类型的 WooCommerce 的“添加到购物车”按钮旁边的自定义按钮

基于产品类型的 WooCommerce 的“添加到购物车”按钮旁边的自定义按钮

WooCommerce:为特定页面添加使用 WordPress 自定义字段添加到购物车旁边的自定义按钮