WooCommerce如何实现跨天时间段禁用货到付款(COD)支付方式
问题原因
你原有代码的时间判断逻辑存在矛盾:date('H')返回0~23范围的整数值,不可能同时满足>=23和<=8两个条件,因此无法识别跨零点的时间段。
跨天时段的判断不能用「同时满足两个时间边界」的且逻辑,需要拆为两个独立时段做或逻辑判断。
修正方案
将时间判断逻辑调整为:只要当前时间处于当日23点及以后,或者处于次日8点以前,就属于需要禁用COD的时段。
另外不建议在过滤器回调中反复修改全局时区设置,容易干扰站点其他时间相关功能的运行,推荐用DateTime类单独指定时区获取时间,逻辑更隔离更稳定。
修正后的完整代码如下:
add_filter( 'woocommerce_available_payment_gateways', 'payment_gateways_based_on_hour', 1 ); function payment_gateways_based_on_hour( $gateways ) { // 指定对应时区获取当前时间,不修改全局时区 $now = new DateTime( 'now', new DateTimeZone( 'America/Lima' ) ); $current_hour = (int)$now->format( 'G' ); // 返回0~23不带前导零的小时数 // 跨天时段判断:23点及以后 或 8点以前 if ( isset( $gateways['cod'] ) && ( $current_hour >= 23 || $current_hour < 8 ) ) { unset( $gateways['cod'] ); } return $gateways; }
调整说明
- 时间边界可按需修改:如果需要8点整也保持禁用,将判断里的
$current_hour < 8改为$current_hour <= 8即可 - 如果你的站点已经在WordPress后台设置好了正确的时区,可以删掉
DateTimeZone传参部分,直接用new DateTime()获取当前时间,和全站时间逻辑保持一致 - 测试时可以临时给
$current_hour赋值固定值(比如赋值23、7、9这类边界值)快速验证逻辑是否生效,不需要等到对应时段测试
内容的提问来源于stack exchange,提问作者ariva21
相关产品推荐
相关产品推荐

