J'ai trouvé ceci pour afficher le nom actuel du fichier utilisé dans le modèle:
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 ;
}
Source: obtenir le nom du modèle de page sur une page
Cela fonctionne assez bien, sauf que dans le backend, dans la boîte de sélection du modèle, je reçois cette entrée supplémentaire laide:
Quelqu'un a-t-il une idée de comment résoudre ce problème? Je ne sais même pas pourquoi cette fonction est appelée dans le backend. Existe-t-il une fonction conditionnelle du type is_frontend()
: peut-être que cela résoudrait le problème?
functions.php
bogue, je suis tout à fait d'accord avec votre idée. Pour aggraver les choses, j'ai scanné le code principal de WordPress et trouvé environ 5 endroits où il aurait pu y avoir un crochet pour vous permettre de gérer ce problème, mais je n'en ai trouvé aucun. Je suggère de poster un billet sur core.trac.wordpress.org .template_include
raccrochez pas , qui t31os suggéré, résoudre le problème? Ou peut-être je vous ai mal compris.Réponses:
Vous pouvez définir une variable globale au cours du
template_include
filtre, puis vérifier ultérieurement ce vairable global pour voir quel modèle a été inclus.Naturellement, vous ne voudriez pas avoir le chemin complet avec le fichier, je vous recommande donc de tronquer jusqu'au nom du fichier à l'aide de la
basename
fonction PHP .Exemple de code:
Deux fonctions, une pour définir la globale, une pour l'appeler.
Vous pouvez ensuite appeler
get_current_template
où vous en avez besoin dans les fichiers de thème, en notant que cela doit naturellement se produire après letemplate_include
déclenchement de l' action (vous n'aurez pas à vous en préoccuper si l'appel est effectué à l'intérieur d'un fichier de modèle).En ce qui concerne les modèles de page, il ne faut pas
is_page_template()
oublier que cela n’aidera que dans le cas des modèles de page (une fonction beaucoup moins intéressante ).Informations sur les fonctions utilisées ou référencées ci-dessus:
la source
apparemment cela suffit:
ou juste l'utiliser directement dans le template (j'ai tendance à faire écho dans footer.php dans un commentaire HTML)
la source
echo __FILE__;
echo __FILE__
- parce que cela ne fonctionnera pas, il affiche uniquement le modèle initial principalEntre les fonctions WP natives telles que get_template_part () et le langage PHP natif, le moyen le plus fiable de voir les fichiers de thèmes utilisés consiste à extraire la liste de tous les fichiers inclus et à filtrer ce qui n'appartient pas au thème (ou aux thèmes lorsque les combinaisons parent et enfant sont utilisées) :
la source
Un ajout (plus de code doux) à d'autres réponses ici.
Nom du modèle
Pour obtenir simplement le nom du modèle de page actuel , utilisez la ligne suivante.
Nom de fichier
Lorsque vous souhaitez simplement faire écho au nom du fichier de modèle actuel , procédez comme suit:
Edit: Voici la nouvelle version du plugin encapsulée dans une classe. Il affiche à la fois le nom du fichier de modèle actuel et le nom du fichier de hiérarchie de modèles dans le point d'arrêt situé au bas de la page.
Ce que le plugin vous dit:
Copiez simplement le code suivant dans un fichier et nommez-le
wpse10537_template_info.php
, chargez-le dans le répertoire de vos plugins et activez-le.Ce plugin peut aussi fonctionner comme MU-Plugin.
Vous pouvez ensuite simplement appeler
wpse10537_get_template_name()
à tout moment (dans un modèle de thème, par exemple). Cela évite d'encombrer l'espace de noms global.la source
template_redirect
ne passe rien, je pense que vous confondez avectemplate_include
. Je voudrais aussi vérifier si à l'intérieur du filtre au lieu de si statique var rempli. Si un code décide d'exécuter du temps supplémentaire, il peut détruire des choses.Le nom du modèle est stocké dans la table postmeta, il vous suffit donc de le placer quelque part dans votre boucle:
la source
front-page.php
,index.php
,single.php
,page.php
ou tout autre fichier. Votre code affiche le nom du modèle uniquement pour les pages avec un modèle de page personnalisé.Cela ne répond pas à toutes les questions du PO, mais le code ci-dessous est certainement plus élégant que les expressions régulières et l'analyse du fichier modèle lui-même.
Si vous êtes sur une page utilisant un modèle de page et que vous souhaitez obtenir le nom du modèle de page (c'est-à-dire: le nom lisible par l'homme que vous avez défini dans les commentaires en haut de votre fichier PHP de modèle), vous pouvez utiliser cette petite pépite:
Je voulais obtenir le nom du modèle parce que j'en avais vraiment marre des noms de classe ridicules que la fonction intégrée de WordPress
body_class
crée lorsque vous utilisez un modèle. Heureusement, il y a un crochet de filtre à la toute fin de cette fonction pour vous permettre d'ajouter également vos propres noms de classe. Voici mon filtre. J'espère que quelqu'un le trouvera utile:Ce filtre prend ce que vous avez nommé votre modèle de page, remplace les espaces par des tirets et met tout en minuscule pour qu'il ressemble à toutes les autres classes WordPress.
la source
Il y a un problème avec la
preg_match_all
ligne. Essayez ceci à la place:En outre, vous pouvez utiliser
if (!is_admin()) { .... }
pour exécuter des choses sur le front-end uniquement.la source
functions.php
trouver"/Template Name:(.*)\n/siU"
et traite ainsi lefunctions.php
fichier en tant que modèle. Je pense que c'est un bogue WP, il ne devrait même pas regarder ce fichier. La solution: déplacez le fichier dans un sous-répertoire.functions.php
fichier. Pour moi, personnellement, c’est un bug (petit, mais quand même) mais c’est le sujet de la discussion, je suppose. Je pense que vous ne pouvez pas dire que la fonction elle-même est un buggy.Template Name
dans chacun des fichiers, votre boucle est terminée bien avant.debug_backtrace()
venait pas de - je peux supprimer tout le code et tout laisserpreg_match_all("/Template Name...
, ou même tout simplement// Template Name:
et WP traite alorsfunctions.php
comme un fichier modèle, mais merci pour les commentaires - c'est un problème tellement unique que, comme vous dites, il n'est pas juste de dire c'est un bug. La solution t31os est propre et résout tout le problème. Salue.Joue avec:
Écrit à:
Comment savoir quelle page de modèle sert la page actuelle?
Si
admin-bar stuff
path est affiché en haut, ou dans tout autre fichier, modifiez le nomtemplate-loader.php
de fichier dans cette ligne de code en: quel que soit le nom de fichier que vous souhaitez interrompre.si vous en avez besoin dans la barre d’administration, utilisez la bonne priorité (la plus ancienne) pour vous assurer qu’aucun fichier n’est entré à la fin de cette liste. Par exemple:
La priorité est de
-5
faire en sorte qu'elle soit chargée en premier. La clé est de rendre cette ligne au bon moment.Il ne renvoie pas le fichier modèle "en cours", mais tout le fichier actuellement utilisé pour le chargement de page en cours. Peut-être "coupé" avec une logique de cette idée .
La
get_included_files()
"dernière" clé est le dernier fichier inclus enregistré, probablement le dernier modèle-fichier / -part utilisé dans le widget pied de page par la barre latérale ou quelque chose d'autre. Comme il se doit, les fichiers inclus dans la commande multiple ne sont pas réenregistrés / remplis à nouveau dans get_included_files ().Autrement, l'intension doit être claire pour résoudre ce problème . Un fichier inclus ne peut pas se déclarer lui-même comme inclus tant qu'il n'a pas été inclus . Ensuite, il est probablement trop tard pour utiliser le scénario.
La plupart du "temps" que vous voudriez :
Mais c’est impossible si le modèle est chargé en dehors de la méthode de base de Wordpress
get_template_part
. Re-concevez vos besoins à la place! Peutloop_start()
- être ,in_the_loop()
etadd_action('the_post')
a la solution que vous souhaitez, pour modifier les données en fonction du modèle que vous allez charger pour chaque entrée d'une boucle.la source
la source