如何在WordPress/WooCommerce中从一个过滤器触发另一个过滤器代码
解决方案
你不需要从无配送方式的过滤器里触发支付网关的过滤逻辑,直接在支付网关过滤器中判断当前是否存在可用配送方式即可,这样逻辑更清晰且符合WooCommerce的钩子设计。
1. 替换无配送方式时的提示文本
使用你提到的两个过滤器,将默认提示替换为引导用户邮件联系的内容:
add_filter('woocommerce_cart_no_shipping_available_html', 'custom_no_shipping_available_message'); add_filter('woocommerce_no_shipping_available_html', 'custom_no_shipping_available_message'); function custom_no_shipping_available_message($default_message) { return '抱歉,我们暂时不支持该地区的标准配送服务。请发送邮件至 [你的邮箱地址] 获取定制运费报价。'; }
2. 无配送方式时移除所有支付网关
在woocommerce_available_payment_gateways过滤器中,通过WooCommerce内置逻辑判断是否有可用配送方式,若没有则清空支付网关列表:
add_filter('woocommerce_available_payment_gateways', 'remove_payment_gateways_when_no_shipping'); function remove_payment_gateways_when_no_shipping($available_gateways) { // 仅在购物车/结账页面执行逻辑 if (!is_cart() && !is_checkout()) { return $available_gateways; } // 获取当前购物车的可用配送方式 $shipping_methods = WC()->cart->get_shipping_methods(); // 无可用配送方式时,清空所有支付网关 if (empty($shipping_methods)) { return array(); } return $available_gateways; }
逻辑说明
- 支付网关的过滤钩子会在购物车和结账页面加载时自动触发,无需从无配送提示的钩子中手动调用。
- 通过
WC()->cart->get_shipping_methods()可直接获取当前购物车的可用配送方式,为空则说明用户所在地区不在服务范围内。 - 这种方式完全贴合WooCommerce的钩子执行流程,避免了跨钩子调用的复杂逻辑。
内容的提问来源于stack exchange,提问作者PaulJ
相关产品推荐
相关产品推荐

