WooCommerce统计购物车自定义分类数量并乘购物车总价的实现问题
WooCommerce 自定义city分类关联购物车价格计算实现方案
核心实现逻辑
使用WooCommerce官方钩子woocommerce_before_calculate_totals在购物车计算总价阶段注入自定义逻辑,无需修改系统核心文件,兼容性更强。
完整实现代码
add_action( 'woocommerce_before_calculate_totals', 'custom_calculate_price_by_city_count', 10, 1 ); function custom_calculate_price_by_city_count( $cart ) { // 后台访问或非结算类AJAX请求直接跳过 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } // 初始化空数组存储唯一city分类名称,利用数组键名唯一特性自动去重 $unique_cities = []; // 遍历购物车商品收集所有关联的city分类 foreach ( $cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; $term_names = wp_get_post_terms( $product_id, 'city', array( 'fields' => 'names' ) ); if ( ! empty( $term_names ) && is_array( $term_names ) ) { foreach ( $term_names as $term_name ) { $unique_cities[ $term_name ] = 1; } } } // 统计唯一city数量,无匹配分类时默认值为1避免总价归零 $city_count = count( $unique_cities ) ?: 1; // 方案1:修改每个商品单价实现总价倍增 foreach ( $cart->get_cart() as $cart_item ) { $original_price = $cart_item['data']->get_price(); $cart_item['data']->set_price( $original_price * $city_count ); } // 方案2:如果不需要修改商品单价,仅整体调整总价,可注释方案1的代码,使用下方添加费用的逻辑 // $original_total = $cart->subtotal; // $extra_fee = $original_total * ($city_count - 1); // $cart->add_fee( '城市分类附加费用', $extra_fee ); }
代码说明
- 已兼容单个商品关联多个city分类的场景,会自动全量收集并去重
- 代码可直接添加到当前主题的
functions.php文件,或自定义插件的代码文件中即可生效 - 可根据业务需要选择修改商品单价或者添加附加费用的实现方式
内容的提问来源于stack exchange,提问作者Jure Zadravec
相关产品推荐
相关产品推荐

