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

按自定义字段日期排序文章:如何显示过期文章并调整排序

嘿,这就帮你搞定这个需求!咱们一步步来实现:

首先得明确两个核心要求:一是要展示所有文章(包括过期的),二是排序要先未过期文章,再过期文章;而且同状态下,要按「无自定义字段 → 仅含Data_START → 含Data_START+Data_END」的优先级排序。

核心逻辑拆解

我们需要给每篇文章计算两个排序权重:

  1. 状态权重:未过期的标记为0,过期的标记为1(确保未过期的排在前面)
  2. 类型权重:无自定义字段的标记为0,仅含Data_START的标记为1,含两个字段的标记为2(按要求的类型优先级排序)

然后按「状态权重升序 → 类型权重升序」的规则排序即可。

代码示例(以WordPress为例,其他语言逻辑一致)

// 获取今日日期,确保和自定义字段格式一致(这里用Y-m-d)
$today = date('Y-m-d');

// 第一步:获取所有发布的文章
$args = array(
    'post_type' => 'post', // 替换成你的文章类型
    'posts_per_page' => -1, // 获取全部文章
    'post_status' => 'publish'
);
$posts_query = new WP_Query($args);

// 第二步:给每篇文章添加排序元数据
$sorted_posts = array();
while ($posts_query->have_posts()) {
    $posts_query->the_post();
    $post_id = get_post_meta($post_id, 'Data_START', true);
    $end_date = get_post_meta($post_id, 'Data_END', true);

    // 计算类型权重
    $type_weight = 0;
    if ($start_date && !$end_date) {
        $type_weight = 1;
    } elseif ($start_date && $end_date) {
        $type_weight = 2;
    }

    // 判断是否未过期
    $is_active = true;
    if ($start_date && !$end_date) {
        // 仅Data_START:今日 >= 开始日期则未过期
        $is_active = $today >= $start_date;
    } elseif ($start_date && $end_date) {
        // 含两个字段:今日在[开始,结束]区间内则未过期
        $is_active = ($today >= $start_date) && ($today <= $end_date);
    }
    // 无自定义字段的文章默认未过期

    // 计算状态权重
    $status_weight = $is_active ? 0 : 1;

    // 把文章和排序权重存入数组
    $sorted_posts[] = array(
        'post' => $post,
        'status_weight' => $status_weight,
        'type_weight' => $type_weight
    );
}

// 第三步:按规则排序文章
usort($sorted_posts, function($a, $b) {
    // 先按状态权重排序,未过期在前
    if ($a['status_weight'] !== $b['status_weight']) {
        return $a['status_weight'] - $b['status_weight'];
    }
    // 状态相同的话,按类型权重排序
    return $a['type_weight'] - $b['type_weight'];
});

// 第四步:输出排序后的文章
foreach ($sorted_posts as $item) {
    setup_postdata($item['post']);
    // 这里替换成你的文章输出逻辑,比如:
    echo '<h3>' . get_the_title() . '</h3>';
    echo '<div>' . get_the_content() . '</div>';
}
wp_reset_postdata();

关键注意事项

  • 确保自定义字段的日期格式和$today的格式完全一致(比如都是YYYY-MM-DD),否则日期比较会出错
  • 如果是其他开发框架(比如Laravel、Django),逻辑完全相同:先获取所有文章,计算两个排序维度,再排序输出就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:57:20