Moją ulubioną częścią hierarchii szablonów Wordpress jest możliwość szybkiego tworzenia plików szablonów dla stron przez ślimak, bez konieczności edytowania strony w Wordpress, aby wybrać szablon.
Obecnie możemy to zrobić:
page- {slug} .php
Ale chciałbym móc to zrobić:
single- {post_type} - {slug} .php
Na przykład w typie posta o nazwie review
Mógłbym utworzyć szablon dla postu o nazwie „Moja wielka recenzja” pod adresemsingle-review-my-great-review.php
Czy ktoś już to skonfigurował? single-{post_type}-{slug}.php
single-{post_type}-{slug}.php
, więc uaktualnienie do WP 3.4 to kolejna opcja.Odpowiedzi:
A) Baza w rdzeniu
Jak widać w objaśnieniu hierarchii szablonów kodeksu ,
single-{$post_type}.php
jest już obsługiwane.B) Rozszerzenie podstawowej hierarchii
Teraz chętnie są w środku filtry i haczyki
/wp-includes/template-loader.php
.do_action('template_redirect');
apply_filters( 'template_include', $template )
get_query_template( $type, ... )
o nazwie:"$type}_template"
B.1) Jak to działa
is_*()
.is_single() && $template = get_single_template()
get_query_template( $type, $templates )
, gdzie$type
jestsingle
"{$type}_template"
filtrC) Rozwiązanie
Jak tylko chcemy przedłużyć hierarchię z jednego szablonu, który zostanie załadowany przed faktycznym
"single-{$object->post_type}.php"
szablonu, będziemy przechwytywać hierarchię i dodać nowy szablon do początku tablicy szablonów.UWAGA: (Jeśli chcesz użyć czegoś innego niż domyślny ślimak obiektów) Będziesz musiał dostosować się
$slug
do swojej struktury permalink. Po prostu użyj tego, czego potrzebujesz od globalnego(object) $post
.Bilety na Trac
Ponieważ powyższe podejście jest obecnie nie są obsługiwane (można filtrować tylko bezwzględną ścieżkę znajdujący ten sposób), oto lista biletów trac:
get_query_template()
źródło
)
w filtrze. Naprawiony. Może chcesz zamienić kreskę z podkreśleniem przed ślimakiem w szablonie. Po prostu, aby przyrostek wyróżniał się lepiej podczas przeglądania szablonów.$templates
jest tablicą. Zobacz podstawowe funkcje w tej pastebin (bez daty ważności). Upewnij się, że przetestujesz to z instalacją bez wtyczek i domyślnym motywem. Następnie aktywuj jeden po drugim i sprawdź, czy błąd nadal występuje.slug
jest dostępne tylko dla warunków i taksonomii. Powinieneś zastąpić$post->post_name
tym, co pasuje do twojej struktury permalink. Obecnie nie ma możliwości automatycznego wykonania tego we wszystkich przypadkach z pobieraniem i zastępowaniem ścieżki w zależności od reguł perma struct i przepisywania. Spodziewaj się kolejnej aktualizacji.Śledząc obrazie Hierarchia szablonów nie widzę takiej opcji.
Oto, jak bym to zrobił:
Rozwiązanie 1 (najlepsze według mnie)
Utwórz plik szablonu i powiąż go z recenzją
Dodając szablonowy plik php do katalogu motywów, pojawi się on jako opcja szablonu na stronie edycji posta.
Rozwiązanie 2
Można to prawdopodobnie osiągnąć za pomocą
template_redirect
haka.W pliku functions.php:
EDYTOWAĆ
Dodano
file_exists
czekźródło
exit;
tam jesteśexit()
to konieczne, aby zapobiec ładowaniu domyślnego szablonu.Najlepsza odpowiedź (sprzed 4 lat) już nie działa, ale kodeks WordPress ma tutaj rozwiązanie :
źródło
Użyj szablonów stron
Innym podejściem do skalowalności byłoby zduplikowanie funkcji rozwijania szablonu strony
page
dla typu postu dla niestandardowego typu postu.Kod wielokrotnego użytku
Powielanie kodu nie jest dobrą praktyką. Praca w godzinach nadliczbowych może powodować poważne wzdęcia w bazie kodu, co utrudnia programistom zarządzanie. Zamiast tworzyć szablon dla każdego ślimaka, najprawdopodobniej będziesz potrzebować szablonu jeden do wielu, który może być ponownie użyty zamiast jednego do jednego post-to-template.
Kod
To trochę spóźniona odpowiedź, ale pomyślałem, że będzie cenna, ponieważ nikt w sieci nie udokumentował tego podejścia, o ile wiem. Mam nadzieję, że to komuś pomoże.
źródło
W moim przypadku mam niestandardowe typy wpisów Album i Śledź połączone taksonomią Albumu. Chciałem móc korzystać z różnych szablonów Single dla postów Album i Track w zależności od ich taksonomii albumu.
Na podstawie powyższej odpowiedzi Kaiser napisałem ten kod. To dobrze działa.
Uwaga. Nie potrzebowałem add działań ().
Mogę teraz tworzyć szablony o nazwach single-gregory-cpt-track-tax-serendipity.php i single-gregory-cpt-album-tax-serendipity.php, a WP użyje ich automatycznie; „podatność na zerwanie” jest ślimakiem pierwszego terminu taksonomii albumu.
w celach informacyjnych deklaracja filtru „single_template” jest zadeklarowana w:
/wp-includes/theme.php:
get_query_template()
Dziękuję Kaiser za przykładowy kod.
Pozdrawiam, Gregory
źródło
Zaktualizowałem kod Briansa. Odkryłem, że kiedy nie było rozwijanego pola, opcja „domyślnego” szablonu była zapisywana w wp_page_template, co spowodowało, że próbował znaleźć szablon o nazwie default. ta zmiana sprawdza tylko opcję „domyślną” podczas zapisywania i zamiast tego usuwa meta post (przydatne, jeśli zmieniono opcję szablonu z powrotem na domyślną)
źródło