基于ACF日期切换CSS类实现div显隐的PHP函数运行异常求助
问题核心原因
你的函数失效基本是以下几个问题导致的:
- ACF日期字段默认存储格式为
Ymd(例如20240520),和你生成的Y-m-d格式(例如2024-05-20)字符串结构完全不同,直接做大小对比本质是字符串逐位比较,结果完全不符合日期先后逻辑 - 直接调用PHP原生
date()取的是服务器默认时区时间,没有读取WordPress后台设置的时区参数,时间偏差会导致判断错误 - 没有做空值兜底,如果对应文章没有填写该日期字段,函数会返回空值,导致div上拿不到预期的class
- 直接用
get_post_meta()取值时如果记错了字段meta key,会拿不到正确的日期值
修正后可用代码
function banner_change($match_id){ // 优先通过ACF原生方法取值,注意将'data'替换为你实际使用的ACF字段名 $datamatch = get_field('data', $match_id); // 兜底:如果ACF方法未取到值,再尝试从post meta读取 if(empty($datamatch)){ $datamatch = get_post_meta($match_id, 'data', true); } // 空值默认返回隐藏类 if(empty($datamatch)){ return 'banner-no'; } // 兼容两种常见日期存储格式,统一转成时间戳做对比,避免格式问题 if(strpos($datamatch, '-') !== false){ $match_timestamp = strtotime($datamatch); }else{ // 处理ACF默认存储的Ymd无横杠格式 $match_timestamp = strtotime( substr($datamatch, 0, 4) . '-' . substr($datamatch, 4, 2) . '-' . substr($datamatch, 6, 2) ); } // 按WordPress后台设置的时区取当日零点时间戳,消除时区偏差 $today_timestamp = strtotime(current_time('Y-m-d')); return $match_timestamp >= $today_timestamp ? 'banner-si' : 'banner-no'; }
额外排查点
- 调用函数时确认传入的
$match_id是目标自定义文章类型的正确ID - 如果ACF后台手动修改过日期字段的返回格式(比如设置为返回时间戳),可以直接去掉格式转换逻辑,直接对比时间戳即可
- 确认CSS中
.banner-si为显示规则、.banner-no为隐藏规则,避免CSS写反导致视觉上判断失效
内容的提问来源于stack exchange,提问作者Andrea Schiavetti
相关产品推荐
相关产品推荐

