« Le nom de la catégorie sert de titre de page, mais ce n’est jamais le texte qu’on voudrait afficher dans les résultats de recherche. » C’est le constat de départ sur de nombreux sites WordPress dont les pages de taxonomie (catégories, étiquettes, taxonomies personnalisées) n’ont aucun champ dédié pour un titre SEO distinct du simple nom de la catégorie.
Ce tutoriel montre comment ajouter un champ de titre SEO personnalisé à l’écran d’édition d’une taxonomie, stocké en term meta natif, sans dépendre d’une extension SEO complète pour ce seul besoin.
Étape 1 : déclarer le champ avec register_term_meta
La fonction register_term_meta(), disponible depuis WordPress 4.6, déclare le champ auprès du cœur sans créer de table supplémentaire : les données sont stockées dans la table wp_termmeta déjà existante.
add_action( 'init', function() {
register_term_meta( 'category', 'titre_seo', array(
'type' => 'string',
'single' => true,
'sanitize_callback' => 'sanitize_text_field',
'show_in_rest' => true,
) );
} );
Étape 2 : ajouter le champ à l’écran d’édition

Deux hooks distincts gèrent l’affichage du champ selon le contexte : la création d’un nouveau terme et l’édition d’un terme existant. Le premier utilise l’action {$taxonomy}_add_form_fields, le second {$taxonomy}_edit_form_fields :
add_action( 'category_edit_form_fields', function( $terme ) {
$valeur = get_term_meta( $terme->term_id, 'titre_seo', true );
?>
<tr class="form-field">
<th scope="row"><label for="titre_seo">Titre SEO</label></th>
<td>
<input type="text" name="titre_seo" id="titre_seo" value="<?php echo esc_attr( $valeur ); ?>" size="60" />
</td>
</tr>
<?php
} );
Étape 3 : enregistrer la valeur à la sauvegarde
L’action edited_{$taxonomy} se déclenche après l’enregistrement du formulaire d’édition, et permet d’y récupérer la valeur postée :
add_action( 'edited_category', function( $term_id ) {
if ( isset( $_POST['titre_seo'] ) ) {
update_term_meta( $term_id, 'titre_seo', sanitize_text_field( $_POST['titre_seo'] ) );
}
} );
Étape 4 : afficher la valeur sur la page de taxonomie
Sur le gabarit category.php ou via un filtre document_title_parts, la valeur enregistrée remplace le nom brut de la catégorie quand elle est renseignée :
add_filter( 'document_title_parts', function( $parties ) {
if ( is_category() ) {
$terme = get_queried_object();
$titre_seo = get_term_meta( $terme->term_id, 'titre_seo', true );
if ( $titre_seo ) {
$parties['title'] = $titre_seo;
}
}
return $parties;
} );
Répéter l’opération pour une taxonomie personnalisée
Le même mécanisme s’applique tel quel à une taxonomie personnalisée, par exemple une taxonomie collection utilisée sur un site de vente d’articles d’artisanat. Il suffit de remplacer category par le nom réel de la taxonomie dans chacun des quatre hooks déclarés plus haut, sans modifier la structure du code :
register_term_meta( 'collection', 'titre_seo', array(
'type' => 'string',
'single' => true,
'sanitize_callback' => 'sanitize_text_field',
'show_in_rest' => true,
) );
Cette portabilité vient du fait que register_term_meta(), les hooks de formulaire et l’action de sauvegarde fonctionnent tous de façon générique, indépendamment de la taxonomie concernée.
Pourquoi term_description() seul ne suffit pas
- La fonction
term_description()renvoie le texte de description de la taxonomie, pas un titre distinct - Un titre de page et une description destinée aux résultats de recherche répondent à des contraintes de longueur différentes
- Séparer ces deux champs permet de garder une description éditoriale riche, sans la contraindre aux 60 caractères d’un titre affiché dans les résultats
Un repère utile pour ce genre de champ : le stocker en term meta natif garde les données portables, sans dépendre d’une extension qui pourrait un jour être désactivée.
En résumé
Ajouter un champ de titre SEO à une taxonomie ne demande que quatre hooks natifs de WordPress, sans recourir à une extension SEO complète pour ce seul besoin. Cette approche garde les données dans la table wp_termmeta standard, ce qui les rend facilement réutilisables ou migrables si le site évolue par la suite vers un outil de gestion SEO plus complet.