Kan någon snälla förklara för mig hur den här funktionen fungerar? Jag vet vad det gör, men när jag tittar på källkoden i mallen tjugo_ten, förstår jag inte hur alla slingor samlas i en enda loop.php (jag såg den filen också).
Så hur kan man till exempel ta bort en viss gemensam del av mallen och sedan återanvända den över andra mallar?
Kommentarer
- Försök titta på codex.wordpress.org/Function_Reference/get_template_part
Svar
Några väldigt bra introduktionssvar här.
I grund och botten tillåter get_template_part()
temautvecklare att ställa in en specificitetsordning för mallfiler. Tänk på det på samma sätt specificitet som den gäller för CSS-väljare. När du utformar något vill du börja med ett minimum av specificitet så att det lätt kan åsidosättas i delar av en design som behöver individuell uppmärksamhet.
Så till exempel , du utformar en blogg och skapar en loop .php -fil som fungerar bra för att markera inlägg. Men du planerar framåt och du kallar det i dina mallfiler senare med ytterligare sammanhangsspecifikationer – säg, på indexsidan ringer du get_template_part( "loop", "index" );
, på den enskilda mallen ringer du get_template_part( "loop", "single" );
, på arkivsidor ringer du get_template_part( "loop", "archive" );
och så vidare. Detta gör det väldigt enkelt på vägen när du bestämmer dig för att markera slingan på dina arkivsidor annorlunda än hemsidan: skapa bara en loop-archive.php -mallen och den kommer att användas snarare än den generiska loop.php .
Men magin bakom get_template_part()
finns i funktionen locate_template()
, som först kontrollerar temakatalogen och sedan överordnad katalogen (om en finns) för den fil som heter. Detta är mycket användbart för pluginutveckling. I ett av mina plugins definierar jag en anpassad posttyp och skapade en loopmallfil för den anpassade posttypen i min plugin-katalog. Men … Jag vill för att låta teman som använder mitt plugin åsidosätta min markering om de väljer. Det är här locate_template()
verkligen gör underverk.
locate_template($template_names, $load = false, $require_once = true )
letar efter vart och ett av namnen i arrayen $ template_names i formatmallens katalog, sedan i temp sen katalog. Att skicka ”true” som $ load-argument betyder att det kräver den första filen som hittades och returnerar en tom sträng om ingen mallfil hittades. Så jag kan göra något liknande i mitt plugin:
if ( "" === locate_template( "loop-mycustomposttype.php", true, false ) ) include( "loop-mycustomposttype.php" );
… vilket förhoppningsvis skulle göra det väldigt enkelt för temautvecklare att anpassa mitt plugin bara genom att inkludera en fil som heter loop-mycustomposttype.php i deras tema.
Kommentarer
- Ersätt lokaliseringsmall med detta tack.
include(locate_template( 'loop-mycustomposttype.php'))
Detta sätt är möjligt att skicka variabler. Jag ' har hittat det här länk . Det ' är extremt användbart! - Om du gör det ' kommer det att bli nödvändigt att ändra detta om också. Gilla det här
if ( false === include(locate_template( 'loop-mycustomposttype.php')) )
- Åh, bra punkt. Med den formel jag gav är
require
ellerrequire_once
samtalet (frånlocate_template
) en funktion och så har ' inte tillgång till det aktuella omfånget.
Svar
Inte alla slingor, huvudslingan. 😉 Oavsett om du tittar på din förstasida eller en kategori eller som vet vad, kommer du alltid att ha en huvudslinga. Innehållet i den huvudslingan bestäms av frågan som har körts innan din mall blev kallad alls.
Loop.php-mallen körs bara över objekten i slingan och formaterar dem. Se dokumentationen på Codex .
Om du tittar på Twenty-Tens loop.php kan du se att Twenty-Ten diversifierar sedan inom den enskilda mallfilen.
get_template_part()
laddar bara en malldel och går igenom den. Du kan lika gärna extrahera delar av din loop.php i separata filer och ersätt dem med en get_template_part("loop", "category")
och så vidare samtal.
Eller så kan du ha en delmall för varje enskilt inlägg i slingan och låt din loop.php bara ringa get_template_part("loop","post");
inom while...
-satsen. Allt upp till dig.
Svar
Från get_template_part codex :
<?php get_template_part( "loop", "index" ); ?>
gör ett PHP-krav () för den första filen som finns …
Så effektivt fungerar det som om du skulle behöva en annan php-fil.
Uppdatera : Det är en liten skillnad att ”kräva” – Den är insvept i en funktion så du måste global
om du vill överföra variabler från din mall till din malldel.