Znalazłem to, aby wyświetlić bieżącą nazwę pliku używanego w szablonie:
function get_template_name () {
foreach ( debug_backtrace() as $called_file ) {
foreach ( $called_file as $index ) {
if ( !is_array($index[0]) AND strstr($index[0],'/themes/') AND !strstr($index[0],'footer.php') ) {
$template_file = $index[0] ;
}
}
}
$template_contents = file_get_contents($template_file) ;
preg_match_all("Template Name:(.*)\n)siU",$template_contents,$template_name);
$template_name = trim($template_name[1][0]);
if ( !$template_name ) { $template_name = '(default)' ; }
$template_file = array_pop(explode('/themes/', basename($template_file)));
return $template_file . ' > '. $template_name ;
}
Źródło: pobierz nazwę szablonu strony na stronie
Działa całkiem dobrze, z wyjątkiem tego, że w backend, w polu wyboru szablonu, otrzymuję ten brzydki dodatkowy wpis:
Czy ktoś ma pomysł, jak to naprawić? Nie wiem nawet, dlaczego ta funkcja jest wywoływana w wewnętrznej bazie danych. Czy istnieje funkcja warunkowa typu is_frontend()
- może to rozwiązałoby problem?
functions.php
jako błędu, całkowicie zgodzę się z twoją przesłanką. Co gorsza, zeskanowałem kod podstawowy WordPressa i znalazłem około 5 miejsc, w których mógł istnieć hak umożliwiający rozwiązanie tego problemu, ale nie znalazłem żadnego. Proponuję opublikować bilet na core.trac.wordpress.org .template_include
zaczepia się, które sugeruje t31os, rozwiązać problem? A może źle cię zrozumiałem.Odpowiedzi:
Możesz ustawić zmienną globalną podczas
template_include
filtrowania, a następnie sprawdzić, czy zmienna globalna jest możliwa do sprawdzenia, który szablon został uwzględniony.Oczywiście nie chciałbyś mieć pełnej ścieżki wraz z plikiem, więc polecam skrócenie do nazwy pliku za pomocą
basename
funkcji PHP .Przykładowy kod:
Dwie funkcje, jedna do ustawienia globalnej, druga do wywołania.
Następnie możesz wywoływać,
get_current_template
gdziekolwiek jest to potrzebne, w plikach motywu, zauważając, że naturalnie musi to nastąpić po uruchomieniutemplate_include
akcji (nie musisz się tym martwić, jeśli wywołanie zostanie wykonane w pliku szablonu).W przypadku szablonów stron należy
is_page_template()
pamiętać, że pomoże to tylko w przypadku szablonów stron (znacznie mniej funkcji catch all ).Informacje o zastosowanych lub wymienionych wyżej funkcjach:
źródło
najwyraźniej to wystarczy:
lub po prostu użyj go bezpośrednio w szablonie (mam tendencję do echa w footer.php w komentarzu HTML)
źródło
echo __FILE__;
echo __FILE__
- ponieważ to nie zadziała, wyświetla tylko główny, początkowy szablonPomiędzy natywnymi funkcjami WP, takimi jak get_template_part (), a rodzimym PHP zawiera najbardziej niezawodny sposób, aby zobaczyć, że używane pliki motywu to pobranie listy wszystkich dołączonych plików i odfiltrowanie wszystkiego, co nie należy do motywu (lub motywów, gdy używana jest kombinacja nadrzędna i podrzędna) :
źródło
Dodatek (więcej słodkiego kodu) do innych odpowiedzi tutaj.
Nazwa szablonu
Aby po prostu uzyskać nazwę bieżącego szablonu strony , użyj następującego wiersza.
Nazwa pliku
Aby po prostu powtórzyć nazwę bieżącego pliku szablonu , wykonaj następujące czynności
Edycja: Oto nowa wersja wtyczki zawarta w klasie. Pokazuje zarówno bieżącą nazwę pliku szablonu, jak i nazwę pliku hierarchii szablonów w haczyku zamykania u dołu strony.
Co mówi ci wtyczka:
Wystarczy skopiować następujący kod do pliku i nazwać go
wpse10537_template_info.php
, załadować go do katalogu wtyczek i aktywować.Wtyczka może również działać jako wtyczka MU.
Następnie możesz po prostu zadzwonić
wpse10537_get_template_name()
w dowolnym momencie (na przykład szablon motywu). Pozwala to uniknąć zaśmiecania globalnej przestrzeni nazw.źródło
template_redirect
nic nie przekazuje, myślę, że mylisz siętemplate_include
. Sprawdziłbym również, czy w filtrze zamiast wypełnienia statycznego var. Jeśli jakiś kod zdecyduje się uruchomić dodatkowy hak, może to zniszczyć.Nazwa szablonu jest przechowywana w tabeli postmeta, więc wystarczy, że umieścisz ją gdzieś w pętli:
źródło
front-page.php
,index.php
,single.php
,page.php
lub dowolny inny plik. Kod wyświetla nazwę szablonu tylko dla stron z niestandardowym szablonem strony.Nie rozwiązuje to wszystkich pytań OP, ale poniższy kod jest z pewnością bardziej elegancki niż wyrażenia regularne i parsowanie samego pliku szablonu.
Jeśli jesteś na stronie, która korzysta z szablonu strony i chcesz uzyskać nazwę szablonu strony (tj. Czytelną dla człowieka nazwę zdefiniowaną w komentarzach u góry pliku PHP szablonu), możesz użyć ten mały samorodek:
Chciałem uzyskać nazwę szablonu, ponieważ miałem dość niemądrych nazw klas, które wbudowana
body_class
funkcja WordPress tworzy podczas korzystania z szablonu. Na szczęście na samym końcu tej funkcji znajduje się haczyk filtrujący, który umożliwia dołączanie własnych nazw klas. Oto mój filtr. Mam nadzieję, że ktoś uzna to za przydatne:Ten filtr weźmie wszystko, co nazwałeś szablonem strony, zastąpi spacje myślnikami i sprawi, że wszystko będzie pisane małymi literami, aby wyglądało jak wszystkie inne klasy WordPress.
źródło
Wystąpił problem z
preg_match_all
linią. Spróbuj zamiast tego:Możesz także używać
if (!is_admin()) { .... }
do uruchamiania rzeczy tylko w interfejsie użytkownika.źródło
functions.php
znalezisk"/Template Name:(.*)\n/siU"
i dlatego traktujefunctions.php
plik jako szablon. Myślę, że to błąd WP, nie powinien nawet patrzeć na ten plik. Rozwiązanie: przenieś plik do podkatalogu.functions.php
pliku ciągu „Nazwa szablonu:” (nawet w komentarzu) . Dla mnie osobiście jest to błąd (mały, ale w każdym razie), ale to chyba kwestia dyskusji. Myślę, że nie można powiedzieć, że sama funkcja jest błędna.Template Name
w każdym z plików, twoja pętla zakończyła się na długo przed tym.debug_backtrace()
- mogę usunąć cały kod i po prostu wyjśćpreg_match_all("/Template Name...
, a nawet po prostu,// Template Name:
a WP traktuje wtedyfunctions.php
jako plik szablonu, ale dziękuję za komentarze - jest to tak wyjątkowy problem, że, jak mówisz, nie jest fair powiedzieć to błąd. Rozwiązanie t31os jest czyste i rozwiązuje cały problem. PozdrawiamGraj razem z:
Napisane w:
Jak dowiedzieć się, która strona szablonu wyświetla bieżącą stronę?
jeśli
admin-bar stuff
ścieżka jest wyświetlana u góry lub w innym pliku, zmień nazwę plikutemplate-loader.php
w tym wierszu kodu na: dowolną nazwę pliku, z której chcesz przerwać.jeśli potrzebujesz tego na pasku administracyjnym, użyj odpowiedniego priorytetu (najwcześniej), aby mieć pewność, że żadne pliki nie zostaną wprowadzone na końcu tej listy. Na przykład:
priorytet
-5
upewnij się, że najpierw ładuje. Kluczem jest wyrenderowanie tej linii we właściwym momencie.Nie zwraca „bieżącego” pliku szablonu, ale cały bieżący plik używany do bieżącego ładowania strony. Może „wyciąć” z logiką tego pomysłu .
Klawisz
get_included_files()
„ostatni” to ostatnio zarejestrowany dołączony plik, prawdopodobnie ostatni plik / część szablonu użyty w stopce przez widżet paska bocznego lub coś takiego. Prawdopodobnie pliki zawierające wiele plików nie rejestrują się ponownie / wypełniają ponownie w get_included_files ().W przeciwnym razie zamiar włamania się do tego problemu musi być wyraźny . Dołączony plik nie może zgłosić się jako dołączony, dopóki nie zostanie dołączony . Potem jest prawdopodobnie za późno, aby wykorzystać scenariusz.
Przez większość czasu chciałbyś :
Ale nie jest to możliwe, jeśli szablon jest ładowany poza podstawową metodą Wordpress
get_template_part
. Zamiast tego przeprojektuj swoje potrzeby! Możeloop_start()
,in_the_loop()
iadd_action('the_post')
ma rozwiązanie, które chcesz, aby zmienić dane w zależności od szablonu ów zamiar obciążenie dla każdego wpisu w pętli.źródło
źródło