WooCommerce购物车商品超15件时仅显示DHL配送的钩子实现
没问题,这个需求完全可以通过WooCommerce的原生钩子实现,不用依赖插件。我来给你详细的解决方案:
解决方案:通过
woocommerce_package_rates钩子实现配送方式过滤 核心思路
我们会用到woocommerce_package_rates这个钩子——它专门用来过滤和修改购物车/结算页显示的配送方式列表。结合购物车商品数量的判断,我们可以轻松实现“超过15件仅保留指定配送方式”的逻辑。
步骤1:添加自定义代码到主题functions.php
把下面的代码添加到你的子主题(强烈推荐用子主题,避免主题更新丢失代码)的functions.php文件中:
add_filter( 'woocommerce_package_rates', 'force_only_dhl_when_more_than_15_items', 10, 2 ); function force_only_dhl_when_more_than_15_items( $rates, $package ) { // 获取购物车内商品总数量 $cart_item_count = WC()->cart->get_cart_contents_count(); // 当商品数量超过15件时,执行过滤逻辑 if ( $cart_item_count > 15 ) { // 替换为你实际需要保留的配送方式ID(比如DHL的method_id) $allowed_method_id = 'dhl_shipping_method'; // 遍历所有配送方式,只保留允许的那一个 foreach ( $rates as $rate_key => $rate ) { if ( $rate->method_id !== $allowed_method_id ) { unset( $rates[ $rate_key ] ); } } } return $rates; } // 清理配送费率缓存,确保修改即时生效 add_action( 'woocommerce_cart_updated', 'clear_shipping_rates_cache' ); add_action( 'woocommerce_update_options_shipping', 'clear_shipping_rates_cache' ); function clear_shipping_rates_cache() { WC()->session->set( 'shipping_for_package_0', false ); }
步骤2:获取并替换正确的配送方式ID
你需要把代码中的dhl_shipping_method替换成你店铺里DHL配送方式的实际ID,获取方法很简单:
- 进入WooCommerce后台 → 设置 → 配送 → 找到你的DHL配送方式并点击编辑
- 查看浏览器地址栏,比如链接是
post.php?post=123&action=edit,其中的123就是该配送方式的ID;或者用浏览器开发者工具查看结算页的配送选项,每个选项的value属性里会包含method_id(比如Flexible Shipping创建的方式,ID可能是flexible_shipping_123)
如果不想用ID,也可以通过配送方式名称判断,把判断条件改成:
if ( $rate->label !== 'DHL国际快递' ) { // 替换成你的DHL方式显示名称 unset( $rates[ $rate_key ] ); }
注意事项
- 务必使用子主题的
functions.php,否则主题更新后代码会被覆盖 - 修改代码后,建议清空购物车重新添加商品测试,或者手动清理WooCommerce缓存确保生效
- 如果你的店铺支持多包裹配送(比如不同商品发往不同地址),可以根据
$package参数调整逻辑,大部分单包裹场景用上面的代码就足够
内容的提问来源于stack exchange,提问作者cysus
相关产品推荐
相关产品推荐

