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

如何在WooCommerce购物车页更新自定义$cart_item输入字段值?

解决方案

首先,修复你代码中的关键问题,实现正确的自定义购物车字段更新逻辑:

1. 规范模板中的输入框代码(可选但更严谨)

原模板里输入框的id与label的for不匹配,同时建议用esc_attr处理输出值,避免XSS风险:

<label for="prodWidth-<?php echo $cart_item_key; ?>">Structure Width</label>
<input type="number" style="width: 10rem;" name="cart[<?php echo $cart_item_key; ?>][prodWidth]" id="prodWidth-<?php echo $cart_item_key; ?>" value="<?php echo esc_attr($cart_item['prodWidth']); ?>">

2. 正确的购物车字段更新函数

替换你原来的无效代码,将以下代码添加到主题的functions.php或自定义插件中:

add_filter('woocommerce_update_cart_action_cart_updated', 'update_cart_custom_prodwidth_field', 10, 1);
function update_cart_custom_prodwidth_field($cart_updated) {
    // 校验购物车更新的POST数据是否存在
    if (!isset($_POST['cart']) || !is_array($_POST['cart'])) {
        return $cart_updated;
    }

    $cart = WC()->cart;
    // 遍历所有购物车项
    foreach ($_POST['cart'] as $cart_item_key => $cart_item_data) {
        // 检查prodWidth字段是否存在且为有效数值
        if (isset($cart_item_data['prodWidth']) && is_numeric($cart_item_data['prodWidth'])) {
            // 根据需求调整验证规则,这里转为正整数,允许小数可改用floatval()
            $prod_width = absint($cart_item_data['prodWidth']);

            // 更新对应购物车项的自定义字段
            if (isset($cart->cart_contents[$cart_item_key])) {
                $cart->cart_contents[$cart_item_key]['prodWidth'] = $prod_width;
            }
        }
    }

    // 保存购物车会话,确保修改持久化
    $cart->set_session();
    $cart->save();

    return true; // 返回true标记购物车已更新
}

关键修复说明

  • POST取值语法修正:用$_POST['cart'][$cart_item_key]['prodWidth']替代原错误的写法,同时增加数据存在性和类型校验,避免报错和恶意输入。
  • 购物车数据持久化:修改购物车项后必须调用set_session()和save(),确保修改同步到WooCommerce会话中,否则刷新页面后数据会丢失。
  • 数据验证:通过is_numeric()和absint()保证输入为有效数值,可根据实际需求调整验证规则。

额外注意事项

  • 修改cart.php时,确保是从WooCommerce模板目录复制到当前主题的woocommerce/cart/目录下再修改,避免主题更新覆盖改动。
  • 若需要在结算页、订单详情页同步显示该字段,需额外配置woocommerce_checkout_create_order_line_item等钩子,将自定义字段保存到订单数据中。

内容的提问来源于stack exchange,提问作者Mr.Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:35:22