
本文介绍如何在 wordpress 中通过 php 函数,根据 acf 自定义字段(日期类型)与当前日期的比较结果,动态返回不同的 css 类名,实现 banner 或其他区块的显隐/样式切换。
本文介绍如何在 wordpress 中通过 php 函数,根据 acf 自定义字段(日期类型)与当前日期的比较结果,动态返回不同的 css 类名,实现 banner 或其他区块的显隐/样式切换。
在 WordPress 主题或插件开发中,常需根据自定义日期字段(如 ACF 的 Date Picker 字段)控制前端元素的显示状态或样式。例如:仅当比赛日期尚未到来时显示「即将开始」Banner,过期后自动隐藏或切换为「已结束」样式。但直接用字符串比较 Y-m-d 格式日期存在隐患——若日期格式不一致、时区未统一或存储值为空/无效,会导致逻辑错误。
以下是一个健壮、可复用的解决方案:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
✅ 推荐写法:使用 DateTime::createFromFormat() 安全解析日期
function banner_change( $post_id = false ) {
// 确保传入有效 post ID,避免空值导致意外行为
if ( ! $post_id || ! is_numeric( $post_id ) ) {
return 'banner-no';
}
// 获取 ACF 日期字段值(假设字段名为 'data',格式为 Y-m-d)
$date_string = get_post_meta( $post_id, 'data', true );
// 若字段为空、非字符串或格式非法,视为过期
if ( empty( $date_string ) || ! is_string( $date_string ) ) {
return 'banner-no';
}
// 尝试按 Y-m-d 格式解析日期;失败则返回默认类
$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(); // 默认为服务器当前时间(建议配合 WP 时区设置)
// 比较:目标日期是否「严格大于」今日(即尚未开始)
// 注意:diff()->d 返回绝对天数差,此处应使用 compare()
$is_future = $target_date > $today;
return $is_future ? 'banner-si' : 'banner-no';
}
? 在模板中调用示例
<?php $match_id = get_the_ID(); // 或指定具体 ID,如 303
$banner_class = banner_change( $match_id );
?><div class="banner <?php echo esc_attr( $banner_class ); ?>">
<h3><?php the_title(); ?></h3>
<p>比赛将于 <?php echo get_post_meta( $match_id, 'data', true ); ?> 举行</p>
</div>
⚠️ 关键注意事项
- ACF 字段格式一致性:确保 ACF 中该日期字段的「Return Format」设为 Y-m-d(而非时间戳或其他格式),否则 DateTime::createFromFormat() 解析会失败。
- 时区安全:new DateTime() 默认使用 PHP 时区;建议在函数开头添加 date_default_timezone_set( get_option( 'timezone_string' ) ?: 'UTC' ); 以对齐 WordPress 设置。
- 空值/异常处理:原问题中未校验 $datamatch 是否存在,本方案增加了空值、类型及格式校验,避免 PHP 警告或逻辑错乱。
- 性能提示:若需在循环(如 WP_Query 列表页)中高频调用,请考虑缓存结果或改用 WP_Query 的 meta_query 在数据库层过滤,而非 PHP 层逐条判断。
此方法兼顾准确性、健壮性与可维护性,适用于任何基于日期条件切换样式或 DOM 状态的场景。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










