Używanie niestandardowej WP_Query z pętlą get_template_part

9

Mam zapytanie o niestandardowy typ postu:

<?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
));
?>

I chcę przeglądać te posty za pomocą loop-books.php:

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

Wewnątrz loop-books.php mam te, podobnie jak zwykła loop.php, właśnie zmieniłem funkcję have_posts i the_post, aby działały z zapytaniem $ books:

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

Ale potem pojawia się błąd php:

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

Wygląda więc na to, że zmienna $ books nie jest dostępna w funkcji get_template_part. Jak mogę rozwiązać ten problem? Jeśli wstawię zapytanie $ books do pliku loop-books.php działa dobrze, ale chcę je rozdzielić.

passatgt
źródło
spróbuj usunąć $books->plik loop-books.php i mam nadzieję, że zadziała.
Rohit Pande
Jeśli usunę część $ books->, użyję domyślnego zapytania, więc nie jest to dla mnie dobre.
passatgt
jeśli używasz czegoś takiego: <?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 )); ?>i tutaj ładujesz get_template_partzapytanie. A jeśli tak, reset postdatato myślę, że moje rozwiązanie będzie działać poprawnie.
Rohit Pande

Odpowiedzi:

5

Będziesz musiał albo zglobalizować $books(jeśli chcesz się trzymać get_template_part()), albo użyć

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

zamiast get_template_part( 'loop', 'books' );. Ten problem jest spowodowany $booksw loop-books.phpjest określony jedynie w zakresie od get_template_part().

Johannes Pille
źródło
2
To. Chociaż jeśli $bookszapytanie jest specyficzne dla loop-books.phppliku części szablonu, polecam po prostu umieszczenie $books = new WP_Query()wywołania w pliku części szablonu.
Chip Bennett
Dzięki. Jaka jest twoja opinia, które z nich jest lepszym rozwiązaniem?
passatgt
To samo, ten sam @Chip - umieściłbym go również w tym samym pliku i przede wszystkim unikałem problemu. Odpowiedział na to, pamiętając, że PO chciał rozdzielić te dwa elementy.
Johannes Pille,
1
@passatgt Jeśli chodzi o to, co jest lepsze, zobacz powyższe komentarze, wolę pójść z jednym plikiem i skończyć z nim. Jeśli musisz je rozdzielić, wybrałbym locate_template()opcję nie zaśmiecania globalnej przestrzeni nazw.
Johannes Pille,
Ok dzięki. Powodem, dla którego chcę je
rozdzielić,
8

Alternatywna metoda: otwórz / zamknij pętlę, a następnie użyj, loop-books.phpaby zawierać tylko znaczniki dla zawartości pętli. na przykład:

<?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;
?>

Następnie w loop-books.php:

<?php the_title(); ?><br/>
Chip Bennett
źródło