Un lycée souhaitait présenter son corps enseignant sur son nouveau site : une fiche par enseignant, avec sa matière, son niveau d’intervention (seconde, première, terminale) et une courte présentation. Face à ce besoin, plusieurs extensions d’annuaire généralistes existaient dans l’écosystème WordPress, avec leurs propres champs prédéfinis, souvent pensés pour des annuaires d’entreprise (poste, service, coordonnées directes) mal adaptés à un contexte scolaire.
Le choix : un CPT déclaré dans le thème
Plutôt que d’adapter un plugin générique à coups de filtres et de champs personnalisés ajoutés après coup, la décision a été de déclarer un type de contenu personnalisé directement dans le thème, avec exactement les champs et taxonomies nécessaires à ce cas précis :
function mon_theme_cpt_enseignant() {
register_post_type( 'enseignant', array(
'labels' => array(
'name' => 'Enseignants',
'singular_name' => 'Enseignant',
),
'public' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'enseignants' ),
'supports' => array( 'title', 'editor', 'thumbnail' ),
'menu_icon' => 'dashicons-businessman',
) );
}
add_action( 'init', 'mon_theme_cpt_enseignant' );
Deux taxonomies plutôt que des champs libres
La matière et le niveau d’intervention ont été modélisés en taxonomies plutôt qu’en simples champs de texte, pour permettre le filtrage de l’annuaire par matière ou par niveau sans logique de recherche supplémentaire à coder :
function mon_theme_taxonomies_enseignant() {
register_taxonomy( 'matiere', 'enseignant', array(
'labels' => array( 'name' => 'Matières' ),
'hierarchical' => false,
'public' => true,
'rewrite' => array( 'slug' => 'matiere' ),
) );
register_taxonomy( 'niveau_intervention', 'enseignant', array(
'labels' => array( 'name' => 'Niveaux' ),
'hierarchical' => true,
'public' => true,
'rewrite' => array( 'slug' => 'niveau' ),
) );
}
add_action( 'init', 'mon_theme_taxonomies_enseignant' );

Le template d’archive de l’annuaire
Un fichier archive-enseignant.php, propre au thème, affiche la liste complète avec un filtre par matière construit à partir des termes réellement utilisés, sans dépendre d’un shortcode de plugin qui aurait imposé sa propre structure HTML :
<?php get_header(); ?>
<div class="annuaire-filtres">
<?php
$matieres = get_terms( array( 'taxonomy' => 'matiere', 'hide_empty' => true ) );
foreach ( $matieres as $matiere ) {
printf(
'<a href="%s">%s</a>',
esc_url( get_term_link( $matiere ) ),
esc_html( $matiere->name )
);
}
?>
</div>
<div class="annuaire-liste">
<?php while ( have_posts() ) : the_post(); ?>
<article>
<?php the_post_thumbnail( 'medium' ); ?>
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
</div>
<?php get_footer(); ?>
Un champ complémentaire pour les matières multiples
Certains enseignants intervenant sur plusieurs matières (histoire et géographie, par exemple), la taxonomie matiere a été déclarée non hiérarchique et autorisant plusieurs termes par fiche, contrairement à une catégorie unique qui aurait obligé à choisir arbitrairement une seule matière principale par enseignant.
Résultat après mise en production
Sur les 48 fiches enseignants créées à l’ouverture du site, la direction du lycée a pu gérer elle-même les ajouts et départs en cours d’année scolaire directement depuis l’administration WordPress standard, sans formation particulière au-delà de la prise en main classique de l’écriture d’un article, puisque l’interface de saisie d’une fiche enseignant reprend exactement les mêmes mécanismes qu’un article de blog.
Ce que ce cas ne couvre pas
Ce projet ne comprenait ni gestion des inscriptions des élèves, ni espace élève sécurisé avec authentification, deux besoins portés par un logiciel de vie scolaire distinct déjà en place dans l’établissement, sans lien avec le site vitrine et son annuaire.
En résumé
Pour un besoin d’annuaire aussi spécifique que celui d’un établissement scolaire, un type de contenu et des taxonomies déclarés directement dans le thème ont offert une structure de données exactement adaptée au contexte, avec une prise en main immédiate par l’équipe de direction, sans les compromis d’un plugin d’annuaire pensé pour un usage plus générique.