获取WordPress分类档案并按年排序

时间:2016-02-25 作者:Jack Cash

我有一个带有自定义分类法的自定义帖子类型。

我当前正在显示按日期排序的所有帖子,标题为日期,位于使用此代码的所有帖子上方:

<?php
$years = $wpdb->get_results( "SELECT YEAR(post_date) AS year FROM wp_posts WHERE post_type = \'press\' AND post_status = \'publish\' GROUP BY year DESC" );

foreach ( $years as $year ) {

    $posts_this_year = $wpdb->get_results( "SELECT ID, post_title FROM wp_posts WHERE post_type = \'press\' AND post_status = \'publish\' AND YEAR(post_date) = \'" . $year->year . "\'" );

    echo \'<div id="press-year">\' . $year->year . \'</div>\';



    foreach ( $posts_this_year as $post ) {


echo \'<div id="small_gridbox1">\';


$src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID),         thumbnail, false);
echo \'<div id="small_gridbackground" style="background-image: url(\';
echo $src[0];
echo \')"> </div> 

<a href="\';
the_field(\'pdflink\');
echo \'" target="_blank"> <div id="small_gridcontent">

 <div class="small_title">\';
the_title();
echo \'<div class="job_title">\';
the_field(\'title\');
echo \'</div></div>
<div class="small_sub">\';
echo str_replace(\' \', \'\', get_field(\'sub_heading\'));
echo \'</div>

</div>
  </a>
</div>\';
    }

}
 ?>
我似乎无法在归档页面上仅获得具有特定分类法的帖子。

理想情况下,我希望使用我拥有的代码,但如何将其与我过去成功使用的代码结合起来:

  <?php $term = get_term_by( \'slug\', get_query_var( \'term\' ),
get_query_var( \'taxonomy\' ) ); ?>
有人能提供一些见解吗?

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

你把这里的一切都复杂化了。你所做的不仅仅是昂贵的(因为你失去了所有的缓存,包括post、post meta、term和缩略图缓存),这也是完全错误的。

您正在运行替换主查询的自定义查询。这本身会使页面加载变慢

为了安全和动态,您不应该运行自己的SQL查询。正如我所说,您释放了所有缓存,这使得页面加载更快,并减少了db查询。您还松开了所有过滤器和操作WP_Query 提供

您正在运行许多不必要的查询。你需要做的一切都已经在主查询中了,这只是使用这些信息来满足你的需要的一个例子

让我们看看如何解决这个问题。分类术语存档页面上的主查询已经只返回所查询术语中的帖子。默认情况下,这些帖子是按日期、描述排序的,因此最新的帖子将位于顶部,恐龙将位于底部。正如您所看到的,一切都已经存在,您可能需要做的就是更改每页显示的帖子数量,在这种情况下,似乎所有帖子都在第一页上

因为我们在这里使用主查询,所以所有的后期缓存都被我们的post、post meta和term信息填满,这为以后的db查询节省了很多时间。此外,由于我们使用主查询,因此也会缓存帖子缩略图。请记住,post缩略图仅为主查询缓存,而不是为自定义查询缓存。

首先,让我们使用pre_get_posts 获取分类术语归档页面第一页上的所有帖子

add_action( \'pre_get_posts\', function ( $q )
{
    if (    !is_admin()         // Only target front end
         && $q->is_main_query() // Only target the main query
         && $q->is_tax()        // Only target taxonomy term archive pages
    ) {
        $q->set( \'posts_per_page\', -1 ); // Will return all posts on page one
    }
});
如果使用主默认循环,则会在分类法归档页面上看到按日期排序返回的所有帖子

让我们对循环进行排序。首先,删除所有代码。我们不希望也不需要自定义查询。我们只想使用主回路。至于排序部分,比较发布日期很容易,如果任何两个发布的日期不同,则只显示年份(NOTE: 所有代码都未经测试,我只清理了您的代码,没有更改它

if ( have_posts() ) {

    // Define a variable which will hold our year value
    $year_variable = \'\';

    while ( have_posts() ) {
        the_post();

        // Lets get the post date, but only the year value
        $post_year = get_the_date( \'Y\' );

        /** 
         * Compare the current post\'s date with our $year_variable and
         * display the year value if the two dates differs
         */
        if ( $year_variable !== $post_year )
            echo \'<div id="press-year">\' . $post_year . \'</div>\';

        // Update the $year_variable value
        $year_variable = $post_year;

        // Now we can display the rest of the loop
        echo \'<div id="small_gridbox1">\';

            $src = wp_get_attachment_image_src( get_post_thumbnail_id(), thumbnail, false);
            echo \'<div id="small_gridbackground" style="background-image: url(
                \' . $src[0] . \'
            </div>\'; 

            echo \'<a href=\'" . the_field(\'pdflink\') . \'" target="_blank
                <div id="small_gridcontent">
                    <div class="small_title">
                        \' . the_title() . \'
                        <div class="job_title">
                            \' . the_field(\'title\') . \'
                        </div>
                    </div>
                    <div class="small_sub">
                        \' . str_replace( \' \', \'\', get_field(\'sub_heading\' ) ) . \'
                    </div>
                </div>
            </a>\';
        echo \'</div>\';
    }
}
这将使您基本了解分类法归档页面的外观

相关推荐

Custom Taxonomy Page

我正在尝试创建一个显示特定类别的所有子类别的页面。所以在上下文中,我有一个标题为“目的地”的父类别。我希望能够点击目的地,并被引导到一个页面,显示子类别或国家的列表。下面是我试图实现的一个示例,减去顶部的地图-https://www.vagabrothers.com/destinations. 在理想情况下,类别页面的布局将与此页面相同。你可以从上面的例子中看出我的意思。它会使网站上的导航像这样:目的地>国家>个人帖子。我正在使用CPT UI,设置了一个名为“目的地”的自定义帖子类型和类别,然