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と同様に、これらの変数があります。$ booksクエリで機能するようにhave_postsおよびthe_post関数を変更しました。

<?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からを削除してみてください。うまくいくことを願っています。
Rohit Pande

$ books->の部分を削除すると、デフォルトのクエリが使用されるため、私には不向きです。
passatgt

次のようなものを使用している場合: <?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は私の解決策が適切に機能すると思います。
Rohit Pande

回答:


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()内に呼び出しを置くことをお勧めします。
チップベネット、

ありがとう。あなたの意見はどうですか、どちらがより良い解決策ですか?
passatgt 2012年

同じ、同じ@Chip-同じファイルに入れて、最初から問題を回避します。OPが2つを分離することを望んでいたことを念頭に置いてこれに答えました。
ヨハネス・ピレ

1
@passatgtどちらが良いかについては、上記のコメントを参照してください。むしろ、1つのファイルで行って、それで済ませたいと思います。それらを分離する必要がある場合はlocate_template()、グローバル名前空間を散らかさないようにするオプションを選択します。
Johannes Pille、2012年

わかりました。それらを分離したい理由は、他のカテゴリ/分類に基づいて他のクエリでも同じループを使用したいためです
passatgt

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/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.