Jak korzystać z get_template_part ()?

25

Czy ktoś mógłby mi wyjaśnić, jak działa ta funkcja? Wiem, co robi, ale kiedy patrzę na kod źródłowy w szablonie twenty_ten, nie rozumiem, jak wszystkie pętle są gromadzone w jednym loop.php (też widziałem ten plik).

Jak na przykład wyodrębnić pewną wspólną część szablonu, a następnie użyć go ponownie w innych szablonach?

Amit Erandole
źródło

Odpowiedzi:

25

Kilka bardzo dobrych wstępnych odpowiedzi tutaj.

Zasadniczo get_template_part()umożliwia twórcom motywów ustawienie kolejności specyficzności plików szablonów. Pomyśl o tym podobnie do specyficzności, ponieważ dotyczy selektorów CSS. Projektując coś, chcesz zacząć od absolutnego minimum specyficzności, aby można go było łatwo zastąpić w częściach projektu, które wymagają indywidualnej uwagi.

Na przykład projektujesz bloga i tworzysz plik loop.php , który działa dobrze do oznaczania postów. Ale planujesz z wyprzedzeniem i wywołujesz go później w plikach szablonów z dodatkowymi specyfikacjami kontekstu - powiedzmy, na stronie indeksu, dzwonisz get_template_part( 'loop', 'index' );, na jednym szablonie, dzwonisz get_template_part( 'loop', 'single' );, na stronach archiwum, dzwonisz get_template_part( 'loop', 'archive' );i tak dalej. Ułatwia to późniejszą drogę, gdy zdecydujesz się oznaczyć pętlę na swoich stronach archiwalnych inaczej niż na stronie głównej: po prostu utwórz szablon loop-archive.php i będzie on używany zamiast ogólnej pętli.php .

Ale magia get_template_part()tkwi w funkcji locate_template(), która najpierw sprawdza katalog motywów, a następnie katalog macierzysty (jeśli taki istnieje) dla pliku o nazwie. Jest to bardzo przydatne do tworzenia wtyczek. W jednej z moich wtyczek definiuję niestandardowy typ postu i utworzyłem plik szablonu pętli dla tego niestandardowego typu postu w moim katalogu wtyczek. Ale ... Chcę zezwolić, aby motywy korzystające z mojej wtyczki zastępowały znaczniki, jeśli tak wybiorą. To tam locate_template()naprawdę działa cuda.

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

wyszuka każdą z nazw w tablicy $ template_names w katalogu styles styles, a następnie w katalogu szablonów. Przekazanie „true” jako argumentu $ load oznacza, że ​​będzie wymagał pierwszego znalezionego pliku i zwróci pusty ciąg, jeśli nie zostanie znaleziony plik szablonu. Więc mogę zrobić coś takiego w mojej wtyczce:

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

... co, mam nadzieję, powinno ułatwić twórcom motywów dostosowanie mojej wtyczki poprzez dołączenie do motywu pliku o nazwie loop-mycustomposttype.php .

Złote Jabłka
źródło
2
Proszę zastąpić locate_template tym. include(locate_template( 'loop-mycustomposttype.php')) W ten sposób można przekazywać zmienne. Znalazłem ten link tutaj . To bardzo przydatne!
Pablo SG Pacheco
1
W takim przypadku konieczna będzie zmiana tego, jeśli również. W ten sposóbif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco
1
Dobra racja. Zgodnie z podaną przeze mnie formułą wywołanie requirelub require_once(from locate_template) jest wewnątrz funkcji, więc nie ma dostępu do bieżącego zakresu.
goldenapples
5

Nie wszystkie pętle, główna pętla. ;-) Bez względu na to, czy spojrzysz na swoją stronę główną, kategorię czy też co, zawsze będziesz mieć główną pętlę. Zawartość tej głównej pętli zależy od zapytania, które zostało uruchomione przed wywołaniem szablonu w ogóle.

Szablon loop.php po prostu przesuwa się nad elementami w pętli i formatuje je. Zobacz dokumentację w Kodeksie .

Jeśli spojrzysz na plik loop.php Twenty-Ten, zobaczysz, że Twenty-Ten następnie różnicuje się w tym jednym pliku szablonu.

get_template_part()po prostu ładuje część szablonu i przechodzi przez nią. Równie dobrze możesz wyodrębnić części pliku loop.php do osobnych plików i zastąpić je get_template_part('loop', 'category')wywołaniami a itd.

Lub możesz mieć szablon części dla każdego pojedynczego postu w pętli, a pętla loop.php będzie wywoływać tylko get_template_part('loop','post');w ramach while...klauzuli. Wszystko zależy od Ciebie.

wyrfel
źródło
3

Z kodeksu get_template_part :

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

zrobi PHP wymaga () dla pierwszego istniejącego pliku ...

Tak skutecznie zadziała, jakbyś potrzebował innego pliku php.

Aktualizacja : Istnieje niewielka różnica w „wymaganiu” - jest ona zawinięta w funkcję, więc musisz globalją przekazać, jeśli chcesz przekazać zmienne z szablonu do części szablonu.

icc97
źródło