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

WooCommerce自定义查询字符串加购后登录,商品数量重复添加问题

解决未登录加购后登录购物车商品重复添加的问题

你遇到的问题本质是未登录时通过查询字符串触发批量加购后,登录过程中结账页面的查询参数被重新执行,导致自定义加购代码再次触发,重复添加商品。以下是两种可行的解决方案:

方案一:使用WooCommerce会话标记已处理请求

这种方案利用WooCommerce的会话机制,标记加购请求已完成,避免重复执行:

1. 修改批量加购处理函数

add_action( 'template_redirect', 'custom_add_multiple_products_to_cart' );
function custom_add_multiple_products_to_cart() {
    if ( is_admin() ) return;

    // 检查会话标记,判断是否已处理过当前加购请求
    if ( WC()->session->get( 'multiple_add_to_cart_processed' ) ) {
        // 清除URL中的加购和优惠券参数,避免后续重载触发
        if ( isset( $_GET['add-to-cart'] ) ) {
            wp_redirect( remove_query_arg( array( 'add-to-cart', 'coupon_code' ) ) );
            exit;
        }
        return;
    }

    if ( isset( $_GET['add-to-cart'] ) && ! empty( $_GET['add-to-cart'] ) ) {
        $products = explode( ',', $_GET['add-to-cart'] );
        $coupon_code = isset( $_GET['coupon_code'] ) ? $_GET['coupon_code'] : '';

        foreach ( $products as $product ) {
            $product_id = $product;
            $quantity = 1;

            if ( strpos( $product, ':' ) !== false ) {
                list( $product_id, $quantity ) = explode( ':', $product );
            }

            // 仅在商品未达到限购数量时添加
            $product_obj = wc_get_product( $product_id );
            if ( $product_obj && $product_obj->get_max_purchase_quantity() >= ( WC()->cart->get_cart_item_quantity( $product_id ) + $quantity ) ) {
                WC()->cart->add_to_cart( $product_id, $quantity );
            }
        }

        if ( ! empty( $coupon_code ) && ! WC()->cart->has_discount( $coupon_code ) ) {
            WC()->cart->apply_coupon( $coupon_code );
        }

        // 设置会话标记,标记请求已处理
        WC()->session->set( 'multiple_add_to_cart_processed', true );

        // 重定向到结账页,清除查询参数
        wp_redirect( wc_get_checkout_url() );
        exit;
    }
}

2. 登录时清除会话标记

用户登录后清除标记,确保后续的加购请求能正常执行:

add_action( 'wp_login', 'clear_multiple_add_to_cart_session_on_login' );
function clear_multiple_add_to_cart_session_on_login() {
    if ( WC()->session->get( 'multiple_add_to_cart_processed' ) ) {
        WC()->session->__unset( 'multiple_add_to_cart_processed' );
    }
}

方案二:使用Cookie标记已处理请求

如果未登录时WooCommerce会话不稳定,可以用Cookie替代会话:

1. 修改批量加购处理函数

add_action( 'template_redirect', 'custom_add_multiple_products_to_cart' );
function custom_add_multiple_products_to_cart() {
    if ( is_admin() ) return;

    // 检查Cookie是否标记请求已处理
    if ( isset( $_COOKIE['multiple_add_to_cart_done'] ) ) {
        if ( isset( $_GET['add-to-cart'] ) ) {
            wp_redirect( remove_query_arg( array( 'add-to-cart', 'coupon_code' ) ) );
            exit;
        }
        return;
    }

    if ( isset( $_GET['add-to-cart'] ) && ! empty( $_GET['add-to-cart'] ) ) {
        // 加购逻辑同方案一...

        // 设置Cookie,有效期1小时(可根据需求调整)
        setcookie( 'multiple_add_to_cart_done', '1', time() + 3600, COOKIEPATH, COOKIE_DOMAIN );

        wp_redirect( wc_get_checkout_url() );
        exit;
    }
}

2. 登录时清除Cookie

add_action( 'wp_login', 'clear_multiple_add_to_cart_cookie_on_login' );
function clear_multiple_add_to_cart_cookie_on_login() {
    if ( isset( $_COOKIE['multiple_add_to_cart_done'] ) ) {
        setcookie( 'multiple_add_to_cart_done', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN );
    }
}

核心思路

  1. 标记请求状态:通过会话或Cookie记录加购请求已处理,避免重复触发;
  2. 清除查询参数:执行加购后重定向到无查询参数的结账页,彻底杜绝重载触发;
  3. 登录后重置标记:确保用户登录后可以发起新的批量加购请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:55:06