如何用WC Kalkulator字段值更新WooCommerce购物车商品属性
问题分析
原代码的核心错误在于使用get_post_meta()获取商品全局元数据——WC Kalkulator生成的自定义重量、尺寸是针对单个购物车项的用户输入计算结果,并非存储在商品的全局post_meta中,因此用固定商品ID调用get_post_meta()只能拿到统一的静态值,无法实现购物车项的个性化属性更新。
解决方案
正确的做法是从购物车项的专属数据中提取WC Kalkulator的计算结果,以下是修正后的代码:
add_action( 'woocommerce_before_calculate_totals', 'update_cart_item_dimensions_weight_from_wck', 10, 1 ); function update_cart_item_dimensions_weight_from_wck( $cart ) { // 防止钩子递归调用 if ( doing_action( 'woocommerce_before_calculate_totals' ) ) { return; } foreach ( $cart->get_cart() as $cart_item ) { // 仅处理目标商品ID if ( $cart_item['product_id'] !== 4692 ) { continue; } // 读取WC Kalkulator存储在购物车项中的计算数据 if ( isset( $cart_item['wck_calculations'] ) && is_array( $cart_item['wck_calculations'] ) ) { $wck_data = $cart_item['wck_calculations']; // 提取计算值,若不存在则沿用商品默认值 $weight = isset( $wck_data['wck_weight'] ) ? $wck_data['wck_weight'] : $cart_item['data']->get_weight(); $length = isset( $wck_data['wck_length'] ) ? $wck_data['wck_length'] : $cart_item['data']->get_length(); $width = isset( $wck_data['wck_width'] ) ? $wck_data['wck_width'] : $cart_item['data']->get_width(); $height = isset( $wck_data['wck_height'] ) ? $wck_data['wck_height'] : $cart_item['data']->get_height(); // 更新当前购物车项的属性 $cart_item['data']->set_weight( $weight ); $cart_item['data']->set_length( $length ); $cart_item['data']->set_width( $width ); $cart_item['data']->set_height( $height ); } } }
关键说明
- WC Kalkulator会将用户输入后的个性化计算结果存储在购物车项的
wck_calculations数组中,而非商品全局元数据,因此必须从当前购物车项的该字段取值。 - 代码添加了递归防护,避免
woocommerce_before_calculate_totals钩子触发循环调用问题。 - 保留了默认值降级逻辑,若WC Kalkulator数据缺失,会自动沿用商品原有的静态重量/尺寸。
- 请确保代码中的
wck_weight、wck_length等字段名,与你在WC Kalkulator插件中设置的计算字段标识完全一致。
内容的提问来源于stack exchange,提问作者Jreppe
相关产品推荐
相关产品推荐

