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

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参数,可以为不同状态的分类页面创建独立模板:

  1. 复制现有的taxonomy.php文件,分别重命名为:
    • taxonomy-events_cat-active.php(用于未过期分类内容展示)
    • taxonomy-events_cat-expired.php(用于过期分类内容展示)
  2. 在两个模板中分别写死meta_query的compare值:
    • active模板中设置'compare' => '>='
    • expired模板中设置'compare' => '<'
  3. 配合WordPress的重写规则,让过期/未过期页面的分类链接指向对应的模板(此方式需要配置rewrite规则,相对复杂,适合有一定开发经验的场景)

注意事项

  • 确保expiry自定义字段存储的日期格式为Ymd(如20241231),和$today的格式完全一致,否则比较逻辑会出错
  • 添加'type' => 'DATE'参数,让WordPress按日期类型而非字符串类型比较,避免出现类似20240101和20241231的字符串排序问题
  • 对URL参数做合法性验证,防止恶意参数注入

内容的提问来源于stack exchange,提问作者goge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:05:25