按自定义字段日期排序文章:如何显示过期文章并调整排序
嘿,这就帮你搞定这个需求!咱们一步步来实现:
首先得明确两个核心要求:一是要展示所有文章(包括过期的),二是排序要先未过期文章,再过期文章;而且同状态下,要按「无自定义字段 → 仅含Data_START → 含Data_START+Data_END」的优先级排序。
核心逻辑拆解
我们需要给每篇文章计算两个排序权重:
- 状态权重:未过期的标记为
0,过期的标记为1(确保未过期的排在前面) - 类型权重:无自定义字段的标记为
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
相关产品推荐
相关产品推荐

