$post->ID nu funcționează
Am următorul cod și în timp ce get_the_ID() funcționează, $post->ID nu funcționează, de ce?
$the_query = new WP_Query( array(
'post_type' => 'custompost',
) );
while ( $the_query->have_posts() ) : $the_query->the_post();
echo $post->ID;
endwhile;

Bucla ta WP_Query este incompletă. Nu verifici dacă au fost găsite postări înainte de a parcurge rezultatele, nici nu afișezi un mesaj în cazul în care nu s-au găsit rezultate, și nici nu faci curățenie după utilizare. De asemenea, folosești sintaxa 'other' care rupe potrivirea acoladelor în IDE-uri, făcându-ți viața mai grea.
Încearcă să adaugi global $post;
astfel:
global $post;
$the_query = new WP_Query( array(
'post_type' => 'custompost'
) );
if($the_query->have_posts()){
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo $post->ID;
}
wp_reset_postdata();
}else {
echo 'nicio postare găsită';
}
Când scrii interogări este important să fii consecvent și să faci lucrurile corect. Așadar, recomand să citești aceste slide-uri de la Andrew Nacin, un dezvoltator WordPress Core la Automattic:
http://www.slideshare.net/andrewnacin/you-dont-know-query-wordcamp-netherlands-2012
Acestea îți vor spune unde este potrivit fiecare tip de interogare, cum ar trebui să fie folosite și de ce.
În codul de mai sus, am adăugat o instrucțiune if pentru a verifica dacă au fost returnate postări și am adăugat wp_reset_postdata care îți permite să continui să folosești interogarea principală prin curățarea după bucla personalizată.

Mulțumesc, variabila globală a funcționat. Cum exact funcționează asta? Și ce face exact wp_reset_postdata()
? Este întotdeauna necesară?

Presupun că $post
pur și simplu nu era în scope. Cât despre wp_reset_postdata()
, când începi să rulezi prin bucla ta, variabila $post este modificată, deci wp_reset_postdata() funcționează ca un "undo" pentru asta, permițându-ți să folosești mai multe bucle în cadrul interogării principale fără a o strica.

Ar trebui să consulți aceste slide-uri: http://www.slideshare.net/andrewnacin/you-dont-know-query-wordcamp-netherlands-2012 Sunt un set incredibil de util de slide-uri despre crearea de interogări, realizate de Nacin (unul dintre dezvoltatorii de bază), care explică totul.

Sunt de acord cu totul, cu excepția comentariului despre sintaxa "alternativă". În majoritatea cazurilor, vom afișa HTML în interiorul buclei while, așa că sintaxa "alternativă" este de obicei mai potrivită. Link către documentația pentru sintaxa alternativă, în caz că cineva este interesat - http://php.net/manual/en/control-structures.alternative-syntax.php

Trucul, după cum a identificat Tom Nowell, este să adăugați o referință la global $post
.
Când executați the_query->the_post()
, WordPress încarcă primul rezultat al interogării într-un obiect global $post
. Acesta este modul în care configurează lucrurile pentru toate tag-urile de șablon obișnuite:
the_title()
the_content()
the_excerpt
()- etc ...
Observați că nu trecem nimic în aceste funcții. Doar le apelăm. Fiecare dintre aceste funcții va face referire intern la obiectul global $post
pentru a analiza, pregăti și afișa rezultatul dorit.
În interiorul buclei dvs., apelați the_post()
corect pentru a popula datele, dar nu aveți o referință la datele în sine în domeniul de aplicare al buclei dvs. Dacă doriți să evitați referirea la obiectul global $post
, puteți folosi în schimb get_the_ID()
.
La fel ca celelalte tag-uri de șablon pe care le-am menționat mai sus, get_the_ID()
preia date din obiectul global $post
intern, astfel încât nu trebuie să o faceți singur.
Dar dacă doriți să faceți acest lucru singur, adăugați pur și simplu o referință globală înainte de a încerca să utilizați $post
:
$the_query = new WP_Query( array(
'post_type' => 'custompost',
) );
while ( $the_query->have_posts() ) : $the_query->the_post();
global $post; // Adăugați această linie și sunteți pe linie
echo $post->ID;
endwhile;
Ce este wp_reset_postdata()
?
Dacă construiți mai multe bucle (adică aveți o buclă principală de postări, dar apelați o buclă secundară în interiorul acesteia), puteți apela wp_reset_postdata()
pentru a reseta lucrurile.
Practic, the_post()
va seta obiectul global $post
să conțină datele pentru interogarea solicitată. the_query->the_post()
va suprascrie $post
cu date din the_query
. wp_reset_postdata()
va reseta $post
la interogarea originală.
Deci, dacă utilizați bucle imbricate sau multiple, wp_reset_postdata()
este o modalitate de a reveni la bucla și obiectul $post
pe care l-ați avut disponibil înainte de a apela the_query->the_post()
secundar.
