# Stocker un champ SEO dans le term meta d’une taxonomie, sans extension

> Une page de taxonomie a besoin d'un titre et d'une description propres, distincts du nom de la catégorie. Tutoriel pour les stocker en term meta natif, sans extension SEO.

- Auteur : WordPress Développement
- Publié le : 2022-03-09
- Mis à jour le : 2022-03-09
- Catégorie : SEO &amp; GEO
- URL : https://www.wpmoderne.fr/seo/stocker-champ-seo-term-meta-taxonomie-sans-extension/

## L’essentiel

- register_term_meta déclare le champ sans table supplémentaire
- Les hooks _edit_form_fields et edited_ ajoutent le champ à l'écran d'administration
- term_description() seul ne suffit pas pour un vrai titre SEO distinct

« 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

> L'essentiel à retenir : register_term_meta déclare le champ sans table supplémentaire ; Les hooks _edit_form_fields et edited_ ajoutent le champ à l'écran d'administration ; term_description() seul ne suffit pas pour un vrai titre SEO distinct

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.
