按日期查询帖子(存储的自定义字段元为yyyymmdd),并区分12个月

时间:2013-06-24 作者:unfulvio

我有一个帖子类型,其中包含一个带有日期的自定义元字段。日期以以下格式存储:yyyymmdd.

在这个帖子类型的归档页面上,我想创建12个单独的容器,每个月一个,并在每个帖子中显示与相应月份匹配的内容。

我的问题是寻找实现我想要的想法。

多亏了Krzysiek Dródżidea,我过滤了pre\\u get\\u帖子,并在我的归档模板中为帖子类型生成了以下代码:

$posts_by_month = array()
while ( have_posts() ) : the_post();                                

    // get the post meta where the date is stored in yyyymmdd format                               
    $recurrence_date = strtotime( get_post_meta( $post->ID,\'recurrence_futuredates_0_recurrence_from\', true ) ); 
    // return the month only in \'1-12\' format
    $current_month = date( \'n\', $recurrence_date );  

    // loop 12 months
    for ( $i=1; $i<=12; $i++ ) {

        if ( $current_month == $i ) {

             // store all the posts for the $current_month
             $posts_by_month[$current_month][] = array( 
                     \'posts\' =>  array( 
                                       \'id\' => $post->ID,
                                       \'title\' => get_the_title(),
                                       \'permalink\' => get_permalink(),
                      ),
             );

          }

     }   

endwhile;

// sort the month order         
ksort( $posts_by_month );


// loop 12 months
for ( $i=1; $i<=12; $i++ ) {

    // if there are no posts for current month, skip month 
    if ( $posts_by_month[$i] ) {

        ?>
        <i><?php echo $i; ?></i>
        <?php foreach ( $posts_by_month[$i] as $this_month[$i] ) : ?>

            <b><?php echo $this_month[$i][\'title\']; ?></b><br/>

        <?php endforeach;

    }

}

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

首先,我认为你不应该在这里使用你的自定义query\\u帖子。WordPress已经查询了归档页面上的帖子,所以再次查询它们是浪费时间的。您应该使用pre_get_posts 滤器

function my_pre_get_posts($query) {
  if (!is_admin() && is_main_query() \'<YOUR_POST_TYPE>\' === $query->query_vars(\'post_type\')
         && $query->is_archive()) {
    $query->set(\'orderby\',\'meta_value\');
    $query->set(\'meta_key\', \'<YOUR_POST_TYPE>\'); //formatted YYYYMMDD
    $query->set(\'ignore_sticky_posts\', true);
  }
  return $query;
}
add_filter(\'pre_get_posts\',\'my_pre_get_posts\');
当您的帖子被选中时,您可以在循环中手动按月拆分帖子。这样的事情应该可以解决你的问题:

$prev_month = \'\';

while ( have_posts() ):
    the_post();
    $post_custom_date = strtotime(get_post_meta($post->ID, \'Deadline\', true)); // this line may need to be changed - it depends on the format you choosed to store dates in deadline meta value
    $current_month = date(\'F Y\', $post_custom_date );  
    if ( $current_month != $prev_month ) {
        echo \'<h2>\'. $current_month .\'</h2>\';
        $prev_month = $current_month;

    // output your post/event
endwhile;
它没有经过测试,所以可能有点问题,但这个解决方案背后的想法应该很清楚。

结束

相关推荐

setlocale for date

因此,我购买了一个高级wordpress主题,但我无法完成其波兰语本地化-时间或日期以外的日期显示为英语(默认服务器语言)。我读到我必须使用setlocale(LC\\u ALL,“pl\\u pl”);但我不知道它应该包含在哪个文件或哪里,以及/或者我是否需要更多。以下是显示英文日期的代码摘录:$event_date = get_post_meta(get_the_ID(), \'event_date\'); $event_from_time = get_post_meta(get_the_ID