Som jag skisserade i introduktionen till denna serie, WP_Query
klassen har fyra huvuddelar:
I denna handledning visar jag dig hur du använder slingan med WP_Query
, inklusive de två viktigaste sätten att strukturera din slinga och hur man använder flera slingor.
Utan en slinga visas ingenting på din sida. Efter att WordPress har kört frågan med hjälp av de argument du har definierat, behöver den sedan få veta vad som ska matas ut från de uppgifter som den hämtats. Det är här slingan kommer in.
Så slingan kommer efter din fråga, och den använder tre taggar:
om ($ query-> har_posts ())
kontrollerar om det finns några inlägg.medan ($ query-> har_posts ())
upprepar slingan för varje inlägg så länge som det finns inlägg att hämta.($ Query-> the_post)
får tillgång till det specifika inlägget.Så här är slingan som passar in i WP_Query
klass:
have_posts ()) // Starta looping över sökresultatet. medan ($ query-> have_posts ()) $ query-> the_post (); // Innehållet i de efterfrågade postresultaten går här. // Återställ ursprungliga postdata. wp_reset_postdata (); ?>
Efter att ha kört slingan är allt som är kvar att göra snygga saker att använda wp_reset_postdata ()
.
Hur din slinga är strukturerad beror på vilken data du vill visa från ditt inlägg. Här är en exempelslinga som matar ut titeln, den utvalda bilden och ett utdrag. Du skulle använda en slinga så här på en arkivsida.
have_posts ()) // Starta looping över sökresultatet. medan ($ query-> have_posts ()) $ query-> the_post (); ?>> "title =""> "title ="">
Den här slingan visar exakt vad jag har beskrivit ovan: den utvalda bilden, titeln och utdraget.
Men ibland kanske du vill lägga till en rubrik före din lista med inlägg, eller kanske du vill bifoga dem alla i ett innehållsinnehåll. Om du helt enkelt lagt till detta före din loop, skulle det bli utmatat oavsett om frågan faktiskt returnerade några data, vilket innebär att du kan ha en rubrik med ingenting under den eller någon onödig markup.
Det här är väldigt lätt att komma runt genom att placera det inneslutande elementet eller rubriken inuti din om
märka:
have_posts ()) echo ''; eko " '. __ ('Rubrik', 'tutsplus'). '
'; // Starta looping över sökresultatet. medan ($ query-> have_posts ()) $ query-> the_post (); ?>> "title =""> "title =""> '; // Återställ ursprungliga postdata. wp_reset_postdata (); ?>
Här kan du se att jag har kontrollerat om det finns några inlägg som hämtas av min fråga och om det finns jag har öppnat ett innehållsinnehåll och lagt till en rubrik.
Det här är också användbart om du vill skriva ut resultatet av din fråga som en lista. Låt oss säga att jag vill skapa en lista över alla inlägg i en viss kategori. De ul
Elementet är inte inuti min slinga eftersom det inte hänför sig till ett specifikt inlägg, men jag vill bara utmata det om det finns inlägg. Så jag använder det här:
"kategori-slug", "post_type" => "inlägg"); // Anpassad fråga. $ query = nytt WP_Query ($ args); // Kontrollera att vi har sökresultat. om ($ query-> have_posts ()) echo '
Detta kontrollerar om frågan har hämtat några inlägg, och i så fall öppnar den ul
element och kör sedan slingan.
Det är viktigt att vara medveten om att medan du kan använda WP_Query
att köra mer än en slinga måste du återställa postdata och starta en andra instans av WP_Query
att göra detta. Detta beror på att var och en av dina slingor kommer att mata ut data baserat på olika argument.
I det här exemplet visas utdraget och den utvalda bilden för det första inlägget och sedan bara titeln på varje efterföljande inlägg:
'inlägg', 'posts_per_page' => '1'); // Första anpassade frågan. $ query1 = nytt WP_Query ($ args1); // Kontrollera att vi har sökresultat. om ($ query1-> have_posts ()) // Starta looping över sökresultatet. medan ($ query1-> har_posts ()) $ query1-> the_post (); ?>> "title =""> "title =""> '1', 'post_type' => 'inlägg'); // Andra anpassade frågan. $ query2 = nytt WP_Query ($ args2); // Kontrollera att vi har sökresultat. om ($ query2-> have_posts ()) echo '
Jag har använt två viktiga argument här:
'posts_per_page' => '1'
, används med den första frågan, utmatar bara det senaste inlägget.'offset' = '1'
, som används med den andra frågan, hoppar över det första inlägget och ser till att det inte upprepas i listan nedan.ul
element och omsluter varje posttitel i en li
element och en länk till sidan.Du märker också att jag använde wp_reset_postdata ()
efter båda looparna. Om jag inte hade gjort det här skulle andra slingan fortfarande ge data från den första.
Utan en slinga, WP_Query
gör inte riktigt mycket. Slingan är koden som du använder för att visa de data som WordPress har hämtat från databasen baserat på dina sökargument.
Som jag har visat, finns det några variationer på slingan. En enkel slinga kommer bara att mata ut alla inlägg i den ordning du har angett i dina sökargument (eller efter datum i fallande ordning som standard). Om du separerar om ($ query-> har_posts ())
och medan ($ query-> har_posts ())
, Du kan lägga till ytterligare markering utanför din slinga, men endast om din fråga har returnerat data. Och slutligen, genom att ange alternativa argument och använda wp_reset_postdata ()
efter varje slinga kan du använda WP_Query
mer än en gång för att skapa flera loopar på din sida.