Es gibt keine globale Kernvariable, die den aktuellen Kontext zurückgibt. Sie können jedoch Ihre eigenen Tags mit kontextbezogenen Vorlagen erstellen . Sie können die bedingten Tags in derselben Reihenfolge wie der WordPress-Kern durchlaufen, indem Sie folgen wp-includes/template-loader.php
.
Wickeln Sie Ihre Ausgabe einfach in eine benutzerdefinierte Designfunktion. So mache ich das (Hinweis: Ich glaube nicht, dass ich template-loader.php genau befolge):
function oenology_get_context() {
$context = 'index';
if ( is_home() ) {
// Blog Posts Index
$context = 'home';
if ( is_front_page() ) {
// Front Page
$context = 'front-page';
}
}else if ( is_date() ) {
// Date Archive Index
$context = 'date';
} else if ( is_author() ) {
// Author Archive Index
$context = 'author';
} else if ( is_category() ) {
// Category Archive Index
$context = 'category';
} else if ( is_tag() ) {
// Tag Archive Index
$context = 'tag';
} else if ( is_tax() ) {
// Taxonomy Archive Index
$context = 'taxonomy';
} else if ( is_archive() ) {
// Archive Index
$context = 'archive';
} else if ( is_search() ) {
// Search Results Page
$context = 'search';
} else if ( is_404() ) {
// Error 404 Page
$context = '404';
} else if ( is_attachment() ) {
// Attachment Page
$context = 'attachment';
} else if ( is_single() ) {
// Single Blog Post
$context = 'single';
} else if ( is_page() ) {
// Static Page
$context = 'page';
}
return $context;
}
Dann übergebe ich einfach oenology_get_context()
als Parameter, zB:
get_template_part( 'loop', oenology_get_context() );
Ich denke, etwas in dieser Richtung wäre ein guter Kandidat für den Kern, obwohl ich nicht sicher bin, wie ich es am besten umsetzen kann. Ich würde jedoch gerne einen Patch einreichen.
template-loader.php
.index
würde niemals übereinstimmen, entwederis_front_page()
oderis_home()
würde auslösen.is_home()
sollte an erster Stelle stehen, da sie auch dann zurückgibtfront-page
, wenn die Einstellung "Letzter Beitrag" aktiviert ist und keine Titelseite vorhanden ist. Gerade getestet.is_home() && 'page'
, je nach den Anforderungen. Weitere Informationen zu Blogposts und statischen Seiten auf der Startseite finden Sie in meiner eigenen Antwort hier: wordpress.stackexchange.com/questions/208503/… . Übrigens, @Chip und @helgatheviking, es wäre besser, aswitch
anstelle von so vielen zu verwendenelseif
(es ist effizienter ;-). Grüße!ein bisschen wie ein Gesichtspalme, weil die Antwort in reinem PHP ist
quelle
Wenn Sie sich den Quellcode der
get_template_part
Funktion ansehen , sehen Sie:Es wird ein Array mit 2 Vorlagennamen erstellt:
{$slug}-{$name}.php
und{$slug}.php
und wird verwendetload_template
, um die Vorlagendatei zu finden und einzuschließen (der zweite Parameter isttrue
, dh diese Datei einschließen).Sie können diese Funktion nachahmen, um den Pfad der Vorlagendatei zurückzugeben, anstatt ihn einzuschließen:
Verwendungszweck:
Sie können mehr damit spielen
$template
, um das zu bekommen, was Sie wollen.quelle
archive.php
, und sie inloop-archive.php
Listen Sie alle Bedingungen auf, die sind
true
Da alle
is_*()
Funktionen in einer Abfragevariablen gleichwertig sind (die Funktionen sind nur Wrapper), können Sie auch auf andere Weise darauf zugreifen: Holen Sie sich einfach alle, die es sindtrue
.Ich habe ein Ticket auf core / trac geschrieben , das eine Funktion hinzufügt, um sie alle aufzulisten .
In der Zwischenzeit können Sie beide aufgelisteten Funktionen als Hilfs-Plugins verwenden, die Ihnen zeigen, auf welche Anfrage welche Bedingung verfügbar ist. Es wird ein
var_dump()
unter der Fußzeile (sowohl admin als auch public) amshutdown
Haken gedruckt .Auf diese Weise können Sie sie einfach durchlaufen.
@scribu hat dem Ticket seine eigene Funktion hinzugefügt (auch eine interessante Lösung).
Performance
Ich habe einen Leistungstest für jede Funktion in der Mitte einer Vorlage mit ausgeführt
timer_start/*_stop();
. Um fair zu sein, habe ich alle Funktionen in einen Namen mit einem Zeichen umbenannta/b/c()
.Wie Sie sehen können, ist die fest codierte Funktion von Chips am schnellsten, dann geht sie an meine und zuletzt ist in diesem Fall Scribus.
Aktualisieren
Wenn Sie mich kennen, dann kennen Sie meine Liebe zu Iteratoren wegen ihrer Eleganz, Klarheit und ihrer Fähigkeit, nur ein einzelnes Element im Speicher zu halten, anstatt ein ganzes Array während des Loopings zu kopieren. Hier ist also eine schnelle benutzerdefinierte Klasse, die a erweitert
\FilterIterator
und daher nur eine einzige Methode überarbeitet.Es kann recht einfach verwendet werden. Der
$it->current()
enthält den Wert, während$it->key()
der Bedingungs- / Eigenschaftsname zurückgegeben wird.quelle