Obtenir le nom du fichier de modèle actuel

54

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 zone 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 telle que is_frontend() - cela résoudrait peut-être le problème?

    
posée chodorowicz 26.02.2011 - 16:47

9 réponses

17

apparemment cela suffit:

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    echo basename($template);
}

ou utilisez-le directement dans le modèle (j'ai tendance à faire écho dans footer.php dans un commentaire HTML)

<?php global $template; echo basename($template); ?>
    
réponse donnée chodorowicz 09.04.2011 - 18:25
62

Vous pouvez définir une variable globale lors du filtre template_include , puis vérifier ultérieurement que cette variable globale permet de 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 fonction basename de PHP.

Exemple de code:
Deux fonctions, une pour régler le global, une pour l’appeler.

add_filter( 'template_include', 'var_template_include', 1000 );
function var_template_include( $t ){
    $GLOBALS['current_theme_template'] = basename($t);
    return $t;
}

function get_current_template( $echo = false ) {
    if( !isset( $GLOBALS['current_theme_template'] ) )
        return false;
    if( $echo )
        echo $GLOBALS['current_theme_template'];
    else
        return $GLOBALS['current_theme_template'];
}

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 le déclenchement de l'action template_include (vous n'aurez pas à vous en préoccuper si l'appel est effectué à l'intérieur.) un fichier modèle).

Pour les modèles de page, il existe is_page_template() , sachant que cela n’aidera que dans le cas des modèles de page (une fonction beaucoup moins intercepter ).

Informations sur les fonctions utilisées ou référencées ci-dessus:

réponse donnée t31os 27.02.2011 - 01:40
16

Entre les fonctions WP natives telles que get_template_part () et le langage natif de PHP inclut le moyen le plus fiable de voir les fichiers de thème utilisés pour aller chercher liste de tous les fichiers inclus et filtre ce qui n'appartient pas au thème (ou aux thèmes lorsque la combinaison parent / enfant est utilisée):

$included_files = get_included_files();
$stylesheet_dir = str_replace( '\', '/', get_stylesheet_directory() );
$template_dir   = str_replace( '\', '/', get_template_directory() );

foreach ( $included_files as $key => $path ) {

    $path   = str_replace( '\', '/', $path );

    if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
        unset( $included_files[$key] );
}

var_dump( $included_files );
    
réponse donnée Rarst 01.03.2013 - 19:27
8

Un ajout (plus de code doux) à d'autres réponses ici.

Nom du modèle

Pour obtenir simplement le nom actuel du modèle de page , utilisez la ligne suivante.

is_page() AND print get_page_template_slug( get_queried_object_id() );

Nom du fichier

Si vous souhaitez simplement faire écho au nom du fichier de modèle actuel , procédez comme suit

Modifier: voici la nouvelle version du plug-in intégrée à 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 crochet d'arrêt situé tout en bas de la page.

Ce que le plug-in vous dit:

  • Le modèle provient-il du parent du thème enfant / actuel?
  • Le modèle est-il servi à partir d'un sous-dossier? Si oui: vous dit le nom
  • Le nom du fichier de modèle.

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.

<?php
/** Plugin Name: (#10537) »kaiser« Get Template file name */

if ( ! class_exists( 'wpse10537_template_name' ) )
{
    add_action( 'plugins_loaded', array( 'wpse10537_template_name', 'init' ) );

class wpse10537_template_name
{
    protected static $instance;

    public $stack;

    public static function init()
    {
        is_null( self :: $instance ) AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        if ( is_admin() )
            return;

        add_action( 'wp', array( $this, 'is_parent_template' ), 0 );
        add_action( 'wp', array( $this, 'get_template_file' ) );
        add_action( 'template_include', array( $this, 'get_template_name' ) );
        add_action( 'shutdown', array( $this, 'get_template_name' ) );
    }

    public function get_template_name( $file )
    {
        if ( 'template_include' === current_filter() )
        {
            $this->to_stack(
                 "Template file"
                ,basename( $file )
            );
            return $file;
        }

        // Return static var on echo call outside of filter
        if (
            current_user_can( 'manage_options' )
            AND defined( 'WP_DEBUG' )
            AND WP_DEBUG 
        )
            return print implode( " &ndash; ", $this->stack );
    }

    public function get_template_file()
    {
        if ( ! is_post_type_hierarchical( get_post_type() ) )
            return;

        $slug = get_page_template_slug( get_queried_object_id() );
        if ( ! strstr( $slug, "/" ) )
            return $this->to_stack( "Template", $slug );

        $this->to_stack(
             "Subdirectory"
            ,strstr( $slug, "/", true )
        );

        $this->to_stack(
             "Template (in subdirectory)"
            ,str_replace( "/", "", strstr( $slug, "/" ) )
        );
    }

    public function is_parent_template()
    {
        if ( ! is_null( wp_get_theme()->parent ) )
            return $this->to_stack( 'from parent theme' );

        $this->to_stack( 'from current/child theme' );
    }

    public function to_stack( $part, $item = '' )
    {
        $this->stack[] = "{$part}: {$item}";
    }
} // END Class wpse10537_template_name

} // endif;

Ce plugin peut également fonctionner comme plug-in MU.

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.

    
réponse donnée kaiser 08.09.2012 - 04:16
4

Le nom du modèle est stocké dans la table postmeta. Il vous suffit donc de le placer quelque part dans votre boucle:

$template = get_post_meta( $post->ID, '_wp_page_template', true );
echo "Template: " . $template;
    
réponse donnée Simon Blackbourn 26.02.2011 - 18:51
2

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 du fichier PHP de votre modèle), vous pouvez utiliser cette petite pépite:

if ( is_page() && $current_template = get_page_template_slug( get_queried_object_id() ) ){
    $templates = wp_get_theme()->get_page_templates();
    $template_name = $templates[$current_template];
}

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 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:

add_filter( 'body_class', 'gs_body_classes', 10, 2 );
function gs_body_classes( $classes, $class ){
    if ( is_page() && $current_template = get_page_template_slug( get_queried_object_id() ) ){
        $templates = wp_get_theme()->get_page_templates();
        $template_name = str_replace( " ", "-", strtolower( $templates[$current_template] ) );

        $classes[] = $template_name;
    }

    return $classes;
}

Ce filtre prend ce que vous avez nommé votre modèle de page, remplace les espaces par des tirets et tout en minuscule pour qu'il ressemble à toutes les autres classes WordPress.

    
réponse donnée Tom Auger 01.05.2013 - 03:56
0

Il y a un problème avec la ligne preg_match_all . Essayez ceci à la place:

preg_match_all("/Template Name:(.*)\n/siU",$template_contents,$template_name);

De plus, vous pouvez utiliser if (!is_admin()) { .... } pour exécuter des tâches uniquement sur le client.

    
réponse donnée wyrfel 26.02.2011 - 17:43
0

Jouez avec:

echo '<ul><li>'.implode('</li><li>', str_replace(str_replace('\', '/', ABSPATH).'wp-content/', '', array_slice(str_replace('\', '/', get_included_files()), (array_search(str_replace('\', '/', ABSPATH).'wp-includes/template-loader.php', str_replace('\', '/', get_included_files())) + 1)))).'</li></ul>';

Rédigé à:

Comment savoir quel modèle de page sert la page actuelle?

si admin-bar stuff chemin est affiché en haut, ou dans tout autre fichier, remplacez le nom de fichier template-loader.php dans cette ligne de code par: 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é (au plus tôt) pour vous assurer qu'aucun fichier n'est entré à la fin de cette liste. Par exemple:

add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);

priorité -5 assurez-vous que le chargement est effectué en premier. La clé est de rendre cette ligne au bon moment.

Il ne renvoie pas le fichier modèle "actuel", mais tout le fichier actuellement utilisé pour le chargement de page actuel. Peut-être que vous êtes "coupé" avec une logique de cette idée .

La clé get_included_files() "last" 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 ().

Sinon, l'intension doit être claire pour pouvoir pirater ce problème . Il est impossible pour un fichier inclus de 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 aimeriez :

$template = get_current_loaded_template();
if($template == 'single-product.php') add_filter('the_title' ....
if($template == 'format-gallery.php') add_action('post_thumbnail' ....

Mais ce n'est pas possible si le modèle est chargé en dehors de la méthode de base Wordpress de get_template_part . Re-concevez vos besoins à la place! Peut-être que loop_start() , in_the_loop() et add_action('the_post') ont la solution que vous souhaitez, modifier les données en fonction du modèle à charger pour chaque entrée d’une boucle.

    
réponse donnée Jonas Lundman 15.09.2017 - 08:49
-3
global $post;
$templateName = get_page_template_slug( $post->ID );
//echo $templateName;
var_dump( $templateName );
    
réponse donnée Shafi 17.02.2016 - 09:54

Lire d'autres questions sur les étiquettes