按三个定制字段(Y-m-d)排序,然后分成年度部分

时间:2015-02-15 作者:physalis

对于我的一个项目,我为帖子设置了三个自定义字段(年、月、日),以确定帖子内容的原始日期(而不是帖子发布日期,它用于在不同模板中排序)。对于存档/类别视图,我已通过以下查询参数成功地将它们按年份(自定义字段: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\'
);
为了按预期通过日期字段获得正常订单,但到目前为止,当然还没有按年份分组。

1 个回复
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 但如果这与您的情况相关,您可以更改主查询。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post