<body <?php body_class(); ?>> : cette ligne, présente dans presque tous les gabarits d’en-tête depuis des années, génère déjà bien plus qu’une seule classe CSS. Type de page, identifiant de l’article, statut de connexion, format du contenu : la liste est longue, et pourtant beaucoup de développeurs de thème l’ignorent et rajoutent une classe générique en dur dans le fichier de gabarit, ce qui oblige à dupliquer une condition PHP à chaque endroit où elle est nécessaire.
Les deux fonctions acceptent pourtant un paramètre pour ajouter des classes supplémentaires, et le cœur expose des filtres pour les enrichir dynamiquement depuis functions.php, sans toucher au gabarit lui-même. Cette distinction change la façon de structurer le CSS d’un thème : au lieu de multiplier les sélecteurs par ID, on cible un contexte précis grâce à une classe déjà présente ou ajoutée proprement.
Ce que body_class() ajoute déjà, sans rien configurer
Sur une page d’article, body_class() ajoute automatiquement des classes comme single, single-post, postid-42, logged-in si l’utilisateur est connecté, ou encore page-template-default sur une page qui n’utilise pas de modèle particulier. Sur l’accueil, on retrouve home et blog. Sur une archive de taxonomie, la classe reprend le nom de la taxonomie et du terme, par exemple category-actualites. Toute cette information est disponible sans écrire une seule ligne de condition dans le gabarit.
Ajouter une classe additionnelle sans filtre, en argument direct
La méthode la plus simple pour ajouter une classe ponctuelle consiste à passer un tableau en argument de la fonction, directement dans le fichier de gabarit :
<body <?php body_class( 'theme-vitrine-artisan' ); ?>>

Le tableau de classes du cœur n’est jamais remplacé : la classe personnalisée s’ajoute à la suite, sans rien retirer de ce que WordPress génère déjà. La même logique s’applique à post_class(), utilisée dans la boucle :
<article <?php post_class( 'carte-article' ); ?>>
<?php the_title( '<h2>', '</h2>' ); ?>
</article>
Ajouter une classe conditionnelle via le filtre body_class
Quand la classe doit dépendre d’une condition (un champ personnalisé, une page précise, un rôle utilisateur), il est préférable de passer par le filtre body_class plutôt que de multiplier les conditions dans le gabarit :
add_filter( 'body_class', function ( array $classes ): array {
if ( is_page( 'tarifs' ) ) {
$classes[] = 'page-tarifs-sombre';
}
return $classes;
} );
Le même mécanisme existe pour post_class, avec un second paramètre qui reçoit l’ID de l’article :
add_filter( 'post_class', function ( array $classes, array $extra, int $post_id ): array {
if ( get_post_meta( $post_id, 'article_a_la_une', true ) ) {
$classes[] = 'article-a-la-une';
}
return $classes;
}, 10, 3 );
Cibler un contexte en CSS sans réécrire le balisage HTML
Une fois ces classes disponibles, le CSS peut cibler un contexte précis sans jamais modifier la structure des templates. Une carte d’article standard et une carte mise en avant partagent le même balisage <article>, seule la classe change :
.carte-article { padding: 1.5rem; border-radius: 6px; }
.article-a-la-une { border: 2px solid var(--couleur-accent); }
Ce découplage évite d’avoir à créer un gabarit dédié dans page-tarifs-sombre.php uniquement pour changer une couleur de fond : une règle CSS ciblée suffit.
Les pièges à éviter avec ces deux fonctions
- Ne jamais utiliser
echodevantbody_class()oupost_class(): les deux fonctions affichent déjà leur résultat directement. - Le tableau de classes accepté en argument peut être une chaîne unique ou un tableau de plusieurs chaînes, mais jamais une classe contenant des espaces : chaque espace crée une classe CSS distincte.
- Un filtre
body_classmal protégé peut ajouter la même classe plusieurs fois si la condition est vérifiée à plusieurs endroits ; unarray_unique()avant le retour évite les doublons dans le HTML final.
En résumé
Avant d’écrire une nouvelle condition PHP dans un gabarit pour distinguer un contexte d’un autre, il vaut la peine de vérifier si body_class() ou post_class() ne fournissent pas déjà l’information, ou si un filtre ne permet pas de l’ajouter proprement depuis functions.php. Le gain n’est pas seulement stylistique : un thème qui s’appuie sur ces classes reste lisible pour n’importe quel développeur qui reprend le projet, sans devoir remonter la logique de chaque gabarit un par un.