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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:23:11