
本文介绍如何通过 PHP 函数比对自定义文章类型中 ACF 日期字段与当前日期,动态返回不同 CSS 类名(如 banner-si 或 banner-no),解决因日期格式不匹配导致的逻辑失效问题。
本文介绍如何通过 php 函数比对自定义文章类型中 acf 日期字段与当前日期,动态返回不同 css 类名(如 `banner-si` 或 `banner-no`),解决因日期格式不匹配导致的逻辑失效问题。
在 WordPress 开发中,常需根据 ACF(Advanced Custom Fields)存储的日期字段控制前端样式,例如为即将开始的比赛显示绿色 Banner(banner-si),已结束的则显示灰色 Banner(banner-no)。但直接使用字符串比较(如 >= '2024-10-05')极易出错——因为 get_post_meta() 返回的日期字符串若格式不规范(如含时间、空格或时区偏移),或未严格校验有效性,会导致比较结果不可靠。
✅ 正确做法是:将日期字符串安全解析为 DateTime 对象,再进行严谨的时间差计算。以下是优化后的函数:
function banner_change( $id = false ) {
// 确保传入有效 post ID
if ( ! $id || ! is_numeric( $id ) ) {
return 'banner-no'; // 默认 fallback
}
// 获取 ACF 日期字段值(假设字段名为 'data',且存储格式为 Y-m-d)
$date_string = get_post_meta( $id, 'data', true );
// 安全校验:空值、非法格式直接返回默认类
if ( empty( $date_string ) || ! preg_match( '/^\d{4}-\d{2}-\d{2}$/', $date_string ) ) {
return 'banner-no';
}
// 使用 DateTime::createFromFormat 精确解析,避免 strtotime 的歧义
$target_date = DateTime::createFromFormat( 'Y-m-d', $date_string );
if ( ! $target_date || $target_date->format( 'Y-m-d' ) !== $date_string ) {
return 'banner-no'; // 解析失败,视为过期
}
$today = new DateTime(); // 当前日期(不含时间部分,仅比较日)
$today->setTime( 0, 0, 0 ); // 归零时间,确保纯日期比较
// 计算目标日期与今日的天数差(正数表示未来,0 表示今天,负数表示过去)
$interval = $target_date->diff( $today );
$days_diff = (int) $interval->format( '%r%a' ); // %r 保留符号,%a 为绝对天数
// 逻辑说明:
// $days_diff > 0 → 目标日期在未来 → 'banner-si'
// $days_diff == 0 → 今天 → 视为“未过期”,仍返回 'banner-si'(可根据业务调整)
// $days_diff = 0 ? 'banner-si' : 'banner-no';
}
? 关键注意事项:
- ✅ ACF 字段设置:确保日期字段的「返回格式」设为 Y-m-d(而非时间戳或完整日期时间),否则 DateTime::createFromFormat 可能解析失败;
- ✅ 时区一致性:服务器与 WordPress 时区需统一(推荐在 wp-config.php 中设置 date_default_timezone_set('Asia/Shanghai'));
- ✅ 前端调用示例:
<div class="banner <?php echo esc_attr( banner_change( get_the_ID() ) ); ?>"> <?php the_title(); ?> </div> - ⚠️ 避免直接使用 strtotime() —— 它对模糊格式(如 '05/10/2024')解析不稳定,易受区域设置影响。
该方案兼顾健壮性与可维护性,适用于任意自定义文章类型(如 match、event),无需额外插件依赖,是 WordPress + ACF 日期条件渲染的最佳实践之一。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











