如何显示所有按帖子日期划分/排序的帖子?

时间:2021-10-04 作者:JonSnow

下午好

我的任务是在一个页面上显示所有帖子,并以相应的帖子月份作为分隔符。这样的话:

January 2021
----------------- 
post 1 
post 2


February 2021
------------------ 
Post 3 
Post 4 
Post 5


March 2021
----------------- 
Post 6

...etc...
目前我只是读取了帖子列表,但如何创建我想要的细分?

<?php
    $wpb_all_query = new WP_Query(array(
    \'post_type\'=>\'post\',
    \'post_status\'=>\'publish\',
    \'posts_per_page\'=>-1,
    \'orderby\' => $orderby,
    \'order\' => $order
) );

 if ( $wpb_all_query->have_posts() ) : ?>

        <div id="list_allposts">
              <?php while ( $wpb_all_query->have_posts() ) : $wpb_all_query->the_post();
                   .....
               ?>
        </div>

  <?php endif; ?>

1 个回复
最合适的回答,由SO网友:Levi Cole 整理而成

您应该能够通过以下方式实现这一点。。。

<?php
    $wpb_all_query = new WP_Query( [
        \'post_type\'=>\'post\',
        \'post_status\'=>\'publish\',
        \'posts_per_page\'=> -1,
        \'orderby\' => \'date\',
        \'order\' => \'ASC\'
    ] );

    $dividers = [];
?>

<?php if ( $wpb_all_query->have_posts() ) : ?>

    <div id="list_allposts">
        <?php while ( $wpb_all_query->have_posts() ) : $wpb_all_query->the_post(); ?>

            <?php $post_date = get_the_date( \'F Y\' ); ?>
            <?php if ( !in_array( $post_date, $dividers ) ): ?>
                <?php $dividers[] = $post_date; ?>
                <div class="divider">
                    <?= $post_date; ?>
                </div>
            <?php endif ?>

            <!-- Post code here -->

        <?php endwhile; ?>
    </div>

<?php endif; wp_reset_postdata(); ?>
这样做的目的是创建一个;“分隔符”;(格式化日期)并检查是否已打印。

这种方法依赖于按日期排序的帖子,否则最终会出现错误的分隔符。

如果您想允许不同的排序(例如按标题),但要将它们按月份和年份分组/划分,您可以执行以下操作。。。

<?php
    $wpb_all_query = new WP_Query( [
        \'post_type\'=>\'post\',
        \'post_status\'=>\'publish\',
        \'posts_per_page\'=> -1,
        \'orderby\' => $orderby,
        \'order\' => $order
    ] );

    $dates_map = [];

    foreach ( $wpb_all_query->posts as $item ) {

        $date_key = (int)get_the_date( \'Ym\', $item );

        if ( !array_key_exists( $date_key, $dates_map ) ) {
            $dates_map[ $date_key ] = [
                \'label\' => get_the_date( \'F Y\', $item ),
                \'posts\' => []
            ];
        }

        $dates_map[ $date_key ][ \'posts\' ][] = $item;
    }

    ksort( $dates_map );

?>

<?php if ( !empty( $dates_map ) ) : ?>

    <div id="list_allposts">
        
        <?php foreach ( $dates_map as $map ): ?>
            <div class="divider">
                <?= $map[ \'label\' ]; ?>
            </div>

            <?php foreach ( $map[ \'posts\' ] as $post ): ?>
                <?php setup_postdata( $post ); ?>

                <!-- Code for each post here -->
                <?php the_title(); ?>

            <?php endforeach; wp_reset_postdata(); ?>

        <?php endforeach ?>

    </div>

<?php endif; ?>
这样做的目的是创建一个按日期分组的多维帖子数组。类似于。。。

$dates_map = [
    202101 => [
        \'label\' => \'January 2021\',
        \'posts\' => [
            object(WP_Post)[
                \'ID\' => 1,
                \'post_title\' = \'Post 1\',
                // ...
            ],
            object(WP_Post)[
                \'ID\' => 2,
                \'post_title\' = \'Post 2\',
                // ...
            ]
        ]
    ],
    202102 => [
        \'label\' => \'February 2021\',
        \'posts\' => [
            object(WP_Post)[
                \'ID\' => 3,
                \'post_title\' = \'Post 3\',
                // ...
            ],
            object(WP_Post)[
                \'ID\' => 4,
                \'post_title\' = \'Post 4\',
                // ...
            ]
        ]
    ],
    // ...
];
数组键是yearmonth 允许我们按升序排列组。

然后我们循环遍历每个日期,打印label 然后为该组中的每个帖子创建另一个循环。使用setup_postdata() 我们可以模拟标准的WP\\u查询while循环。

这两个都没有经过测试,但应该为您指明正确的方向。