have_posts / the_post în WordPress

Interogări și bucla WordPress 1.5

Bucla WordPress (The Loop): have_posts() verifică dacă mai sunt articole, the_post() îl pregătește pe următorul.

Sintaxă
if ( have_posts() ) : while ( have_posts() ) : the_post(); ... endwhile; endif;
wp_reset_postdata()

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&#8230;</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&#8230;</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âne true și bucla nu se mai termină.
  • În bucla unui WP_Query propriu chemi have_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 chemat query_posts(); pentru un WP_Query propriu ajunge wp_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.