在get_template_part循环中使用自定义WP_Query


9

我有一个自定义帖子类型的查询:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
?>

我想使用loop-books.php遍历这些帖子:

<?php get_template_part( 'loop', 'books' ); ?>

在loop-books.php内部,我有这些内容,就像常规的loop.php一样,我只是更改了have_posts和the_post函数以与$ books查询一起使用:

<?php if ( $books->have_posts() ) : ?>      
    <?php while ($books->have_posts()) : $books->the_post(); ?>
        <?php the_title(); ?><br/>
    <?php endwhile; ?>
<?php endif; ?>

但是之后,我得到了一个PHP错误:

Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1

因此,看起来$ books变量在get_template_part函数内部不可用。我该如何解决这个问题?如果我将$ books查询放入loop-books.php内,则可以正常工作,但我想将它们分开。


尝试$books->从loop-books.php中删除&我希望它能工作。
罗希特·潘德

如果我删除$ books->部分,它将使用默认查询,因此对我不利。
passatgt 2012年

如果您使用的是类似内容: <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $books = new WP_Query(array( 'post_type' => 'wiki', 'posts_per_page' => '50', 'paged' => $paged )); ?>并在此处加载get_template_part查询。在这之后,如果您reset postdata认为我的解决方案能够正常工作。
罗希特·潘德

Answers:


5

您将需要全球化$books(如果您想坚持get_template_part())或使用

require( locate_template( 'loop-books.php' ) );

代替get_template_part( 'loop', 'books' );。此问题是由导致$booksloop-books.php被定义为仅在范围内get_template_part()


2
这个。但是,如果$books查询特定于loop-books.php模板部件文件,我建议您仅将$books = new WP_Query()调用放在模板部件文件中。
Chip Bennett

谢谢。您如何看待,哪个是更好的解决方案?
passatgt 2012年

相同,相同@Chip-我也将其放在相同文件中,并且首先避免了该问题。请记住,OP希望将两者分开。
约翰内斯·皮尔

1
@passatgt至于哪个更好,请参阅上面的注释,我宁愿使用一个文件并完成它。如果必须将它们分开,我会选择使用该locate_template()选项,以免使全局名称空间混乱。
约翰内斯·皮尔

好,谢谢。我想分开它们的原因是因为我也想根据其他类别/分类法对其他查询使用相同的循环
passatgt 2012年

8

另一种方法是:打开/关闭循环,然后使用loop-books.php来仅包含循环内容的标记。例如:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Get books query
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
// Open books loop
if ( $books->have_posts() ) :     
    while ($books->have_posts()) : $books->the_post();
        // Get loop markup
        get_template_part( 'loop', 'books' );
// Close books loop
    endwhile;
endif;
?>

然后,在loop-books.php

<?php the_title(); ?><br/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.