Utilizarea unui WP_Query personalizat cu bucla get_template_part

27 nov. 2012, 14:37:42
Vizualizări: 13.7K
Voturi: 11

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.

3
Comentarii

încearcă să elimini $books-> din loop-books.php și sper că va funcționa.

Rohit Pande Rohit Pande
27 nov. 2012 14:42:44

Dacă elimin partea cu $books-> va folosi o interogare implicită, deci asta nu e bun pentru mine.

passatgt passatgt
27 nov. 2012 14:45:02

dacă folosești ceva de genul:

<?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 aici încarci get_template_part query. Și după aceea dacă faci reset postdata atunci cred că soluția mea va funcționa corect.

Rohit Pande Rohit Pande
27 nov. 2012 14:48:19
Toate răspunsurile la întrebare 2
0

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/>
27 nov. 2012 15:17:22
6

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().

27 nov. 2012 14:55:32
Comentarii

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.

Chip Bennett Chip Bennett
27 nov. 2012 14:56:51

Mulțumesc. Care crezi că este soluția mai bună?

passatgt passatgt
27 nov. 2012 14:57:01

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.

Johannes Pille Johannes Pille
27 nov. 2012 15:00:00

@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.

Johannes Pille Johannes Pille
27 nov. 2012 15:01:19

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.

passatgt passatgt
27 nov. 2012 15:06:25

De ce nu transmiți acele alte taxonomii ca variabile către array-ul de argumente al interogării? (Cum faci asta ar depinde de contextul/implementarea specifică, dar ar fi cu siguranță mai curat decât să pui întreaga interogare în global.)

Chip Bennett Chip Bennett
27 nov. 2012 15:14:08
Arată celelalte 1 comentarii