对于我的一个项目,我为帖子设置了三个自定义字段(年、月、日),以确定帖子内容的原始日期(而不是帖子发布日期,它用于在不同模板中排序)。对于存档/类别视图,我已通过以下查询参数成功地将它们按年份(自定义字段:date\\u year)、然后按月份(date\\u month)、然后按天(date\\u day)排序:
\'orderby\' => \'meta_value_num\',
\'order\' => \'DESC\',
\'meta_query\' => array(
array(
\'key\' => \'date_year\',
\'value\' => \'\',
\'compare\' => \'LIKE\'
),
array(
\'key\' => \'date_month\',
\'value\' => \'\',
\'compare\' => \'LIKE\'
),
array(
\'key\' => \'date_day\',
\'value\' => \'\',
\'compare\' => \'LIKE\'
)
)
然而,该项目将要求将每年的职位分为一个单独的部门,每个部门都有一个唯一的ID,例如:。
<div id="year-2015">
<!-- All posts from 2015, ordered by month and then day -->
</div>
<div id="year-2014">
...
</div>
有没有一种简单的方法可以做到这一点?为了实现这一点,我必须如何进行查询?或者,您通常会(即使项目需要三个单独的字段)建议一个字段,然后将其分解以检索年份,以便拆分为div吗?
更新1结果表明,一个单一日期字段(格式Y-m-d:例如“2015-02-18”)会更好。基本查询是
$args = array(
\'cat\' => 14,
\'post_type\' => \'post\',
\'posts_per_page\' => -1,
\'orderby\' => \'meta_value_num\',
\'order\' => \'DESC\',
\'meta_key\' => \'p2f_date\'
);
为了按预期通过日期字段获得正常订单,但到目前为止,当然还没有按年份分组。
SO网友:mathieuhays
一个字段就足够了,但如果你用3来管理你的方式,那也很好。
我将对结果进行循环,最终得到如下结构:
$years = array(
\'2015\' => array(
<WP_Post object>,
<WP_Post object>,
etc...
),
\'2016\' => array(
etc...
)
);
然后,您可以再次遍历这些数组来构建html。
在这种情况下,可以使用许多不同的工艺。我想就用你最喜欢的吧。我只是觉得一次数据库调用要比三次好。
我不知道我是否回答了你的问题,但我希望这会有所帮助。
编辑:
由于您是按日期排序的,因此无需重新排序结果,因此应尽可能简单:
/* Your custom query */
$args = array(
\'cat\' => 14,
\'post_type\' => \'post\',
\'posts_per_page\' => -1,
\'orderby\' => \'meta_value_num\',
\'order\' => \'DESC\',
\'meta_key\' => \'p2f_date\'
);
$archive = new WP_Query( $args );
$current_year = null;
/* if our query has posts */
if( $archive->have_posts() ){
/* loop through them */
while( $archive->have_posts() ){
$archive->the_post();
$p2f_date = get_post_meta( get_the_id(), \'p2f_date\' );
/* Here I skip if the meta is not defined but you might want to handle that differently */
if(empty($p2f_date)){
continue;
}
/* Get the year - Depending how you handle the post meta you might not need the index [0] */
$year = date(\'Y\', strtotime( $p2f_date[0] ));
if( $current_year === null ){
/* First item */
?>
<ul class=\'year year--<?php echo $year; ?>\'>
<?php
}else if( $current_year !== $year ){
/* New section */
?>
</ul>
<ul class=\'year year--<?php echo $year; ?>\'>
<?php
}
?>
<li>
<a href=\'<?php the_permalink(); ?>\'><?php the_title(); ?></a>
</li>
<?php
$current_year = $year;
}
?>
</ul>
<?php
}
/* Reset your page data in case you need it after the custom query */
wp_reset_postdata();
希望这有意义并回答您的问题。这里我使用了一个自定义
WP_Query
但如果这与您的情况相关,您可以更改主查询。