如何在WooCommerce中为特定用户的购物车会话添加/移除商品?
解决WooCommerce购物车API同时更新持久购物车与会话数据的问题
原代码核心问题
- 直接实例化
WC_Cart不符合WooCommerce的工作机制,未利用全局WC()->cart对象及内置会话管理逻辑 - 未对
$_REQUEST参数做安全校验与清洗,存在XSS、SQL注入等风险 - 直接操作
woocommerce_sessions表和用户元数据,绕过WooCommerce内置数据处理流程,易导致数据不一致 - 依赖自定义函数
get_wc_session_data、get_wc_cart_user_meta,兼容性与稳定性无法保障
修正后的完整解决方案
以下代码基于WooCommerce原生API实现购物车更新,确保同时同步持久购物车(_woocommerce_persistent_cart_1)和会话购物车数据:
function add_product_to_cart() { // 仅允许AJAX或REST请求 if ( ! wp_doing_ajax() && ! is_rest_request() ) { wp_send_json( array( 'status' => 'error', 'message' => '非法请求方式' ), 403 ); } // 验证必填参数 $required_params = array( 'user_id', 'product_id', 'quantity' ); foreach ( $required_params as $param ) { if ( empty( $_REQUEST[ $param ] ) ) { wp_send_json( array( 'status' => 'error', 'message' => "缺少必填参数:$param" ), 400 ); } } // 安全获取并格式化数据 $user_id = absint( $_REQUEST['user_id'] ); $product_id = absint( $_REQUEST['product_id'] ); $quantity = absint( $_REQUEST['quantity'] ); $variation_id = isset( $_REQUEST['variation_id'] ) ? absint( $_REQUEST['variation_id'] ) : 0; // 校验用户合法性 if ( ! get_user_by( 'id', $user_id ) ) { wp_send_json( array( 'status' => 'error', 'message' => '用户不存在' ), 404 ); } // 校验产品合法性 $product = wc_get_product( $product_id ); if ( ! $product ) { wp_send_json( array( 'status' => 'error', 'message' => '产品不存在' ), 404 ); } // 初始化WooCommerce会话 if ( ! WC()->session->has_session() ) { WC()->session->set_customer_session_cookie( true ); } // 加载用户已保存的持久购物车到当前会话 WC()->cart->load_persistent_cart( $user_id ); // 执行添加商品操作 $add_result = WC()->cart->add_to_cart( $product_id, $quantity, $variation_id ); if ( ! $add_result ) { wp_send_json( array( 'status' => 'error', 'message' => '添加商品到购物车失败' ), 500 ); } // 同步更新持久购物车(自动写入_woocommerce_persistent_cart_1元数据) WC()->cart->persistent_cart_update( $user_id ); // 强制更新会话中的购物车数据,确保即时生效 WC()->session->set( 'cart', WC()->cart->get_cart() ); wp_send_json( array( 'status' => 'success', 'message' => '商品成功添加到购物车' ) ); } // 注册自定义REST API路由(示例) add_action( 'rest_api_init', function() { register_rest_route( 'custom/v1', '/cart/add', array( 'methods' => 'POST', 'callback' => 'add_product_to_cart', 'permission_callback' => function() { // 可根据需求添加权限校验,比如仅允许登录用户操作 return current_user_can( 'read' ); } ) ); } );
关键改进说明
- 安全防护:添加请求类型校验、参数合法性检查、数据格式化,杜绝恶意请求
- 原生API依赖:全程使用WooCommerce内置的
WC()->cart和WC()->session方法,避免直接操作数据库,保障数据一致性 - 双向同步:通过
load_persistent_cart加载历史购物车,persistent_cart_update自动更新持久购物车,session->set同步会话数据 - 错误反馈:针对不同异常场景返回对应状态码和提示信息,便于前端调试
移除商品的扩展实现
如需实现移除商品功能,只需修改核心逻辑部分:
function remove_product_from_cart() { // 重复上述安全校验步骤... // 加载用户持久购物车 WC()->cart->load_persistent_cart( $user_id ); // 按购物车项ID移除商品 $removed = WC()->cart->remove_cart_item( $_REQUEST['cart_item_key'] ); // 或按产品ID移除:WC()->cart->remove_product( $product_id ); if ( ! $removed ) { wp_send_json( array( 'status' => 'error', 'message' => '从购物车移除商品失败' ), 500 ); } // 同步持久购物车和会话数据 WC()->cart->persistent_cart_update( $user_id ); WC()->session->set( 'cart', WC()->cart->get_cart() ); wp_send_json( array( 'status' => 'success', 'message' => '商品成功从购物车移除' ) ); }
内容的提问来源于stack exchange,提问作者ASP Narola
相关产品推荐
相关产品推荐

