如何获取所有有帖子的年份的列表

时间:2019-08-24 作者:Nathaniel Flick

我想要的只是一系列从第一年到最后一年的帖子,但出于某种原因,我只得到了前两年,2019年和2018年,那时我的帖子可以追溯到2016年。这是我的代码:

 <ul class="inline-list posts-by--year">
            <li>Posts by year:</li>
            <li><a href="<?php echo get_site_url(); ?>/news-and-media">All Posts</a></li>
          <?php
$terms_year = array(
    \'post_type\' => array(\'post\'),
);

$years = array();
$query_year = new WP_Query($terms_year);

if ($query_year->have_posts()):
    while ($query_year->have_posts()): $query_year->the_post();
        $year = get_the_date(\'Y\');
        if (!in_array($year, $years)) {
            $years[] = $year;
            echo \'<li><a href="\';
            echo home_url();
            echo \'/news-and-media/?year=\';
            echo $year;
            echo \'">\';
            echo $year;
            echo \'</a></li>\';
        }
    endwhile;
    wp_reset_postdata();
endif;
?>
</ul>
当我这样做的时候,它可以工作,但我希望使用?年份=筛选而不是存档:

<ul class="inline-list posts-by--year">
            <li>Posts by year:</li>
            <li><a href="<?php echo get_site_url(); ?>/news-and-media">All Posts</a></li>
<?php $args = array(
    \'type\'            => \'yearly\',
    \'limit\'           => \'\',
    \'format\'          => \'custom\', 
    \'before\'          => \'<li class="nothing">\',
    \'after\'           => \'</li>\',
    \'show_post_count\' => false,
    \'echo\'            => 1,
    \'order\'           => \'DESC\',
    \'post_type\'     => \'post\'
);
wp_get_archives( $args ); 
?>

</ul>

1 个回复
SO网友:Mike Baxter

我不知道为什么您更喜欢较长的方法而不是wp\\u get\\u archives()。我建议让Wordpress为你做这项工作。它更高效,更容易阅读。

However ... since you presented a particular preference:

似乎您正在使用一个数组作为post\\u类型,而不需要任何数组。尝试将WP\\U查询参数修改为:

$terms_year = array(
    \'post_type\' => \'post\',
    \'orderby\'   => \'modified\',
    \'order\' => \'DESC\',
    \'post_status\' => \'publish\',
);
这将对您的条目进行预排序,以便某一特定年份的所有帖子同时显示。此外,添加post\\u状态可以确保不会出现公众永远看不到的修订、草稿或垃圾。

那么,为了可读性,我可以构建<li> 输出如下:

if (!array_key_exists($year, $years)) {
       $years[$year] = \'<li><a href="\';
       $years[$year] .=  home_url();
       $years[$year] .=  \'/news-and-media/?year=\';
       $years[$year] .=  $year . \'">\';
       $years[$year] .=  $year;
       $years[$year] .=  \'</a></li>\';
       echo $years[$year];
}
Echo语句的性能代价很高。因此,最好构建完整的字符串,然后进行回音。和这更容易阅读。

最后一次(主动)评论。。。您应该考虑使用“home\\u url()”或“get\\u site\\u url()”,而不是两者都使用。您已经在这个代码示例中混合了它们。这可能有用,但可能会给你带来麻烦。

希望这是有帮助的!

相关推荐

Run a function on all posts

我有一个函数,我计算标题中的字母,并将其相加_product_meta_title key, 当我添加新产品时,一切正常,但我有500个产品没有此密钥。所以我需要在所有帖子上运行我的函数一次。function save_post_title_length_meta( $post_id, $post, $update ) { /* * In production code, $slug should be set only once in the plugin, * p