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 ); } }
核心思路
- 标记请求状态:通过会话或Cookie记录加购请求已处理,避免重复触发;
- 清除查询参数:执行加购后重定向到无查询参数的结账页,彻底杜绝重载触发;
- 登录后重置标记:确保用户登录后可以发起新的批量加购请求。
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

