在搜索查询中包括不同循环模板

时间:2012-06-24 作者:Godforever

我的博客中有不同的自定义帖子类型
我还为其中的每一个都提供了自定义模板,如loop-{$cpt-name}.php
我希望根据当前循环中的自定义帖子类型,在搜索结果中动态包含不同的cpt模板。我正在尝试这样做(search.php):

<?php
            while ( have_posts() ) : the_post(); 
                if ( get_post_type ( $post->ID ) == \'teams\' ) {
                    get_template_part( \'loop\', \'teams\' );
                } elseif ( get_post_type ( $post->ID ) == \'players\' )  {
                    get_template_part( \'loop\', \'players\' );
                } else {
                    get_template_part( \'loop\', \'search\' );
                }
            endwhile;
            ?>
然而,问题是,当我尝试这样做时,查询中有不定式循环。因为在search.php 文件我在while loop 并在我还有while语句的地方包括模板(我需要在那里)。我的CPT模板示例(开头):

<?php 
/**
 * The loop that displays teams
 *
 */
if ( have_posts() ) while ( have_posts() ) : the_post(); 
我想到了对循环中找到的每个帖子进行额外查询的想法,如下所示:

while ( have_posts() ) : the_post(); 
    if ( get_post_type ( $post->ID ) == \'teams\' ) {
            query_posts(\'p=\'.$post->ID);
            get_template_part( \'loop\', \'teams\' );
            wp_reset_query();
但我想这会让搜索速度慢下来。(尚未测试)
如有任何建议,将不胜感激。

2 个回复
SO网友:Mamaduka

我建议使用content-{posttype}.php 方法,其中您只有HTML标记、帖子的模板标记或自定义帖子类型,并在这些文件之外保留循环。更多详细示例,请参见第二十一条。

更改后,您可以轻松修改搜索。php并包含基于帖子类型的特定内容标记。

if ( have_posts() ) : 
    while ( have_posts() ) : the_post();    

    /**
     * Would include CPT content template (content-teams.php) if it exists
     * or content.php otherwise.
     */
    get_template_part( \'content\', get_post_type( $post ) ); 

    endwhile;
endif;

SO网友:danblaker

您最好只执行一个查询,但这需要对自定义的post类型循环进行一些重新设计。基本上,您可以将表示代码从循环中移到新文件中(我们称之为“partials”)。而不是loop-{$cpt-name}.php, 你会有一个文件partial-{$cpt-name}.php.

而不是从search.php, 你会登记的loop-search.php 如果存在适当的partials,则将其包括在内,如下所示:

<?php
while ( have_posts() ) : the_post(); 
 $cpt = $post->post_type; 
 $partial = "partial-{$cpt}.php";
 if ( locate_template( $partial )
    {
      include( locate_template( $partial ) );
    }
  else
    {
      ?>
      <div>Default Search loop output here for non-CPT posts</div>
      <?php
    }
endwhile;
?>
您可以在常规循环中执行相同的操作,而不是对每个自定义帖子类型使用单独的循环。如果您想继续使用单独的循环,您应该导入这些CPT循环中的部分,而不是指定表示代码。

结束