在Woocommerce商店页面中显示添加到购物车ajax的数量框

时间:2018-02-10 15:08:52

标签: php jquery ajax wordpress woocommerce

我是Woocommerce的新手。我试图在商店页面中显示数量框。我使用了以下代码,它按预期工作:

add_action( 'woocommerce_before_shop_loop', 'handsome_bearded_guy_select_variations' );

function handsome_bearded_guy_select_variations() {
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_single_add_to_cart', 30 );
}

但问题是ajax添加到购物车按钮被替换为默认按钮。

如何为Woocommerce存档页面添加到购物车按钮及数量字段时启用ajax功能?

4 个答案:

答案 0 :(得分:2)

  

已更新 (2019) - 删除了数量错误

可以使用以下代码完成此操作,该代码与原始代码非常相似,使用专用woocommerce_loop_add_to_cart_link过滤器钩子中的自定义钩子函数和一些jQuery。

现在它像以前一样驱动ajax,一旦添加到购物车,你将获得额外的按钮"查看购物车"在右侧(你可以隐藏:看到最后如何)

你必须在这个上做一些CSS样式......

代码:

add_filter( 'woocommerce_loop_add_to_cart_link', 'quantity_inputs_for_loop_ajax_add_to_cart', 10, 2 );
function quantity_inputs_for_loop_ajax_add_to_cart( $html, $product ) {
    if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) {
        // Get the necessary classes
        $class = implode( ' ', array_filter( array(
            'button',
            'product_type_' . $product->get_type(),
            $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
            $product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '',
        ) ) );

        // Adding embeding <form> tag and the quantity field
        $html = sprintf( '%s%s<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>%s',
            '<form class="cart">',
            woocommerce_quantity_input( array(), $product, false ),
            esc_url( $product->add_to_cart_url() ),
            esc_attr( isset( $quantity ) ? $quantity : 1 ),
            esc_attr( $product->get_id() ),
            esc_attr( $product->get_sku() ),
            esc_attr( isset( $class ) ? $class : 'button' ),
            esc_html( $product->add_to_cart_text() ),
            '</form>'
        );
    }
    return $html;
}

add_action( 'wp_footer' , 'archives_quantity_fields_script' );
function archives_quantity_fields_script(){
    <script type='text/javascript'>
        ?>
        jQuery(function($){
            // Update quantity
            $(".add_to_cart_button.product_type_simple").on('click input', function() {
                $(this).data('quantity', $(this).parent().find('input.qty').val() ); 
            });        

            // On "adding_to_cart" delegated event, removes others "view cart" buttons 
            $(document.body).on("adding_to_cart", function() {
                $(".added_to_cart").remove();
            });
        });
    </script>
    <?php //endif;
}

代码进入活动子主题(活动主题)的function.php文件。经过测试并正常工作。

隐藏其他&#34;查看购物车&#34;按钮按钮(使用ajax添加到购物车时)

然后你可以先从jQuery代码中删除它:

// On "adding_to_cart" delegated event, removes others "view cart" buttons
$(document.body).on("adding_to_cart", function() {
    $(".added_to_cart").remove();
});

1)您可以将此CSS规则添加到活动主题中的styles.css文件中:

a.added_to_cart.wc-forward {
    display:none;
}

2)你可以使用以下hoocked函数(第一个选项是最好的方法)

add_action( 'wp_head' , 'hide_ajax_view_cart_button' );
function hide_ajax_view_cart_button(){
    if( is_shop() || is_product_category() || is_product_tag() ): ?>
    <style>
        a.added_to_cart.wc-forward {
            display:none;
        }
    </style>
    <?php endif;
}

代码进入活动子主题(活动主题)的function.php文件。

测试并运作。

答案 1 :(得分:2)

如上所述,没有“数量错误”。

代码:

value

参考文献:

@ LoicTheAztec在2018年2月11日之后进入。

@ braciawrite和@ andrewmclagan的GitHub分别于2015年12月11日和2018年3月15日参赛。

https://gist.github.com/webaware/6260326

注意:

代码应在按下“add_to_cart”按钮时执行检查,而不是在数量更改时执行检查。

我在函数“archives_quantity_fields_script”下注释了if和endif语句,因为我在使用WooCommerce产品的自定义页面上运行此代码。

希望这有帮助!

答案 2 :(得分:0)

这是一种替代方法,似乎在Woo 3+中效果很好

<?php
/**
 * Add quantity field on the archive page.
 */
function custom_quantity_field_archive() {

    $product = wc_get_product( get_the_ID() );

    if ( ! $product->is_sold_individually() && 'variable' != $product->get_type() && $product->is_purchasable() ) {
    woocommerce_quantity_input( array( 'min_value' => 1, 'max_value' => $product->backorders_allowed() ? '' : $product->get_stock_quantity() ) );
    }

}
add_action( 'woocommerce_after_shop_loop_item', 'custom_quantity_field_archive', 0, 9 );

/**
 * Enqueue the JavaScript.
 */
function custom_add_to_cart_quantity_handler() {

wc_enqueue_js( '
    jQuery( ".post-type-archive-product" ).on( "click", ".quantity input", function() {
        return false;
    });
    jQuery( ".post-type-archive-product" ).on( "change input", ".quantity .qty", function() {
        var add_to_cart_button = jQuery( this ).parents( ".product" ).find( ".add_to_cart_button" );
        
        // For AJAX add-to-cart actions
        add_to_cart_button.attr( "data-quantity", jQuery( this ).val() );

        // For non-AJAX add-to-cart actions
        add_to_cart_button.attr( "href", "?add-to-cart=" +   add_to_cart_button.attr( "data-product_id" ) + "&quantity=" + jQuery( this ).val() );
    });
' );

}
add_action( 'init', 'custom_add_to_cart_quantity_handler' );

取决于页面上的Ajax操作,jQuery可能有多个选项。

答案 3 :(得分:0)

我花了一整天才完成这项工作 - 但这是对我有用的代码。添加到您的functions.php - 它改编自上述内容,我使用的是 WooCommerce 5.0.0

add_filter( 'woocommerce_loop_add_to_cart_link', 'quantity_inputs_for_loop_ajax_add_to_cart', 10, 2 );
function quantity_inputs_for_loop_ajax_add_to_cart( $html, $product ) {
    if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) {
        // Get the necessary classes
        $class = implode( ' ', array_filter( array(
            'button',
            'product_type_' . $product->get_type(),
            $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
            $product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '',
        ) ) );

        // Adding embeding <form> tag and the quantity field
        $html = sprintf( '%s%s<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>%s',
        '<form class="cart">',
        woocommerce_quantity_input( array(), $product, false ),
        esc_url( $product->add_to_cart_url() ),
        esc_attr( isset( $quantity ) ? $quantity : 1 ),
        esc_attr( $product->get_id() ),
        esc_attr( $product->get_sku() ),
        esc_attr( isset( $class ) ? $class : 'button' ),
        esc_html( $product->add_to_cart_text() ),
        '</form>'
        );
    }
    return $html;
}

add_action( 'wp_footer' , 'archives_quantity_fields_script' );

function archives_quantity_fields_script(){
    //if( is_shop() || is_product_category() || is_product_tag() ): ?>
    <script type='text/javascript'>
        jQuery( document ).ready( function( $ ) {
        $( document ).on( 'change', '.quantity .qty', function() {
            $( this ).parent( '.quantity' ).next( '.add_to_cart_button' ).attr( 'data-quantity', $( this ).val() );
            //alert("Changed");
        });
    });
        
        jQuery(function($) {
            // Update quantity on 'a.button' in 'data-quantity' attribute (for ajax) 
            $(".add_to_cart_button.product_type_simple").on('click', function() {
                var $button = $(this);
                $button.data('quantity', $button.parent().find('input.qty').val());
            });
            // remove old "view cart" text, only need latest one thanks!
            $(document.body).on("adding_to_cart", function() {
                $("a.added_to_cart").remove();
            });
        });
    </script>
    <?php //endif;
}