# Template Post Type : des modèles de page ciblés par type de contenu

> L'en-tête Template Post Type, disponible depuis WordPress 4.7, et sa différence concrète avec single-{post_type}.php sur des cas réels de CPT.

- Auteur : Clément Hadrot
- Publié le : 2021-07-28
- Mis à jour le : 2021-07-28
- Catégorie : Thèmes
- URL : https://wpmoderne.dev.wordpress-developpement.fr/themes/template-post-type-notion-hierarchie/

## L’essentiel

- Un même fichier peut servir à plusieurs types de contenu
- Le choix se fait manuellement, pas par convention de nommage
- Prioritaire sur single-{post_type}.php dans la hiérarchie

Sur le site d'un cabinet d'avocats, deux types de contenu personnalisés — « Domaines d'expertise » et « Membres de l'équipe » — devaient partager exactement la même mise en page à droite d'une biographie, mais avec un contenu de colonne latérale différent selon le cas. La première tentation a été de créer deux fichiers, `single-expertise.php` et `single-membre.php`, quasiment identiques. Une meilleure solution existait depuis WordPress 4.7 : l'en-tête `Template Post Type`, qui permet d'assigner manuellement un même modèle à plusieurs types de contenu.

Cette notion reste peu connue car elle vit à la croisée de deux systèmes : les modèles de page classiques, historiquement réservés aux pages, et la hiérarchie de templates automatique basée sur le nom du type de contenu.

## Ce que change réellement Template Post Type

Avant WordPress 4.7, l'en-tête `Template Name:` ne fonctionnait que sur des fichiers destinés aux pages, sélectionnables dans le menu déroulant « Modèle » de l'écran d'édition d'une page. Il était impossible d'assigner un modèle personnalisé à un article ou à un type de contenu personnalisé de la même façon. L'ajout de la ligne `Template Post Type:` dans l'en-tête d'un fichier change cela : elle indique explicitement à quels types de contenu ce modèle doit être proposé.

```
<?php
/**
 * Template Name: Fiche détaillée
 * Template Post Type: post, expertise, membre
 */
get_header();
?>
```

Avec cet en-tête, le modèle « Fiche détaillée » apparaît dans le sélecteur de modèle de l'éditeur pour les articles, les fiches d'expertise et les fiches de membre à la fois — un seul fichier, assignable manuellement selon les besoins, plutôt que trois fichiers séparés reliés uniquement par convention de nommage.

## La différence avec single-{post_type}.php

> L'essentiel à retenir : Un même fichier peut servir à plusieurs types de contenu ; Le choix se fait manuellement, pas par convention de nommage ; Prioritaire sur single-{post_type}.php dans la hiérarchie

`single-expertise.php` s'applique automatiquement à tous les contenus du type `expertise`, sans aucune action de l'utilisateur : c'est la hiérarchie de templates classique de WordPress qui choisit ce fichier dès qu'il existe. `Template Post Type` fonctionne à l'inverse : le fichier existe, mais rien ne s'affiche automatiquement tant qu'un utilisateur ne l'a pas explicitement sélectionné dans l'éditeur pour tel ou tel contenu précis.

| Caractéristique | single-{post_type}.php | Template Post Type |
| --- | --- | --- |
| Application | Automatique pour tout le type | Manuelle, contenu par contenu |
| Réutilisable sur plusieurs types | Non, un fichier par type | Oui, une liste de types dans l'en-tête |
| Priorité dans la hiérarchie | Standard | Prioritaire s'il est sélectionné |

Quand un modèle personnalisé est assigné à un contenu via l'écran d'édition, WordPress le fait passer avant `single-{post_type}.php` dans son ordre de résolution des templates. Ce comportement suit la même logique que pour les pages classiques, où un modèle personnalisé assigné prime toujours sur `page.php`.

## Un cas d'usage concret sur les CPT du cabinet

Sur le projet du cabinet d'avocats, un seul fichier `template-fiche-detaillee.php` gère désormais l'affichage des expertises et des membres de l'équipe, avec une portion de code conditionnelle pour les quelques éléments réellement différents :

```
<?php if ( 'membre' === get_post_type() ) : ?>
	<p class="fiche-fonction"><?php echo esc_html( get_post_meta( get_the_ID(), 'fonction', true ) ); ?></p>
<?php else : ?>
	<p class="fiche-domaine"><?php echo esc_html( get_post_meta( get_the_ID(), 'domaine_juridique', true ) ); ?></p>
<?php endif; ?>
```

Toute la structure commune — colonne latérale, fil d'ariane, bloc de contact — reste écrite une seule fois, ce qui réduit fortement la duplication par rapport aux deux fichiers `single-*.php` initialement envisagés.

### Une limite à connaître

Le principal inconvénient de cette approche tient à son caractère manuel : si un rédacteur crée une nouvelle fiche d'expertise sans lui assigner explicitement le modèle « Fiche détaillée », WordPress retombe sur `single-expertise.php` s'il existe, ou sur `single.php` à défaut, sans aucun avertissement. Sur des types de contenu à fort volume, où l'assignation manuelle systématique n'est pas réaliste, `single-{post_type}.php` reste préférable précisément parce qu'il s'applique sans intervention humaine.

> Template Post Type convient aux cas où un même modèle doit couvrir plusieurs types de contenu à faible volume, jamais à un type de contenu produit en masse où l'automatisme de single-{post_type}.php reste indispensable.

## Ce qu'il faut retenir

Disponible depuis WordPress 4.7, l'en-tête `Template Post Type` reste un outil de niche, mais précieux dès qu'un modèle doit être partagé volontairement entre plusieurs types de contenu à la carte, plutôt qu'appliqué automatiquement à tout un type. La hiérarchie complète des templates, avec l'ensemble de ses règles de résolution, mérite un article dédié à part entière.
