J'ai un thème dans lequel le développeur a beaucoup utilisé get_tempalate_part (), et ces parties sont dispersées dans des sous-répertoires de thèmes, ainsi que dans des répertoires d'un plug-in créé pour aider à la définition du thème.
Voici le code que j'utilise pour comprendre le modèle principal appelé (le modèle parent, faute de mots plus précis):
add_action('wp_head', 'show_template');
function show_template() {
global $template;
print_r($template);
}
show_template();
Cela fonctionne bien, mais ne montre que l'emplacement du fichier de modèle parent. Quel code puis-je utiliser pour savoir quoi et où à partir du modèle les pièces sont appelées?
Utilisez cette ligne, tard dans footer.php:
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>';
Écrit à:
Comment trouvez-vous quelle page de modèle 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
par 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 propriété(au plus tôt)pour vous assurer que aucun fichier n’est entré à la fin de la listede cette liste. Par exemple:
add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);
priority -5
make shure il se charge en premier. La clé est de rendre cette ligne au bon moment.
Faites quelques changements si votre serveur utilise des barres obliques doubles.
Plus à: Comment savoir quelle page de modèle sert la page actuelle?
Vous pouvez afficher la partie modèle en utilisant get_template_part($slug)
C’est l’un de ces joyaux cachés à l’intérieur de WordPress qui ne retient pas l’attention qu’il mérite. La fonction get_template_part
est essentiellement un PHP include ou require sur steroids:
Il sait déjà où se trouve votre thème et il recherchera le fichier demandé dans le répertoire de ce thème.
Il n’émet pas d’avertissement ni de fatal out si le fichier demandé n’existe pas
Il peut rechercher d'autres fichiers appropriés, si celui demandé n'est pas trouvé
Il connaît les thèmes enfants et les thèmes parents
En bref, la fonction get_template_part vous permet de diviser votre thème en modèles plus petits (ou parties de modèles), qui peuvent être réutilisés dans vos autres modèles.
Par exemple:
get_template_part( 'navigation', get_post_type() );
Où get_post_type()
retournera le nom du type de message actuellement affiché. Ainsi, si nous sommes sur un message, il tentera de charger les fichiers navigation-post.php et de se replier sur navigation.php. Si nous sommes sur une page, navigation-page.php et navigation.php. Si nous examinons un type de publication personnalisé, disons un livre, il recherchera navigation-book.php et reviendra à navigation.php.
La puissance réelle de get_template_part provient d'une fonction appelée locate_template
, qui effectue toute la recherche dans les dossiers de thème parent et de thème enfant, ainsi que la restauration des autres modèles d'une pile. La fonction get_template_part
construit simplement un tableau de modèles que locate_template
doit rechercher. Voici un exemple rapide:
get_template_part( 'one', 'two' );
Crée un tableau de "one-two.php" et "one.php" (dans cet ordre spécifique) et le transmet à locate_template
, qui parcourt ensuite ce tableau et recherche les fichiers des répertoires de thèmes enfant et parent. L’ordre est vraiment important ici, c’est un peu pourquoi les noms de fichiers ont la priorité sur leur emplacement (thème parent ou thème enfant) et explique la raison derrière la séquence de recherche.
Il convient également de noter que les fonctions telles que get_header
, get_sidebar
et get_footer
sont très similaires à get_template_part
avec une sorte de premier argument codé en dur.
get_template_part
est situé dans wp-includes/general-template.php et locate_template
dans wp-includes/template.php.
Si vous regardez le code de la fonction get_tempalate_part()
, vous verrez que vous pouvez vous accrocher à l'action get_template_part_{$slug}"
. Comme la variable $slug
est une inconnue, vous devrez extraire la variable du fichier de modèle lui-même.
L'exemple suivant récupère le fichier de modèle de thème utilisé pour la page en cours avec le filtre template_include . Ensuite, il utilise tokenizer pour récupérer le (s) $ slug (s) de la ou des fonctions get_template_part()
dans le fichier. Avec le ou les slug connus, l’action get_template_part_{$slug}
est utilisée pour obtenir les chemins de gabarit. Les chemins de modèles sont imprimés dans le pied de page du thème.
Note: Les slugs utilisés dans get_template_part()
dans les fichiers de modèle de thème doivent être une chaîne. Si le thème utilise une autre méthode pour ajouter le paramètre à la fonction (variable, constante, etc.), le slug (et donc le chemin) ne sera pas trouvé. N'utilisez pas cet exemple en production.
Display_Get_Template_Part_Path_In_Footer::on_load();
class Display_Get_Template_Part_Path_In_Footer {
static $templates = array();
public static function on_load() {
add_filter( 'template_include', array( __CLASS__, 'read_theme_template' ), 99 );
add_action( 'wp_footer', array( __CLASS__, 'wp_footer' ), 100 );
}
public static function wp_footer() {
// print templates in footer
if ( !empty( self::$templates ) ) {
echo '<pre>';
print_r( array_unique( self::$templates ) );
echo '</pre>';
} else {
echo "<p>no get_template_part() found</p>";
}
}
public static function read_theme_template( $template ) {
$tokens = token_get_all( file_get_contents( $template ) );
foreach ( $tokens as $index => $token ) {
$name = is_array( $token ) ? token_name( $token[0] ): '';
$value = is_array( $token ) ? $token[1] : $token;
if ( !( ( 'T_STRING' === $name ) && ( 'get_template_part' === $value ) ) ) {
continue;
}
// function name 'get_template_part' found, get next tokens
$next = isset( $tokens[ $index + 1 ] ) ? $tokens[ $index + 1 ] : '';
$next_id = isset( $tokens[ $index + 1 ][0] ) ? $tokens[ $index + 1 ][0] : '';
$second_next = isset( $tokens[ $index + 2 ] ) ? $tokens[ $index + 2 ] : '';
if ( '(' === $next || ( T_WHITESPACE === $next_id ) && ( '(' === $second_next ) ) {
$slug = self::get_template_slug( $tokens, $index+1 );
if ( !empty( $slug ) ) {
add_action( "get_template_part_{$slug}", array( __CLASS__, 'get_template_part' ), 15, 2 );
}
}
}
return $template;
}
// get's first T_CONSTANT_ENCAPSED_STRING ($slug argument)
public static function get_template_slug( $tokens, $index ) {
$slug = '';
$brackets = 0;
$function_tokens = array_slice( $tokens, $index );
foreach ( $function_tokens as $key => $token ) {
$name = isset( $token[0] ) ? token_name( $token[0] ) : '';
if ( $token === '(' ) {
++$brackets;
continue;
}
if ( $brackets === 0 ) {
continue;
}
if ( ( ( $token === ')' ) && ( --$brackets === 0 ) ) || ( ',' === $token ) ) {
break;
}
if ( ( 'T_CONSTANT_ENCAPSED_STRING' === $name ) ) {
$slug = sanitize_title( $token[1] );
break;
}
}
return $slug;
}
// function copied from WP Core (returns template path)
public static function get_template_part( $slug, $name = null ) {
$templates = array();
$name = (string) $name;
if ( '' !== $name )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
// get template without loading the file
self::$templates[] = locate_template( $templates, false, false );
}
}
Un moyen simple consiste à ajouter de l'écho à chaque fichier de modèle. Comme <!--folder/filename.php-->
Il est préférable d’emballer cela à l’intérieur d’un if si ce n’est affiché que pendant le débogage.