Il n'y a pas de variable globale de base qui renvoie le contexte actuel. Cependant, vous pouvez créer le vôtre à l'aide de balises conditionnelles de modèle contextuel . Vous pouvez parcourir les balises conditionnelles dans le même ordre que le noyau WordPress, en suivant wp-includes/template-loader.php
.
Enveloppez simplement votre sortie dans une fonction de thème personnalisée. Voici comment je le fais (note: je ne pense pas que je respecte strictement template-loader.php):
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;
}
Ensuite, je passe simplement oenology_get_context()
un paramètre, par exemple:
get_template_part( 'loop', oenology_get_context() );
Je pense que quelque chose dans ce sens serait un bon candidat pour le noyau, même si je ne suis pas sûr de la meilleure façon de le mettre en œuvre. J'adorerais cependant soumettre un patch.
template-loader.php
.index
ne correspondrait jamais, comme l'unis_front_page()
ou l' autreis_home()
se déclencherait.is_home()
devrait être le premier, car il rendfront-page
même lorsque le paramètre "dernier message" est activé et qu'aucune page d'accueil n'est présente. Je viens de tester.is_home() && 'page'
, selon les besoins. Pour une information plus complète sur les articles de blog vs la page statique dans la première page, jetez un œil à ma propre réponse, ici: wordpress.stackexchange.com/questions/208503/… . BTW, @Chip et @helgatheviking, il vaudrait mieux utiliser use aswitch
au lieu de tantelseif
(c'est plus efficace ;-). Cordialement!un peu de facepalm, parce que la réponse est en PHP pur
la source
Si vous regardez le code source de la
get_template_part
fonction, vous verrez:Il crée un tableau de 2 noms de modèle:
{$slug}-{$name}.php
et{$slug}.php
et utilisezload_template
pour rechercher le fichier de modèle et l'inclure (le deuxième paramètre esttrue
, ce qui signifie inclure ce fichier).Vous pouvez imiter cette fonction pour renvoyer le chemin du fichier modèle au lieu de l'inclure, comme:
Usage:
Vous pouvez jouer plus avec
$template
pour obtenir ce que vous voulez.la source
archive.php
, et la réutiliser dansloop-archive.php
Liste de toutes les conditions qui sont
true
Comme toutes les
is_*()
fonctions ont leur équivalent dans une variable de requête (les fonctions ne sont que des wrappers), vous pouvez également y accéder d'une autre manière: obtenez simplement tout ce qui existetrue
.J'ai écrit un ticket sur core / trac qui ajoute une fonction pour les lister tous.
En attendant, vous pouvez utiliser les deux fonctions répertoriées comme plugins d'assistance qui vous montrent à quelle demande le conditionnel est disponible. Il imprimera un
var_dump()
sous le pied de page (à la fois administrateur et public) au niveau dushutdown
crochet.De cette façon, vous pouvez simplement les parcourir.
@scribu a ajouté sa propre fonction au ticket (une solution intéressante aussi).
Performance
J'ai exécuté un test de performance sur chaque fonction au milieu d'un modèle en utilisant
timer_start/*_stop();
. Pour être juste, j'ai renommé toutes les fonctions en un nom à un caractèrea/b/c()
.Comme vous pouvez le voir, la fonction codée en dur des puces est la plus rapide, puis la mienne et la dernière est dans ce cas scribus.
Mise à jour
Si vous me connaissez, alors vous connaissez mon amour pour les itérateurs pour leur élégance, leur clarté et leur capacité à ne conserver qu'un seul élément en mémoire au lieu de copier un tableau entier lors de la boucle. Voici donc une classe personnalisée rapide qui étend a
\FilterIterator
, ne nécessitant donc qu'une seule méthode retravaillée.Il peut être utilisé assez facilement. Le
$it->current()
contient la valeur, tandis que$it->key()
renvoie le nom conditionnel / propriété.la source