You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce如何通过AJAX实现一键添加多个交叉销售商品到购物车

WooCommerce交叉销售商品一键AJAX加购实现方案

第一步:修改交叉销售展示代码

替换你现有的show_cross_sell_in_single_product函数代码,改动点:给按钮添加标识、存储交叉销售商品ID、注入AJAX所需的安全参数:

add_action('woocommerce_single_product_cols_before', 'show_cross_sell_in_single_product', 1200);
function show_cross_sell_in_single_product(){
    $crosssells = get_post_meta( get_the_ID(), '_crosssell_ids',true);
    $args = array(
        'post_type'         => 'product',
        'posts_per_page'=> -1,
        'post__in'          => $crosssells,
        'tax_query'     => array(
          array(
              'relation' => 'OR',
              array(
                  'taxonomy' => 'product_visibility',
                  'field'    => 'name',
                  'terms'    => 'exclude-from-catalog',
                  'operator' => 'NOT IN',
              ),
              array(
                  'taxonomy' => 'product_visibility',
                  'field'    => 'name',
                  'terms'    => 'exclude-from-catalog',
                  'operator' => '=',
              ),
          )
      ),
        );
    $products_crosssells = new WP_Query( $args );
    $products_crosssells_ids = wp_list_pluck( $products_crosssells->posts, 'ID' );
    if( $products_crosssells->have_posts() ) :  ?>
        <div class="crosssell-products-wrap">
            <ul>
                <?php while ( $products_crosssells->have_posts() ) : $products_crosssells->the_post(); ?>
                    <?php wc_get_template_part( 'content', 'product-crosssells' ); ?>
                <?php endwhile; ?>
            </ul>
            <!-- 给按钮加类和数据属性 -->
            <a href="#" class="button multi-crosssell-addtocart" data-crosssell-ids="<?php echo esc_attr(json_encode($products_crosssells_ids)); ?>">一键添加全部到购物车</a>
        </div>
        <!-- 注入AJAX配置 -->
        <script type="text/javascript">
            const crosssellConfig = {
                ajaxUrl: "<?php echo esc_url(admin_url('admin-ajax.php')); ?>",
                nonce: "<?php echo wp_create_nonce('multi_add_to_cart_nonce'); ?>"
            }
        </script>
    <?php endif;
    wp_reset_postdata();
}

第二步:完善服务端AJAX处理代码

给现有接口添加CSRF安全校验,替换你原来的服务端代码:

add_action('wp_ajax_multi_add_to_cart', 'multi_ajax_add_to_cart');
add_action('wp_ajax_nopriv_multi_add_to_cart', 'multi_ajax_add_to_cart');
function multi_ajax_add_to_cart() {
    // 新增安全校验
    if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'multi_add_to_cart_nonce')) {
        wp_send_json_error('非法请求');
    }
    if (isset($_POST['items']) ) {
        $item_keys = array();
        foreach( $_POST['items'] as $item ) {
            if( isset($item['id']) ) {
                $item_qty  = isset($item['qty']) && $item['qty'] > 1 ? $item['qty'] : 1;
                $item_keys[] = WC()->cart->add_to_cart($item['id'], $item_qty);
            }
        }
        wp_send_json_success($item_keys);
    }
    wp_send_json_error('没有可添加的商品');
    die();
}

第三步:添加前端交互JS代码

将以下代码添加到主题的自定义JS文件中,或者直接插入到页脚:

jQuery(function($){
    // 绑定一键加购按钮点击事件
    $('.multi-crosssell-addtocart').on('click', function(e){
        e.preventDefault();
        const $btn = $(this);
        // 禁止重复点击
        $btn.addClass('loading disabled').text('添加中...');
        // 拿到商品ID
        const productIds = JSON.parse($btn.data('crosssell-ids'));
        // 组装请求参数
        const items = productIds.map(id => { return {id: id, qty: 1} });
        // 发送AJAX请求
        $.ajax({
            url: crosssellConfig.ajaxUrl,
            type: 'POST',
            data: {
                action: 'multi_add_to_cart',
                nonce: crosssellConfig.nonce,
                items: items
            },
            success: function(res){
                if(res.success){
                    // 触发WooCommerce默认的购物车更新事件,自动刷新购物车碎片
                    $(document.body).trigger('wc_fragment_refresh');
                    $btn.text('添加成功');
                    setTimeout(() => {
                        $btn.removeClass('loading disabled').text('一键添加全部到购物车');
                    }, 2000);
                    // 可自定义加购成功后的提示
                    alert('所有交叉销售商品已成功添加到购物车');
                }else{
                    alert(res.data || '添加失败,请稍后重试');
                    $btn.removeClass('loading disabled').text('一键添加全部到购物车');
                }
            },
            error: function(){
                alert('请求失败,请检查网络');
                $btn.removeClass('loading disabled').text('一键添加全部到购物车');
            }
        })
    })
})

注意事项

  • 当前实现仅支持简单商品,如果你有可变商品需要添加,需要额外获取选中的变体ID,调整参数组装逻辑即可
  • 按钮的样式可根据你的主题自行调整multi-crosssell-addtocart类的CSS

内容的提问来源于stack exchange,提问作者Cray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:18:02