Wie benutze ich get_template_part ()?


25

Könnte mir bitte jemand erklären, wie diese Funktion funktioniert? Ich weiß, was es macht, aber wenn ich mir den Quellcode in der Vorlage twenty_ten ansehe, verstehe ich nicht, wie alle Loops in einer einzigen loop.php gesammelt werden (ich habe diese Datei auch gesehen).

Wie kann man beispielsweise einen bestimmten gemeinsamen Teil einer Vorlage abstrahieren und dann für andere Vorlagen wiederverwenden?


Antworten:


25

Einige sehr gute einleitende Antworten hier.

Grundsätzlich get_template_part()können Theme-Entwickler eine Reihenfolge für die Spezifität von Vorlagendateien festlegen. Betrachten Sie es ähnlich wie die Spezifität von CSS-Selektoren. Wenn Sie etwas entwerfen, möchten Sie mit einem Minimum an Spezifität beginnen, damit es in Teilen eines Designs, die individuelle Aufmerksamkeit erfordern, leicht überschrieben werden kann.

Sie gestalten beispielsweise ein Blog und erstellen eine loop.php- Datei, die sich gut zum Markieren von Posts eignet . Sie planen jedoch im Voraus und rufen es später in Ihren Vorlagendateien mit zusätzlichen Kontextspezifizierern auf. Auf der Indexseite rufen Sie beispielsweise auf get_template_part( 'loop', 'index' );, auf der einzelnen Vorlage rufen Sie auf get_template_part( 'loop', 'single' );, auf Archivseiten rufen Sie auf get_template_part( 'loop', 'archive' );und so weiter. Dies macht es sehr einfach, wenn Sie sich entscheiden, die Schleife auf Ihren Archivseiten anders als auf der Startseite zu markieren: Erstellen Sie einfach ein loop-archive.php- Template und es wird anstelle der generischen loop.php verwendet .

Die Magie dahinter steckt get_template_part()jedoch in der Funktion locate_template(), die zuerst das Themenverzeichnis und dann das übergeordnete Verzeichnis (falls vorhanden) für die genannte Datei überprüft. Dies ist sehr nützlich für die Plugin-Entwicklung. In einem meiner Plugins definiere ich einen benutzerdefinierten Beitragstyp und erstelle eine Loop-Vorlagendatei für diesen benutzerdefinierten Beitragstyp in meinem Plugin-Verzeichnis. Aber ... ich möchte zulassen, dass Themen, die mein Plugin verwenden, mein Markup überschreiben, wenn sie dies wünschen. Hier wirken sich locate_template()wirklich Wunder aus.

locate_template($template_names, $load = false, $require_once = true )

sucht nach jedem Namen im Array $ template_names im Stylesheet-Verzeichnis und dann im Vorlagenverzeichnis. Die Übergabe von 'true' als $ load-Argument bedeutet, dass die erste gefundene Datei erforderlich ist und eine leere Zeichenfolge zurückgegeben wird, wenn keine Vorlagendatei gefunden wurde. Also kann ich so etwas in meinem Plugin machen:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... was es den Theme-Entwicklern hoffentlich sehr leicht machen sollte, mein Plugin anzupassen, indem sie eine Datei namens loop-mycustomposttype.php in ihr Theme aufnehmen.


2
Ersetzen Sie locate_template dadurch, bitte. include(locate_template( 'loop-mycustomposttype.php')) Auf diese Weise können Variablen übergeben werden. Ich habe diesen Link hier gefunden . Es ist sehr nützlich!
Pablo SG Pacheco

1
Andernfalls ist es erforderlich, dies zu ändern. Soif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco

1
Oh, guter Punkt. Mit der angegebenen Formel befindet sich der Aufruf requireoder require_once(von locate_template) in einer Funktion und hat daher keinen Zugriff auf den aktuellen Gültigkeitsbereich.
Goldenapples

5

Nicht alle Schleifen, die Hauptschleife. ;-) Egal, ob du deine Startseite oder eine Kategorie ansiehst oder was auch immer, du hast immer eine Hauptschleife. Der Inhalt dieser Hauptschleife wird durch die Abfrage bestimmt, die ausgeführt wurde, bevor Ihre Vorlage überhaupt aufgerufen wurde.

Die loop.php-Vorlage durchläuft lediglich die Elemente in der Schleife und formatiert sie. Siehe die Dokumentation im Codex .

Wenn Sie sich die loop.php von Twenty-Ten ansehen, können Sie sehen, dass Twenty-Ten sich dann innerhalb dieser einzelnen Vorlagendatei diversifiziert .

get_template_part()Lädt lediglich ein Template-Teil und durchläuft es. Genauso gut können Sie Teile Ihrer loop.php in separate Dateien extrahieren und durch a get_template_part('loop', 'category')usw. ersetzen .

Oder Sie könnten eine Teilvorlage für jeden einzelnen Beitrag in der Schleife haben und Ihre loop.php nur get_template_part('loop','post');innerhalb der while...Klausel aufrufen . Ganz Dir überlassen.


3

Aus dem Codex get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

Führt ein PHP-Require () für die erste Datei aus, die existiert ...

So effektiv wird es funktionieren, als ob Sie eine andere PHP-Datei benötigen würden.

Update : Es gibt einen kleinen Unterschied zu 'require' - Es ist in eine Funktion eingebunden, so dass Sie dies tun müssen, globalwenn Sie Variablen aus Ihrer Vorlage an Ihren Vorlagenteil übergeben möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.