Ich habe festgestellt, dass der aktuelle Name der in der Vorlage verwendeten Datei angezeigt wird:
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 ;
}
Quelle: Name der Seitenvorlage auf einer Seite abrufen
Es funktioniert ganz gut, außer dass ich im Backend im Template-Auswahlfeld diesen hässlichen zusätzlichen Eintrag bekomme:
Hat jemand eine Idee, wie man das behebt? Ich weiß nicht einmal, warum diese Funktion im Backend aufgerufen wird. Gibt es eine bedingte Funktion wie is_frontend()
- vielleicht würde dies das Problem lösen?
functions.php
als Fehler bezeichne, stimme ich Ihrer Prämisse vollkommen zu. Um die Sache noch schlimmer zu machen, habe ich den WordPress-Kerncode gescannt und ungefähr 5 Stellen gefunden, an denen es einen Haken geben könnte, mit dem Sie dieses Problem lösen könnten, aber ich habe keinen gefunden. Ich würde vorschlagen, ein Ticket auf core.trac.wordpress.org zu veröffentlichen .template_include
Haken nicht , welche t31os vorgeschlagen, das Problem zu lösen? Oder vielleicht habe ich dich falsch verstanden.Antworten:
Sie können während des
template_include
Filters eine globale Variable festlegen und später die globale Variable überprüfen, um festzustellen, welche Vorlage enthalten ist.Sie möchten natürlich nicht den vollständigen Pfad zusammen mit der Datei, also würde ich empfehlen, mit der PHP-
basename
Funktion auf den Dateinamen zu kürzen .Beispielcode:
Zwei Funktionen, eine zum Festlegen der globalen, eine zum Aufrufen.
Sie können dann jederzeit in den Designdateien darauf zugreifen.
get_current_template
Beachten Sie, dass dies natürlich nach dem Auslösen dertemplate_include
Aktion erfolgen muss (Sie müssen sich darüber keine Gedanken machen, wenn der Aufruf in einer Vorlagendatei erfolgt).Für Seitenvorlagen gibt es
is_page_template()
unter Berücksichtigung, dass nur bei Seitenvorlagen geholfen wird (eine weitaus geringere Catch-All- Funktion).Informationen zu den oben verwendeten oder referenzierten Funktionen:
quelle
anscheinend ist das genug:
oder benutze es einfach direkt in der Vorlage (ich neige dazu, in der footer.php im HTML-Kommentar zu echo)
quelle
echo __FILE__;
echo __FILE__
- weil dies nicht funktioniert, zeigt es nur Haupt, erste VorlageZwischen nativen WP-Funktionen wie get_template_part () und den nativen PHP- Funktionen besteht die zuverlässigste Methode zum Anzeigen der verwendeten Themendateien darin, eine Liste aller enthaltenen Dateien abzurufen und herauszufiltern, was nicht zum Thema gehört (oder Themen, wenn übergeordnete und untergeordnete Kombination verwendet wird). :
quelle
Ein Zusatz (süßer Code) zu anderen Antworten hier.
Vorlagenname
Verwenden Sie die folgende Zeile, um nur den Namen der aktuellen Seitenvorlage abzurufen .
Dateiname
Wenn Sie nur den Namen der aktuellen Vorlagendatei wiedergeben möchten , gehen Sie wie folgt vor
Bearbeiten: Hier ist die neue Version des Plugins, die in einer Klasse zusammengefasst ist. Es werden sowohl der Name der aktuellen Vorlagendatei als auch der Name der Vorlagendateihierarchie im Shutdown-Hook am unteren Rand der Seite angezeigt.
Was das Plugin Ihnen sagt:
Kopieren Sie einfach den folgenden Code in eine Datei und benennen Sie ihn
wpse10537_template_info.php
, laden Sie ihn in Ihr Plugins-Verzeichnis hoch und aktivieren Sie ihn.Dieses Plugin kann auch als MU-Plugin ausgeführt werden.
Sie können dann einfach
wpse10537_get_template_name()
an beliebiger Stelle anrufen (zB in einer Themenvorlage). Dadurch wird vermieden, dass der globale Namespace überladen wird.quelle
template_redirect
passiert nichts, ich denke, Sie sind verwirrend mittemplate_include
. Ich würde auch prüfen, ob im Filter, anstatt ob statische var gefüllt ist. Wenn ein Code entscheidet, Hook zusätzliche Zeit auszuführen, kann dies die Dinge ruinieren.Der Name der Vorlage wird in der Postmeta-Tabelle gespeichert. Sie müssen also nur Folgendes in Ihre Schleife einfügen:
quelle
front-page.php
,index.php
,single.php
,page.php
oder jede andere Datei. In Ihrem Code wird der Vorlagenname nur für Seiten mit einer benutzerdefinierten Seitenvorlage angezeigt.Damit werden nicht alle Fragen des OP beantwortet, aber der folgende Code ist sicherlich eleganter als reguläre Ausdrücke und analysiert die Vorlagendatei selbst.
Wenn Sie sich auf einer Seite befinden, die eine Seitenvorlage verwendet, und den Namen der Seitenvorlage abrufen möchten (dh den lesbaren Namen, den Sie in den Kommentaren oben in Ihrer PHP-Vorlagendatei definiert haben), können Sie ihn verwenden dieses kleine Nugget:
Ich wollte den Vorlagennamen haben, weil ich die albern-langweiligen Klassennamen satt hatte, die die integrierte WordPress-
body_class
Funktion erstellt, wenn Sie eine Vorlage verwenden. Zum Glück befindet sich ganz am Ende dieser Funktion ein Filter-Hook, mit dem Sie auch Ihre eigenen Klassennamen anhängen können. Hier ist mein Filter. Hoffe, jemand findet es nützlich:Dieser Filter nimmt alles, was Sie als Seitenvorlage bezeichnet haben, auf, ersetzt Leerzeichen durch Bindestriche und macht alles in Kleinbuchstaben, so dass es aussieht wie alle anderen WordPress-Klassen.
quelle
Es gibt ein Problem mit der
preg_match_all
Leitung. Versuchen Sie dies stattdessen:Außerdem können Sie
if (!is_admin()) { .... }
Dinge nur auf dem Frontend ausführen.quelle
functions.php
Funden sucht"/Template Name:(.*)\n/siU"
und somit diefunctions.php
Datei als Vorlage behandelt . Ich denke, das ist ein WP-Fehler, es sollte sich nicht einmal diese Datei ansehen. Die Lösung: Verschieben Sie die Datei in das Unterverzeichnis.functions.php
Datei einzufügen. Für mich persönlich ist das ein Fehler (klein, aber trotzdem), aber ich nehme an, das steht zur Diskussion. Ich denke, man kann nicht sagen, dass die Funktion selbst fehlerhaft ist.Template Name
in jeder Datei, Ihre Schleife ist schon lange zu Ende.debug_backtrace()
- ich kann den gesamten Code entfernen und einfach verlassenpreg_match_all("/Template Name...
, oder auch nur// Template Name:
und WP behandelt dannfunctions.php
als Vorlagendatei, aber danke für Kommentare - dies ist ein so einzigartiges Problem, dass es, wie Sie sagen, nicht fair zu sagen ist Es ist ein Fehler. Die t31os-Lösung ist sauber und löst das gesamte Problem. GrüßeSpielen Sie mit:
Geschrieben am:
Wie finden Sie heraus, welche Vorlagenseite die aktuelle Seite enthält?
Wenn der
admin-bar stuff
Pfad obentemplate-loader.php
angezeigt wird oder eine andere Datei, ändern Sie den Dateinamen in dieser Codezeile in: den Dateinamen , von dem Sie abbrechen müssen.Wenn Sie dies in der Admin-Leiste benötigen, verwenden Sie die richtige Priorität (frühestens) , um sicherzustellen, dass am Ende dieser Liste keine Dateien eingegeben werden . Zum Beispiel:
Priorität
-5
stellen Sie sicher, dass es zuerst geladen wird. Der Schlüssel ist, diese Linie im richtigen Moment zu rendern.Es wird nicht die "aktuelle" Vorlagendatei zurückgegeben, sondern die gesamte aktuell für das aktuelle Laden der Seite verwendete. Vielleicht mit etwas Logik aus dieser Idee "rausgeschnitten" .
Der
get_included_files()
"letzte" Schlüssel ist die zuletzt registrierte eingeschlossene Datei, wahrscheinlich die letzte Schablonendatei / der letzte Teil, der in der Fußzeile vom Seitenleisten-Widget oder so verwendet wird. Möglicherweise werden in get_included_files () in cos mutiple enthaltene Dateien nicht erneut registriert / ausgefüllt.Andernfalls muss die Absicht klar sein, dieses Problem zu lösen . Es gibt keine Möglichkeit für eine eingeschlossene Datei, sich selbst als eingeschlossen zu melden, bis sie eingeschlossen wurde . Dann ist es wahrscheinlich zu spät, das Szenario zu verwenden.
Die meiste Zeit möchten Sie :
Dies ist jedoch nicht möglich, wenn die Vorlage außerhalb der Wordpress- Kernmethode von geladen wird
get_template_part
. Entwerfen Sie stattdessen Ihre Bedürfnisse neu! Vielleichtloop_start()
,in_the_loop()
undadd_action('the_post')
hat die Lösung , die Sie mögen, Daten von Vorlage abhängig das sind für jeden Eintrag in einer Schleife Gonna Last zu verändern.quelle
quelle