Utilizarea unui WP_Query personalizat cu bucla get_template_part
Am o interogare pentru un tip personalizat de postare:
<?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 vreau să parcurg aceste postări folosind loop-books.php:
<?php get_template_part( 'loop', 'books' ); ?>
În interiorul loop-books.php am acest cod, similar cu loop.php obișnuit, doar că am modificat funcțiile have_posts și the_post să lucreze cu interogarea $books:
<?php if ( $books->have_posts() ) : ?>
<?php while ($books->have_posts()) : $books->the_post(); ?>
<?php the_title(); ?><br/>
<?php endwhile; ?>
<?php endif; ?>
Dar după aceasta, primesc o eroare PHP:
Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1
Se pare că variabila $books nu este disponibilă în interiorul funcției get_template_part. Cum pot rezolva această problemă? Dacă pun interogarea $books în interiorul loop-books.php funcționează corect, dar vreau să le separ.

O metodă alternativă: deschideți/închideți bucla, apoi folosiți loop-books.php
pentru a conține doar markup-ul pentru conținutul buclei. De exemplu:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Interogare pentru cărți
$books = new WP_Query(array(
'post_type' => 'wiki',
'posts_per_page' => '50',
'paged' => $paged
));
// Deschide bucla pentru cărți
if ( $books->have_posts() ) :
while ($books->have_posts()) : $books->the_post();
// Obține markup-ul buclei
get_template_part( 'loop', 'books' );
// Închide bucla pentru cărți
endwhile;
endif;
?>
Apoi, în interiorul fișierului loop-books.php
:
<?php the_title(); ?><br/>

Va trebui fie să globalizați variabila $books
(dacă doriți să rămâneți la get_template_part()
), fie să utilizați
require( locate_template( 'loop-books.php' ) );
în loc de get_template_part( 'loop', 'books' );
. Această problemă apare deoarece $books
din loop-books.php
este definită doar în domeniul de aplicare al funcției get_template_part()
.

Asta. Totuși, dacă interogarea $books
este specifică fișierului de template-part loop-books.php
, aș recomanda să plasați apelul $books = new WP_Query()
direct în fișierul de template-part.

La fel, la fel @Chip - aș pune-o și eu în același fișier și aș evita problema de la bun început. Am răspuns ținând cont că OP dorea să le separe.

@passatgt În ceea ce privește care este mai bună opțiune, vezi comentariile de mai sus, aș prefera să merg pe varianta cu un singur fișier și să termin cu asta. Dacă trebuie neapărat să le separi, aș opta pentru varianta locate_template()
, pentru a nu încărca namespace-ul global.

Ok, mulțumesc. Motivul pentru care vreau să le separ este pentru că vreau să folosesc același loop și pentru alte interogări bazate pe alte categorii/taxonomii.
