web-dev-qa-db-ja.com

Get_template_partループでカスタムWP_Queryを使用する

カスタム投稿タイプのクエリがあります。

<?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関数内では使用できません。どうすればこの問題を解決できますか? loop-books.phpの中で$ booksクエリをうまく機能させたとしても、それらを分離したいのです。

9
passatgt

あなたは$booksをグローバル化する必要があるでしょう(あなたがget_template_part()に固執したいなら)または

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

get_template_part( 'loop', 'books' );の代わりに。この問題は、get_template_part()scope でのみ定義されている$books内のloop-books.phpが原因で発生します。

5
Johannes Pille

別の方法:ループを開閉してから、ループの内容に マークアップ だけを含めるために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/>
8
Chip Bennett