Different Loop for tag pages?

时间:2016-03-03 作者:Sandra Johansson

我有一个主题,它使用一个模板文件来呈现博客的索引,循环是基本的:

if ( have_posts() ) : while ( have_posts() ) : the_post(); 
我想为我的所有is_tag( \'\' ) 第页。

if ( is_tag() ) {
    if ( have_posts() ) : while ( have_posts() ) : the_post(); 
}  else { 
    $paged      = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
    $query_args = array( 
        \'post_type\'         => \'post\',
        \'post_status\'       => array( \'private\', \'publish\' ),
        \'posts_per_page\'    => 20,
        \'paged\'             => $paged,
    ); 
    $the_query  = new WP_Query( $query_args );

    if ( $the_query->have_posts() ) :

        <!-- the new loop -->
        while ( $the_query->have_posts() ) : $the_query->the_post(); 

}
这根本不起作用。它会将标题下方的所有内容呈现为空白。有没有办法用一种简单的方式做到这一点?

EDIT: 我明白了is_tag() 可能在循环外不起作用这就是为什么不起作用的原因吗?好的解决方案是什么?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您的代码试图使用if语句来控制正在使用哪些if语句,等等,这就是元编程。这行不通,也永远行不通。

<?php

if ( is_tag() ) {
    if ( have_posts() ) {
        while ( have_posts() ) {
            the_post(); 
        }
    else { 
        $paged      = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
        $query_args = array( 
            \'post_type\'         => \'post\',
            \'post_status\'       => array( \'private\', \'publish\' ),
            \'posts_per_page\'    => 20,
            \'paged\'             => $paged,
        ); 
        $the_query  = new WP_Query( $query_args );

        if ( $the_query->have_posts() ) {

            <!-- the new loop -->
        while ( $the_query->have_posts() ) {
            $the_query->the_post(); 
        }
上述代码与您编写的代码等效,并存在以下问题:

PHP代码中间有一条HTML注释,这是无效语法,不是PHP。您永远不会关闭第一条if语句或第二条if语句

  • 您的第一个post循环实际上没有做任何事情,您的else语句缺少右括号,您尝试创建一个全新的查询,而不是使用pre_get_posts 滤器这意味着您要在页面模板中执行此操作,并尝试显示帖子,而不是依赖于模板层次结构的知识。你知道WordPress提供了标签类别和自定义帖子类型的模板,甚至包括单个日期和特定类别?阅读有关模板层次结构的信息,它将为您节省大量时间,如果您不了解它,可能会浪费数千个小时

    您声明此模板用于主页,但它也用于标记存档,这意味着这实际上是index.php.

    因此,让我们找出两个问题:

    您需要修改主页上显示的内容,在标记存档时需要显示其他内容解决问题1到目前为止,您的解决方案是忽略WordPress从数据库检索到的内容,并进行第二次数据库查询。这很昂贵,相当于:

    你每天早上派你的爸爸出去给你端杯茶。你把他们送到30分钟以外的地方,每天当他们回来时,你把茶扔在地板上,说“实际上我想要杯拿铁”

    可以说这很昂贵,而且浪费了很多时间。您的新WP_Query 相当于query_posts. 人们说不要使用query_posts 因为它所做的,这里发生的事情是做同样事情的一种稍微优雅的方式,它从根本上来说仍然很昂贵。

    相反,让我们使用pre_get_posts:

    function exclude_category( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $query->set( \'posts_per_page\', \'20\' );
            $query->set( \'post_status\', array( \'private\', \'publish\' );
        }
    }
    add_action( \'pre_get_posts\', \'exclude_category\' );
    
    该过滤器将在查询出现在您的主页上之前对其进行修改,允许您使用标准、正常的post循环,而不是自定义WP_Query 环分页只需开箱即用,不会有任何其他查询。这相当于:

    就在爸爸出去喝茶之前,你轻拍他们的肩膀,说“这个订单不对,对不起,你能给我换杯拿铁吗?”。爸爸第一次喝拿铁,没有把茶扔到地板上,你喝得更快

    作为旁白,index.php 是回退模板。对于您的主页,请考虑使用home.php.

    就像所有过滤器一样functions.php, 不是你的模板。

    解决问题2使用tag.php, 就这么简单。不要试图使用同一个模板来显示多个处处带有条件的东西,只需遵循模板层次结构,让WordPress来完成工作

  • 相关推荐

    WordPress Custom Post Loop

    我正在尝试循环浏览自定义WordPress帖子,遇到了一个问题,比如我添加了自定义字段并想在中显示它<li> 使用循环。我成功地完成了操作,但数据/链接/类别正在重复,如果类别与以下内容相同,我希望只显示一次:如果我有2篇带有data1类别的帖子,那么链接将只显示data1once 但我有2个不同类别的帖子,然后它会分别显示每个帖子。Sample Code:<ul class="filter filter-top"> <li cla