WordPress.org

Språk: engelska • Franska • Italienska • Loop 日本語 Português do Brasil • Русский • 中文(简体) • 中文(繁體) • (Lägg till ditt språk)

Slingan är PHP-kod som används av WordPress för att visa inlägg. Med hjälp av loopen bearbetar WordPress varje inlägg som ska visas på den aktuella sidan och formaterar det enligt hur det matchar angivna kriterier i Loop-taggarna. Varje HTML-eller PHP-kod i slingan kommer att behandlas på varje inlägg.

när WordPress-dokumentationen säger” den här taggen måste vara i slingan”, till exempel för specifika malltaggar eller plugins, kommer taggen att upprepas för varje inlägg. Till exempel visar slingan följande information som standard för varje inlägg:

  • Titel (the_title ())
  • tid (the_time ())
  • kategorier (The_category ()).

du kan visa annan information om varje inlägg med hjälp av lämpliga malltaggar eller (för avancerade användare) genom att öppna $post-variabeln, som är inställd med det aktuella inläggets information medan slingan körs.

för en nybörjares titt på slingan, se slingan i aktion.

använda slingan

slingan ska placeras i temats index.php och i andra mallar som används för att visa postinformation.

var noga med att inkludera uppmaningen till rubrikmallen högst upp i ditt temas mallar. Om du använder slingan i din egen design (och din egen design inte är en mall), Ställ in WP_USE_THEMES till false:

<?php define( 'WP_USE_THEMES', false ); get_header(); ?>

slingan börjar här:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

och slutar här:

<?php endwhile; else : ?><p><?php esc_html_e( 'Sorry, no posts matched your criteria.' ); ?></p><?php endif; ?>

detta använder PHP: s alternativa syntax för kontrollstrukturer, och kan också uttryckas som:

<?php if ( have_posts() ) {while ( have_posts() ) {the_post(); //// Post Content here//} // end while} // end if?>

Loop exempel

Style inlägg från någon kategori annorlunda

detta exempel visar varje inlägg med sin titel (som används som en länk till inläggets permalänk), kategorier och innehåll. Det gör också att inlägg i en kategori med Kategori ID ’3’ kan utformas annorlunda. För att uppnå detta används malltaggen In_category (). Läs kommentarerna noggrant för att se vad varje del av koden gör.

Obs: all HTML-kod måste vara utanför <?php ?> taggar. Och PHP-kod (även saker så enkla som lockiga hängslen: } ) måste vara inne i <?php ?> taggar. Du kan starta och stoppa block av PHP-kod för att intersperse HTML-kod inom if och else uttalanden, som visas i exemplet ovan.

Uteslut inlägg från någon kategori

det här exemplet visar hur du döljer en viss kategori eller kategorier från att visas. I detta fall är inlägg från kategorierna 3 och 8 uteslutna. Exemplet är annorlunda än exemplet ovan genom att det gör en ändring av själva frågan.

Obs: Om du använder det här exemplet för din huvudsida bör du använda en annan mall för dina Kategoriarkiv; annars kommer WordPress att utesluta alla inlägg i kategori 3 och kategori 8, även när du tittar på det Kategoriarkivet! Om du vill använda samma mallfil kan du dock undvika detta genom att använda is_home () – taggen för att säkerställa att inlägg från kategori 3 och kategori 8 endast utesluts från huvudsidan:

...<?php if ( is_home() ) {$query = new WP_Query( 'cat=-3,-8' );if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); } else {...?>...

det finns andra villkorliga taggar som kan användas för att styra utdata beroende på om ett visst villkor är sant med avseende på den begärda sidan.

objektorientering

loopar är en kombination av objektorienterat och globalt beteende. Detta är förvirrande först.

de två viktiga globala variablerna för loopar är:

  • $wp_query som är ett objekt av klass WP_Query, håller ett WP-databasfråga resultat bland vilka $wp_query – > inlägg, en rad enskilda WP_Posts.
  • $post som är det aktuella objektet i klassen WP_Post

kom ihåg: alla malltaggar är beroende av $post global-variabeln som standard och $post global-variabeln är inställd/modifierad av the_post(), som får sina data från $wp_query global-variabeln. $post är också inställd / modifierad av WP_Query::the_post() som används i sekundära slingor.

flera slingor

detta avsnitt behandlar avancerad användning av slingan. Det är lite tekniskt, men låt inte det skrämma dig. Vi börjar med ett enkelt exempel och arbetar därifrån. Med lite sunt förnuft, tålamod och entusiasm kan du också göra flera slingor.

först och främst, varför skulle man vilja använda flera slingor? I allmänhet är svaret att du kanske vill göra något med en grupp inlägg och göra något annat än en annan grupp inlägg, men visa båda grupperna på samma sida. ”Något” kan betyda nästan vad som helst; du är bara begränsad av din PHP-skicklighet och din fantasi.

vi kommer att få In exempel nedan, men först bör du läsa om grunderna. Ta en titt på den grundläggande slingan. Den består av:

<?php if ( have_posts() ) : ?><?php while ( have_posts() ) : the_post(); ?> <!-- do stuff ... --><?php endwhile; ?><?php endif; ?>

lite åt sidan på Do stuff: i det här exemplet är det helt enkelt en platshållare för en massa kod som bestämmer hur man formaterar och visar varje inlägg på en sida. Denna kod kan ändras beroende på hur du vill att din WordPress ska se ut. Om du tittar på Kubrick-temat index.php avsnittet do stuff skulle vara allt nedan:

<?php while ( have_posts() ) : the_post(); ?>

till ovan:

<?php comments_popup_link( 'No Comments "', '1 Comment "', '% Comments "' ); ?>

en förklaring till kodarna där ute:have_posts() och the_post() är bekvämlighetsförpackningar runt det globala $wp_query-objektet, vilket är där all åtgärd är. $Wp_query kallas i blogghuvudet och fed-frågeargumenten som kommer in genom GET och PATH_INFO. $Wp_query tar argumenten och bygger och kör en DB-fråga som resulterar i en rad inlägg. Denna array lagras i objektet och returneras också tillbaka till blogghuvudet där den är fylld i Global $posts-arrayen (för bakåtkompatibilitet med gamla postloopar).

när WordPress har slutat ladda blogghuvudet och faller ner i mallen kommer vi fram till vår Postslinga. Have_posts() ringer helt enkelt till $wp_query->have_posts () som kontrollerar en loopräknare för att se om det finns några inlägg kvar i postmatrisen. Och the_post() kallar $wp_query – > the_post () som avancerar loopräknaren och ställer in den globala $post-variabeln samt alla globala postdata. När vi har uttömt slingan kommer have_posts() att returnera false och vi är klara.

Loop exempel

nedan är tre exempel på att använda flera slingor. Nyckeln till att använda flera slingor är att $wp_query bara kan ringas en gång. För att komma runt detta är det möjligt att återanvända frågan genom att ringa rewind_posts() eller genom att skapa ett nytt frågeobjekt. Detta behandlas i Exempel 1. I Exempel 2 täcks en variabel för att lagra resultaten av en fråga. Slutligen,’ multiple loops in action ’ samlar en massa ideer för att dokumentera ett sätt att använda flera loopar för att marknadsföra inlägg av en viss kategori på din bloggs hemsida.

flera slingor exempel 1

för att slinga genom samma fråga en andra gång, Ring rewind_posts(). Detta återställer slingräknaren och låter dig göra en annan slinga.

<?php rewind_posts(); ?> <?php while ( have_posts() ) : the_post(); ?><!-- Do stuff... --><?php endwhile; ?>

om du är klar med inläggen i den ursprungliga frågan, och du vill använda en annan fråga, kan du återanvända $wp_query-objektet genom att ringa query_posts() och sedan looping tillbaka igenom. Den query_posts () kommer att utföra en ny fråga, bygga en ny inlägg array, och återställa loop räknaren.

om du behöver behålla den ursprungliga frågan kan du skapa ett nytt frågeobjekt.

flera slingor exempel 2

en annan version av att använda flera slingor tar en annan tack för att komma runt oförmågan att använda have_posts() och the_post(). För att lösa detta måste du lagra den ursprungliga frågan i en variabel och sedan tilldela den med den andra slingan. På så sätt kan du använda alla standardfunktioner som är beroende av alla globaler.

till exempel:

Obs: i PHP 5 refereras objekt med operatören ”= clone” istället för ”=” som i PHP 4. För att få exempel 2 att fungera i PHP 5 måste du använda följande kod:

detta andra exempel fungerar dock inte i WordPress 2.1.

flera slingor i aktion

det bästa sättet att förstå hur man använder flera slingor är att faktiskt visa ett exempel på dess användning. Kanske är den vanligaste användningen av flera slingor att visa två (eller flera) listor med inlägg på en sida. Detta görs ofta när en webmaster vill presentera inte bara det allra senaste inlägget skrivet, men också inlägg från en viss kategori.

lämna alla formaterings-och CSS-problem åt sidan, låt oss anta att vi vill ha två listor med inlägg. En som skulle lista de senaste inläggen (standard 10 inlägg senast tillagda), och en annan som bara skulle innehålla ett inlägg från kategorin ’featured’. Inlägg i kategorin ’utvalda’ ska visas först, följt av den andra listan över inlägg (standarden). Fångsten är att inget inlägg ska visas i båda kategorierna.

Steg 1. Få bara ett inlägg från kategorin ’featured’.

på engelska ovanstående kod skulle läsa:

ange $my_query lika med resultatet av att fråga alla inlägg där kategorin heter presenterad och förresten, få mig bara ett inlägg. Ställ också in variabeln $do_not_duplicate lika med ID-numret för det enskilda inlägget som returneras. Kom ihåg att raden Do stuff representerar alla formateringsalternativ som är associerade för inlägget som hämtats.

Observera att vi behöver värdet $do_not_duplicate i nästa steg för att säkerställa att samma inlägg inte visas i båda listorna.

steg 2. Den andra slingan, få X Senaste inläggen (utom en).

följande kod får x senaste inlägg (enligt definitionen i WordPress-inställningar) spara den som redan visas från den första slingan och visar dem enligt göra saker.

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); if ( $post->ID == $do_not_duplicate ) continue;?><!-- Do stuff... --><?php endwhile; endif; ?>

på engelska ovanstående kod skulle läsa:

få alla inlägg, där ett inlägg är lika med $do_not_duplicate, gör bara ingenting (fortsätt), annars visa alla andra inlägg enligt göra saker. Uppdatera också cachen så att taggnings-och nyckelordspluginerna spelar bra. Minns, $ do_not_duplicate variabel innehåller ID för inlägget som redan visas.

slutresultatet

så här ser den slutliga koden ut utan någon formatering:

slutresultatet skulle vara en sida med två listor. Den första listan innehåller bara ett inlägg-det senaste inlägget från kategorin ’funktion’. Den andra listan innehåller x senaste inlägg (enligt definitionen i WordPress-inställningar) förutom inlägget som redan visas i den första listan. Så när funktionsposten har ersatts med en ny visas den tidigare funktionen i standardpostlistan nedan (beroende på hur många inlägg du väljer att visa och på postfrekvensen). Denna teknik (eller liknande) har använts av många i samband med kunskap om Mallhierarkin för att skapa ett annat utseende för hemmet.php och index.php. Se tillhörande resurser längst ner på denna sida.

Obs För flera inlägg i den första kategorin

om posts_per_page=2 eller mer, måste du ändra koden lite. Variabeln $ do_not_duplicate måste ändras till en array i motsats till ett enda värde. Annars kommer den första slingan att slutföras och variabeln $do_not_duplicate motsvarar endast id för det senaste inlägget. Detta kommer att resultera i duplicerade inlägg i den andra slingan. För att åtgärda problemet ersätt

med

Observera att ”posts_per_page” kan vara vilket nummer som helst.Detta ändrar $do_not_duplicate i en array. Ersätt sedan

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); if ( $post->ID == $do_not_duplicate ) continue; ?>

med

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); if ( in_array( $post->ID, $do_not_duplicate ) ) continue; ?>

där du fortsätter mönstret för vilken posts_per_page som är lika med (2 i det här fallet).

Alternativt kan du skicka hela $ do_not_duplicate array till $wp_query och endast poster som matchar dina kriterier kommer att returneras:

<?php query_posts( array( 'post__not_in' => $do_not_duplicate ) );if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 

Observera att i stället för en sträng var frågeparametern en associativ array som ställde in alternativet post__not_in.

Nested Loops

Nesting loops betyder att du kör en andra slinga innan du avslutar den första. Detta kan vara användbart för att visa en postlista med en kortkod till exempel.

$my_query = new WP_Query( 'cat=3' );if ( $my_query->have_posts() ) { while ( $my_query->have_posts() ) { $my_query->the_post();the_content();}}wp_reset_postdata();

det är nödvändigt att återställa huvudslingdata efter en kapslad slinga så att vissa globala variabler håller rätt värden igen.

källor

avsnittet om flera slingor är en kombination av Ryan Boren och Alex Kings diskussion om slingan på Hackers e-postlista. Exemplet nested loops inspirerades av en annan diskussion på e-postlistan och ett inlägg av Nicolas Kuttler.

resurser

  • WordPress WP_Query Generator
  • komma in i slingan – (bilder) en introduktion till hur plugins och teman kan ändra slingan
  • WordPress Anpassad slinga
  • WordPress WP_Query Loop Generator

relaterad

för att lära dig mer om WordPress-slingan och de olika Malltaggarna som bara fungerar i slingan, här är fler resurser:

mer om slingan

  • artikel: slingan i aktion
  • artikel: malltaggar
  • artikel: Använda slingan i mallfiler

artiklar

  • artikel: slingan – en grundläggande översikt över dess användning av frågan i WordPress loop.
  • artikel: Frågeöversikt – förklaring av hur man bestämmer vilka frågor som genererar WordPress.
  • artikel: anpassa frågor via Krok
  • artikel: Visa artiklar MYSQL-fråga med anpassad
  • artikel: Bygg avancerade frågor på taxonomier
  • artikel: Bygg Anpassad fråga med Offset och pagination

Koddokumentation

  • klass: WP_Query – detaljerad översikt över klass WP_Query
  • klass: Wp_comment_query – klass för kommentarsrelaterade frågor
  • klass: WP_User_Query-klass för användarrelaterade frågor
  • objekt: $wpdb – översikt över användningen av $wpdb-objektet
  • funktion: set_query_var()
  • funktion: Get_query_var()
  • funktion: Query_posts () – skapa ytterligare Anpassad fråga
  • funktion: Get_post () – ta ett ID för ett objekt och returnera posterna i databasen för den artikeln
  • funktion: get_posts() – en specialiserad funktion som returnerar en rad objekt
  • funktion: get_pages() – en specialiserad funktion som returnerar en rad sidor
  • funktion: have_posts() – ett villkor som avgör om frågan returnerade en artikel
  • funktion: the_post() – används för att automatiskt ställa in slingan efter en fråga
  • funktion: rewind_posts() – rensar den aktuella slingan
  • funktion: setup_postdata() – ställer in data för ett enda frågeresultat i en slinga
  • funktion: wp_reset_postdata() – återställer föregående fråga (vanligtvis efter en slinga i en annan slinga)
  • funktion: wp_reset_query()
  • funktion: is_main_query() – säkerställer att frågan som ändras endast är huvudfrågan
  • Action Hook: pre_get_posts – ändra WordPress – frågor innan de körs
  • action hook: the_post – ändra postobjektet efter fråga
  • filterkrok: found_posts-ändrar värdet på objektet found_posts WP_Query
den här artikeln är markerad som i behov av redigering. Du kan hjälpa Codex genom att redigera den.

You might also like

Lämna ett svar

Din e-postadress kommer inte publiceras.