You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:46:02