Ce face have_posts / the_post
Bucla (The Loop) este codul din șabloanele temei care afișează articolele găsite de interogarea paginii. have_posts() întoarce true cât timp mai sunt articole, iar the_post() trece la următorul și îl face „articolul curent”: setează variabila globală $post și datele folosite de funcții ca the_title(), the_content(), the_permalink().
Ambele funcții lucrează pe interogarea principală ($wp_query). Pentru o listă proprie creată cu new WP_Query() folosești metodele obiectului: $q->have_posts() și $q->the_post(). La prima apelare, the_post() declanșează acțiunea loop_start.
wp_reset_postdata() (din WordPress 3.0) readuce $post la articolul curent al interogării principale după o buclă secundară. Nu schimbă interogarea; wp_reset_query() se folosește doar după query_posts().
Parametri
| Parametru | Descriere |
|---|---|
have_posts() |
Fără parametri. Întoarce true dacă mai sunt articole în buclă și false la final. |
the_post() |
Fără parametri. Avansează la următorul articol și pregătește datele lui globale. |
wp_reset_postdata() |
Fără parametri. Restabilește $post la interogarea principală după o buclă secundară. |
Ce returnează
have_posts() întoarce bool; the_post() și wp_reset_postdata() nu întorc nimic.
Exemple
Exemplul 1: Bucla clasică din index.php
Ramura else afișează un mesaj când interogarea nu găsește nimic (de exemplu o căutare fără rezultate).
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php else : ?>
<p>Nu am găsit articole.</p>
<?php endif; ?>
Ce afișează pagina
<article id="post-42">
<h2><a href="https://exemplu.ro/meniu-de-toamna/">Meniu de toamnă la Cafenea Iași</a></h2>
<p>Am pregătit plăcinte cu dovleac și ceai de tei…</p>
</article>
<article id="post-37">
<h2><a href="https://exemplu.ro/program-nou/">Program nou de weekend</a></h2>
<p>Sâmbăta și duminica deschidem de la ora 9…</p>
</article>
Exemplul 2: Buclă secundară sub articol
Lista „Mai citește” are propria interogare; după ea, wp_reset_postdata() face ca restul șablonului (comentariile) să lucreze din nou cu articolul afișat.
<?php
$altele = new WP_Query( array(
'posts_per_page' => 2,
'post__not_in' => array( get_the_ID() ),
) );
if ( $altele->have_posts() ) {
echo '<h3>Mai citește</h3><ul>';
while ( $altele->have_posts() ) {
$altele->the_post();
echo '<li>' . esc_html( get_the_title() ) . '</li>';
}
echo '</ul>';
}
wp_reset_postdata();
comments_template();
Ce afișează pagina
<h3>Mai citește</h3><ul><li>Program nou de weekend</li><li>Concert în Parcul Copou</li></ul>
Greșeli frecvente
- Scrii
while ( have_posts() )fărăthe_post()în interior: indexul nu avansează,have_posts()rămânetrueși bucla nu se mai termină. - În bucla unui
WP_Querypropriu chemihave_posts()/the_post()fără$q->: parcurgi interogarea principală, nu lista ta. - Uiți
wp_reset_postdata()după bucla secundară: comentariile, câmpurile și titlul de după aparțin ultimului articol din listă. - Folosești
wp_reset_query()deși nu ai chematquery_posts(); pentru unWP_Querypropriu ajungewp_reset_postdata().
Comenzi înrudite
WP_Query: Clasa care interoghează articole, pagini și tipuri personalizate după criterii: tip, categorie, câmpuri, ordine, paginare.get_posts: Întoarce un tablou de articole după aceleași argumente ca WP_Query, fără să atingă bucla principală.get_the_title: get_the_title() întoarce titlul unui articol; the_title() îl afișează direct în buclă, cu text opțional înainte și după.get_permalink: get_permalink() întoarce adresa permanentă a unui articol sau a unei pagini; the_permalink() o afișează escapată.get_template_part: Încarcă o bucată de șablon din temă (de exemplu template-parts/card-produs.php), cu prioritate pentru tema copil.