WooCommerce销售日程日期提前1天显示 折扣起始日期前端展示异常
WooCommerce销售日程开始日期提前1天显示问题排查与修复
问题根因
日期提前1天是时区处理不一致导致:WooCommerce存储折扣起止日期时,date_on_sale_from字段默认存UTC时区当日0点的时间戳,原代码直接调用getTimestamp()取原始UTC时间戳传给date_i18n(),没有做站点时区偏移转换。如果站点时区是UTC+8这类正偏移时区,UTC时间0点对应本地时间是前一天的下午/晚上,格式化后日期就会显示为前一天。
结束日期显示正常是因为WooCommerce存储date_on_sale_to时,默认存UTC时区当日23:59:59的时间戳,即使加上时区正偏移,时间仍然落在本地日期当天,所以不会出现日期提前的问题。
排查步骤
- 核对WordPress后台「设置-常规」中的时区配置,确认选择的是对应地区的正确时区(如国内选择「上海」对应UTC+8),不要使用UTC±0默认值
- 打印
$product->get_date_on_sale_from()->getTimestamp()计算对应本地时间:如果后台选的是10月1日作为开始日期,取到的UTC时间戳转换为本地时间落在9月30日,即可确认是时区转换缺失问题 - 临时切换默认主题、关闭其他折扣类插件,排除第三方代码提前修改销售日期元数据的冲突情况
修复方案
不要直接调用getTimestamp()取原始UTC时间戳,改用WooCommerce原生日期方法自动适配站点时区,同时修正原代码中存在的逻辑判断、HTML标签闭合错误,修复后的完整代码如下:
function customize_woocommerce_get_price_html( $price, $product ) { // 仅在商品详情页、针对简单/可变商品、同时设置了折扣起止日期时生效 if ( is_product() && ( $product->is_type( 'simple' ) || $product->is_type( 'variation' ) ) && ! empty( $product->get_date_on_sale_from() ) && ! empty( $product->get_date_on_sale_to() ) ) { $date_format = 'j F Y'; // 调用WooCommerce原生日期方法,自动按站点时区转换时间,避免日期偏移 $sale_start = wc_format_datetime( $product->get_date_on_sale_from(), $date_format ); $sale_end = wc_format_datetime( $product->get_date_on_sale_to(), $date_format ); $schedule_html = '</del><div class="sale-schedule"> <p>' . __( 'start discount', 'woocommerce' ) . '<span>' . $sale_start . '</span></p> <p>' . __( 'end discount', 'woocommerce' ) . '<span>' . $sale_end . '</span></p> </div>'; return str_replace( '</del>', $schedule_html, $price ); } return $price; } add_filter( 'woocommerce_get_price_html', 'customize_woocommerce_get_price_html', 100, 2 );
修复说明
- 原生
wc_format_datetime()方法会自动读取WordPress后台配置的时区做转换,从根源解决时区差导致的日期偏移问题 - 合并了简单商品、可变商品的重复判断逻辑,减少代码冗余
- 修正了原代码中
empty()判断的括号位置错误,避免逻辑判断失效 - 修正了原代码中HTML标签闭合顺序错误的问题,防止前端DOM结构错乱
内容的提问来源于stack exchange,提问作者social.reza
相关产品推荐
相关产品推荐

