WordPress按自定义分类与ACF过期日期字段筛选文章的问题
解决方案:按分类+过期状态筛选自定义文章类型
核心问题分析
你之前的代码错误在于试图用单个$expiry值判断筛选规则,但$expiry是单篇文章的自定义字段,在执行WP_Query查询前无法获取到具体值。正确的思路应该是根据当前页面的类型(过期/未过期页面)来确定meta_query的compare参数。
可行实现方案(推荐使用URL参数方式)
1. 分类链接添加状态参数
在你的「未过期文章页面」和「过期文章页面」中,生成分类链接时带上自定义状态参数,用于告诉taxonomy.php要筛选的状态:
- 未过期页面的分类链接添加
?status=active - 过期页面的分类链接添加
?status=expired
示例代码(在未过期页面生成分类链接):
// 获取所有events_cat分类项 $event_cats = get_terms(['taxonomy' => 'events_cat', 'hide_empty' => false]); foreach ($event_cats as $cat) { // 给分类链接追加status=active参数 $cat_link = add_query_arg('status', 'active', get_term_link($cat)); echo '<a href="' . esc_url($cat_link) . '">' . esc_html($cat->name) . '</a>'; }
示例代码(在过期页面生成分类链接):
foreach ($event_cats as $cat) { $cat_link = add_query_arg('status', 'expired', get_term_link($cat)); echo '<a href="' . esc_url($cat_link) . '">' . esc_html($cat->name) . '</a>'; }
2. 修改taxonomy.php中的查询逻辑
在taxonomy.php中,读取URL中的status参数,根据参数设置对应的筛选规则:
<?php $today = date('Ymd'); $cat_slug = get_queried_object()->slug; // 验证并获取状态参数,默认显示未过期文章 $allowed_statuses = ['active', 'expired']; $event_status = isset($_GET['status']) && in_array($_GET['status'], $allowed_statuses) ? $_GET['status'] : 'active'; // 根据状态设置日期比较规则 $compare = ($event_status === 'expired') ? '<' : '>='; $args = array( 'post_type' => 'events', 'nopaging' => true, 'meta_key' => 'expiry', 'tax_query' => array( array( 'taxonomy' => 'events_cat', 'field' => 'slug', 'terms' => $cat_slug ) ), 'meta_query' => array( array( 'key' => 'expiry', 'value' => $today, 'compare' => $compare, 'type' => 'DATE' // 强制按日期类型比较,避免字符串匹配错误 ) ) ); $events = new WP_Query( $args ); if ( $events->have_posts() ) : ?> <?php while ( $events->have_posts() ) : $events->the_post(); ?> <!-- 你的文章展示代码 --> <?php endwhile; wp_reset_postdata(); ?> <?php endif; ?>
备选方案(自定义模板方式)
如果不想使用URL参数,可以为不同状态的分类页面创建独立模板:
- 复制现有的
taxonomy.php文件,分别重命名为:taxonomy-events_cat-active.php(用于未过期分类内容展示)taxonomy-events_cat-expired.php(用于过期分类内容展示)
- 在两个模板中分别写死
meta_query的compare值:- active模板中设置
'compare' => '>=' - expired模板中设置
'compare' => '<'
- active模板中设置
- 配合WordPress的重写规则,让过期/未过期页面的分类链接指向对应的模板(此方式需要配置rewrite规则,相对复杂,适合有一定开发经验的场景)
注意事项
- 确保
expiry自定义字段存储的日期格式为Ymd(如20241231),和$today的格式完全一致,否则比较逻辑会出错 - 添加
'type' => 'DATE'参数,让WordPress按日期类型而非字符串类型比较,避免出现类似20240101和20241231的字符串排序问题 - 对URL参数做合法性验证,防止恶意参数注入
内容的提问来源于stack exchange,提问作者goge
相关产品推荐
相关产品推荐

