Si vous avez déjà eu un contributeur “invisible” (auteur fantôme, traducteur non crédité, éditeur qui ne veut pas de compte) et que vous vous êtes retrouvé à bricoler des rôles ou des comptes partagés, WordPress a bougé sur un point précis : la manière dont on met en avant des personnes sans leur donner plus d’accès que nécessaire.

Ce qui change

Depuis WordPress 6.9 (et donc pleinement pertinent sur WordPress 6.9.4 en avril 2026), l’équipe core et l’écosystème Gutenberg poussent plus fort une idée qui traînait depuis longtemps côté éditeurs et équipes : “Elevating Individuals” n’est pas un slogan marketing, c’est une direction produit. Concrètement, on voit apparaître (ou se stabiliser) des primitives et des patterns qui permettent de créditer, présenter et gérer des identités (auteurs, co-auteurs, éditeurs, traducteurs, invités) sans tomber dans les anti-patterns classiques : comptes partagés, rôle “Auteur” trop large, ou plugins qui écrivent directement dans post_author sans garde-fous.

Ce mouvement se traduit par trois zones de changement que j’ai vu remonter dans les projets en 2025–2026 :

  • Modélisation : dissocier “personne affichée” et “compte WordPress qui a le droit d’éditer”.
  • UI / Éditeur : rendre la sélection/affichage d’identités plus cohérente dans l’éditeur de blocs (y compris les templates FSE).
  • API / Interop : standardiser la façon dont les thèmes et plugins lisent et affichent ces infos (éviter les implémentations cassantes).

Côté sources officielles, gardez sous la main :

Point de vigilance : “Elevating Individuals” est une thématique transversale. Il n’existe pas un unique ticket Trac “officiel” qui résume tout. Dans la pratique, vous allez croiser des changements au fil des versions (core et Gutenberg) qui touchent aux auteurs, à l’affichage des profils, et aux permissions. Mon conseil : traitez ça comme une migration de modèle de données et non comme “une option d’interface”.


Résumé rapide

  • Objectif : mettre en avant des personnes (byline, bio, réseaux, rôle éditorial) sans leur donner un compte admin/auteur par défaut.
  • Changement concret : on évite de surcharger post_author; on passe par des meta (post meta) ou une taxonomie “personne”, avec rendu contrôlé.
  • Pour les blogueurs : co-auteurs, invités, fiches auteur propres, meilleure cohérence dans les templates FSE.
  • Pour les devs : besoin d’un contrat (API interne) pour lire/écrire les crédits, et de sécuriser l’édition (capabilities + nonces).
  • Risque principal : casser le SEO/les archives auteur si vous migrez sans redirections et sans stratégie de canonical.
  • À faire : standardiser votre modèle (personnes vs comptes), ajouter une couche d’affichage, et tester avec cache + page builder.

Avant / Après en code

Le “avant” que je vois le plus souvent chez des sites WordPress intermédiaires : on détourne post_author ou on crée des comptes WordPress juste pour afficher un nom.

Avant (anti-pattern) : forcer post_author pour un auteur invité

Ça a l’air simple, mais vous mélangez identité affichée et permissions. Et vous vous exposez à des effets de bord (archives auteur, REST API, permissions, notifications).

<?php
/**
 * Anti-pattern : modifier l'auteur WordPress "réel" pour gérer un auteur invité.
 * Problèmes : permissions, archives auteur, audit, SEO, confusion dans l'admin.
 */
add_action('save_post', function ($post_id, $post, $update) {
    // Mauvais : pas de nonce, pas de capability, et déclenché sur autosave/révisions
    if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
        return;
    }

    // Exemple : on force l'auteur à l'utilisateur ID 2 (compte "Invité")
    wp_update_post([
        'ID'          => $post_id,
        'post_author' => 2,
    ]);
}, 10, 3);
?>

Après (pattern “Elevating Individuals”) : dissocier “compte éditeur” et “personne créditée”

Approche robuste : vous gardez post_author comme “compte WordPress responsable” (audit, permissions), et vous stockez les personnes créditées dans une structure dédiée. Pour rester simple et compatible, je recommande souvent :

  • Taxonomie person (publique ou semi-publique) pour les “profils” réutilisables.
  • Post meta pour la relation (IDs de termes, ordre, rôle d’affichage).

Exemple minimal : créer une taxonomie “Personnes” et enregistrer une meta byline_person_ids (tableau d’IDs de termes) exposée REST pour l’éditeur.

<?php
/**
 * Pattern : taxonomie "person" + post meta "byline_person_ids".
 * Compatible WordPress 6.9.4+ / PHP 8.1+.
 */
add_action('init', function () {
    register_taxonomy('person', ['post'], [
        'label'             => 'Personnes',
        'public'            => true,
        'show_in_rest'      => true, // Utile si vous voulez une UI dans l'éditeur via REST
        'show_admin_column' => true,
        'rewrite'           => ['slug' => 'personne'],
        'capabilities'      => [
            // Optionnel : vous pouvez affiner qui peut gérer les profils
            'manage_terms' => 'edit_users',
            'edit_terms'   => 'edit_users',
            'delete_terms' => 'edit_users',
            'assign_terms' => 'edit_posts',
        ],
    ]);
});

add_action('init', function () {
    register_post_meta('post', 'byline_person_ids', [
        'type'              => 'array',
        'single'            => true,
        'show_in_rest'      => [
            'schema' => [
                'type'  => 'array',
                'items' => ['type' => 'integer'],
            ],
        ],
        'auth_callback'     => function () {
            // Sécurité : seuls les utilisateurs pouvant éditer des posts peuvent modifier
            return current_user_can('edit_posts');
        },
        'sanitize_callback' => function ($value) {
            // On force un tableau d'entiers uniques
            if (!is_array($value)) {
                return [];
            }
            $value = array_map('absint', $value);
            $value = array_values(array_unique(array_filter($value)));
            return $value;
        },
        'default'           => [],
    ]);
});

/**
 * Rendu front : utiliser la byline si présente, sinon fallback sur l'auteur WP.
 */
function bpcab_get_byline_html(int $post_id): string {
    $person_ids = get_post_meta($post_id, 'byline_person_ids', true);
    if (!is_array($person_ids) || $person_ids === []) {
        $author_id = (int) get_post_field('post_author', $post_id);
        $name = get_the_author_meta('display_name', $author_id);
        return '<span class="byline">' . esc_html($name) . '</span>';
    }

    $names = [];
    foreach ($person_ids as $term_id) {
        $term = get_term($term_id, 'person');
        if ($term && !is_wp_error($term)) {
            $names[] = esc_html($term->name);
        }
    }

    if ($names === []) {
        return '';
    }

    return '<span class="byline">' . implode(', ', $names) . '</span>';
}
?>

Ce que ça change vraiment

  • Audit : le compte WordPress qui édite reste traçable via post_author.
  • Affichage : vous pouvez créditer 1, 2, 5 personnes, et gérer un ordre.
  • Interop : vous pouvez exposer la donnée à l’éditeur via REST, et l’utiliser dans un bloc, un pattern, ou un page builder.

Impact concret

Pour les blogueurs (intermédiaires)

Vous gagnez une flexibilité que WordPress “pur” n’a jamais vraiment eue nativement : afficher des co-auteurs, des invités, une rédaction (“Équipe éditoriale”), ou même un traducteur, sans créer 10 comptes WordPress. Sur des blogs multi-auteurs, c’est souvent le point qui réduit le plus les frictions.

J’ai souvent vu le problème sur des sites où la rédaction utilise un compte “Rédaction” partagé. Le jour où vous devez auditer “qui a modifié quoi”, c’est trop tard.

Pour les développeurs et agences

Vous devez formaliser un mini “contrat” : où vit la donnée “personne”, comment elle se gère, et comment elle se rend. Si vous laissez chaque plugin faire sa sauce (un en post meta, un en user meta, un en shortcodes), vous allez vous retrouver avec des templates ingérables.

  • Plugins existants : ceux qui supposent “1 post = 1 auteur” peuvent afficher des infos incohérentes (widgets “Articles de l’auteur”, breadcrumbs, JSON-LD).
  • Thèmes classiques : vous devrez remplacer the_author()/get_the_author_meta() dans vos templates par votre couche “byline”.
  • Thèmes FSE (block themes) : vous devrez gérer le rendu via un bloc (custom) ou via un pattern qui consomme la meta.

Impact sur Divi 5, Elementor, Avada

Les page builders ne “comprennent” pas automatiquement votre modèle de byline. Mais ils s’intègrent bien si vous leur donnez une sortie stable (shortcode, bloc, ou widget).

  • Divi 5 : vous pouvez afficher la byline via un module “Code” ou un module “Texte” avec shortcode. Divi cache parfois agressivement : après migration, videz le cache Divi et le cache serveur.
  • Elementor : utilisez un widget “Shortcode” ou un “Dynamic Tag” si vous mappez la meta. Attention : certains thèmes + Elementor mettent en cache le template, donc testez sur plusieurs posts.
  • Avada (Fusion Builder) : un élément “Code Block” ou “Shortcode” suffit. Avada a ses propres options SEO/Schema : vérifiez que la byline ne duplique pas le balisage auteur.

Exemple : un shortcode stable, utilisable partout (éditeur classique, bloc Shortcode, Divi, Elementor, Avada).

<?php
/**
 * Shortcode [byline] pour afficher les personnes créditées.
 * Utile pour les page builders et les templates.
 */
add_shortcode('byline', function ($atts) {
    $post_id = get_the_ID();
    if (!$post_id) {
        return '';
    }
    return bpcab_get_byline_html((int) $post_id);
});
?>

Risques, compatibilités et points de vigilance

Ce qui est nouveau vs ce qui change

  • Nouveau (approche) : on privilégie des structures de données qui représentent des “personnes” indépendamment des comptes WP.
  • Change (pratiques) : on arrête de “tricher” avec post_author et des comptes partagés.
  • Peut casser : archives auteur, SEO (schema Author), widgets “articles de l’auteur”, pages “À propos de l’auteur”, et parfois des filtres REST côté headless.

Risques SEO (le vrai piège)

Si vous migrez d’un modèle “auteur WP” vers “personne taxonomie”, vous pouvez perdre :

  • les URLs d’archives auteur (/author/nom/) si elles étaient indexées,
  • le balisage JSON-LD (Author) généré par votre thème/SEO plugin,
  • les liens internes vers les pages auteur.

Je recommande de décider explicitement :

  • soit vous conservez les archives auteur WP et vous faites correspondre “personne” → “user” (plus complexe),
  • soit vous créez des pages “Personne” (taxonomie) et vous mettez des redirections 301 depuis les anciennes archives auteur.

Compatibilité cache et rendu

Erreur réaliste : vous migrez, vous testez, et “rien ne change”. Le problème vient souvent du cache :

  • cache de page (plugin / serveur),
  • cache d’assets (CSS/JS),
  • cache builder (Divi/Elementor/Avada),
  • OPcache PHP côté serveur.

Après une migration de byline, je vide systématiquement cache navigateur + cache builder + cache serveur, puis je reteste en navigation privée.

Sécurité et permissions

Le risque est simple : si vous exposez byline_person_ids via REST sans auth_callback strict, n’importe qui peut modifier les crédits. Sur un site média, c’est un incident réel (usurpation de signature).

Autre erreur fréquente : utiliser un hook inadapté (ex. init vs rest_api_init) ou enregistrer la meta trop tard. Résultat : la meta n’apparaît pas dans REST et votre UI JS “ne voit rien”.

Timeline de dépréciation (pragmatique)

WordPress core ne “déprécie” pas post_author (ça n’arrivera pas). La dépréciation est surtout fonctionnelle : de plus en plus d’outils (blocs, patterns, templates) supposent que l’identité affichée peut être autre chose qu’un user unique. Votre code “1 auteur = 1 user” continuera de tourner, mais il sera de moins en moins aligné avec les besoins éditoriaux.


Comment migrer

Je vous propose une migration en 6 étapes qui marche bien sur des sites existants, sans bloquer la prod. Le principe : on ajoute le nouveau modèle, on rend compatible, puis on bascule progressivement.

Étape 1 — Sauvegarde et environnement de test

  • Clonez la base et les uploads sur une préprod.
  • Vérifiez PHP 8.1+ (sinon, vous allez perdre du temps sur des erreurs “bêtes”).
  • Figez les mises à jour plugins pendant la migration (sinon vous ne saurez plus ce qui a changé).

Étape 2 — Créer la taxonomie “person” et la meta

Reprenez le code “Après” plus haut, idéalement dans un mini-plugin (plutôt que functions.php). Erreur réaliste : copier le code au mauvais endroit (un plugin de snippets qui s’exécute trop tard, ou un thème parent au lieu du thème enfant).

Mini-plugin (structure conseillée) :

wp-content/plugins/byline-persons/byline-persons.php

Étape 3 — Créer les “personnes” à partir des auteurs existants

Vous pouvez faire une migration progressive : créer un terme “person” pour chaque user qui a publié, puis remplir byline_person_ids avec ce terme.

Exemple WP-CLI (recommandé). Attention : testez d’abord sur un petit lot.

<?php
/**
 * Commande WP-CLI : wp byline migrate
 * Crée des termes "person" pour les auteurs existants et renseigne byline_person_ids.
 * À placer dans un plugin mu-plugin ou un plugin standard chargé en CLI.
 */
if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('byline migrate', function () {
        $args = [
            'post_type'      => 'post',
            'post_status'    => 'any',
            'posts_per_page' => -1,
            'fields'         => 'ids',
        ];
        $post_ids = get_posts($args);

        foreach ($post_ids as $post_id) {
            $post_id = (int) $post_id;

            // Si déjà migré, on saute
            $existing = get_post_meta($post_id, 'byline_person_ids', true);
            if (is_array($existing) && $existing !== []) {
                continue;
            }

            $author_id = (int) get_post_field('post_author', $post_id);
            if ($author_id <= 0) {
                continue;
            }

            $display = get_the_author_meta('display_name', $author_id);
            if (!$display) {
                $display = 'Auteur #' . $author_id;
            }

            // Crée ou récupère le terme "person" correspondant
            $slug = sanitize_title($display);
            $term = term_exists($slug, 'person');
            if (!$term) {
                $created = wp_insert_term($display, 'person', [
                    'slug' => $slug,
                ]);
                if (is_wp_error($created)) {
                    WP_CLI::warning("Impossible de créer la personne pour {$display} (post {$post_id})");
                    continue;
                }
                $term_id = (int) $created['term_id'];
            } else {
                $term_id = (int) (is_array($term) ? $term['term_id'] : $term);
            }

            update_post_meta($post_id, 'byline_person_ids', [$term_id]);
        }

        WP_CLI::success('Migration byline terminée.');
    });
}
?>

Pièges fréquents :

  • oublier un point-virgule et casser tout WP-CLI,
  • lancer sur production sans sauvegarde,
  • ne pas filtrer les types de contenus (vous migrez aussi des pages/produits sans le vouloir).

Étape 4 — Basculer l’affichage sans casser le thème

Sur un thème classique, remplacez votre rendu auteur par votre fonction “byline”. Exemple :

<?php
// Avant : the_author();
echo bpcab_get_byline_html(get_the_ID());
?>

Sur un thème FSE, vous avez trois options réalistes :

  • un bloc custom (propre, mais plus long),
  • un pattern avec shortcode [byline] (rapide, acceptable),
  • un hook de rendu si votre thème/stack le permet (variable selon thèmes).

Étape 5 — Adapter le SEO/Schema

Si vous utilisez un plugin SEO, vérifiez comment il génère author dans le schema. Si vous affichez une byline multiple mais que le schema reste “user unique”, vous envoyez un signal incohérent.

Je ne fournis pas ici de code “universel” car ça dépend fortement du plugin SEO, mais votre check-list est stable :

  • la byline affichée correspond au balisage schema,
  • les pages “personne” (taxonomie) ont un title et une meta description corrects,
  • si vous redirigez des archives auteur, faites-le en 301, pas en 302.

Étape 6 — Vérifier avec un tableau de diagnostic

Symptôme Cause probable Vérification Solution
La byline n’apparaît pas dans l’éditeur / REST Meta non enregistrée avec show_in_rest ou chargée trop tard GET /wp-json/wp/v2/posts/<id> et cherchez byline_person_ids Enregistrer la meta sur init (ou plus tôt), vérifier show_in_rest et auth_callback
La byline front ne change pas Cache page/builder Tester en navigation privée + vider cache plugin + cache Divi/Elementor/Avada Purger tous les caches, invalider CDN si besoin
Erreur 500 après ajout du snippet Code copié au mauvais endroit / syntaxe PHP Logs PHP, activer WP_DEBUG_LOG en préprod Mettre dans un plugin, corriger la syntaxe, vérifier PHP 8.1+
Les archives auteur ne correspondent plus Vous affichez “personne” mais les liens pointent vers /author/ Inspecter les liens byline et les templates Créer des pages taxonomie “personne” et redirections 301, ou conserver le modèle user
Un contributeur peut modifier les crédits Permissions trop larges sur la meta/taxonomie Tester avec un rôle “Contributeur” Durcir auth_callback, revoir capabilities de la taxonomie, ajouter nonces dans l’UI

Faut-il agir maintenant ou attendre ?

Si votre site est mono-auteur, vous pouvez attendre. Vous ne gagnez pas grand-chose à ajouter une couche “personne” si vous ne l’utilisez pas.

Si votre site a au moins une de ces caractéristiques, agissez maintenant (sur préprod) :

  • co-auteurs fréquents, auteurs invités, contenus sponsorisés avec signature spécifique,
  • équipe éditoriale qui ne veut pas multiplier les comptes WP,
  • refonte FSE / passage à un block theme,
  • besoin d’audit (qui a édité vs qui est crédité).

Dans mon expérience, plus vous attendez, plus vous accumulez des “exceptions” (posts signés différemment, comptes partagés, règles SEO spécifiques). La migration devient ensuite une opération SEO à haut risque au lieu d’un simple refactor.


Conseils de maintenance

  • Testez à chaque release WordPress (6.9.x → 6.10) : éditeur + REST + rendu front. Les régressions se voient vite sur la meta exposée.
  • Ajoutez des tests de non-régression si vous avez une stack CI : au minimum, un test qui vérifie que byline_person_ids est présent dans REST et que le rendu n’est pas vide.
  • Documentez votre contrat interne (README) : “la byline se lit ici, se modifie comme ça”. Ça évite qu’un dev ajoute un second champ “author_name” ailleurs.
  • Surveillez les performances : si vous affichez la byline sur des listes (home, catégories), évitez un get_term() en boucle sans cache. Utilisez un cache objet persistant si possible.
  • Évitez les hooks trop globaux (ex. the_content) pour injecter une signature : ça casse souvent les builders et les extraits. Préférez le template ou un bloc dédié.

Optimisation simple si vous affichez la byline sur des boucles : précharger les termes et limiter les requêtes.

<?php
/**
 * Exemple simple : réduire les appels get_term() en boucle.
 * Ici, on met en cache (statique) les termes déjà chargés.
 */
function bpcab_get_person_term_name_cached(int $term_id): ?string {
    static $cache = [];

    if (array_key_exists($term_id, $cache)) {
        return $cache[$term_id];
    }

    $term = get_term($term_id, 'person');
    if (!$term || is_wp_error($term)) {
        $cache[$term_id] = null;
        return null;
    }

    $cache[$term_id] = $term->name;
    return $cache[$term_id];
}
?>

Ressources


FAQ

“Elevating Individuals”, c’est une fonctionnalité WordPress 6.9.4 ?

Non, pas un bouton unique. C’est une direction qui se matérialise via des changements dispersés (éditeur, patterns, REST, templates) et surtout via de meilleures pratiques : séparer identité affichée et compte WordPress.

Est-ce que je dois absolument créer une taxonomie “person” ?

Non. Vous pouvez aussi utiliser un custom post type “person”. La taxonomie est souvent plus simple pour des profils légers (nom + slug + quelques metas). Le CPT devient intéressant si vous avez des champs riches, des blocs, des relations, et une page profil complexe.

Pourquoi ne pas utiliser uniquement des users WordPress ?

Parce que “afficher une signature” et “donner le droit d’éditer” sont deux besoins différents. Créer des users pour des invités augmente la surface d’attaque (comptes inutilisés, mots de passe, reset) et complique l’audit.

Est-ce compatible avec les thèmes FSE ?

Oui, mais vous devez décider comment vous rendez la byline : shortcode, bloc custom, ou pattern. Le shortcode est le plus rapide, le bloc custom est le plus propre à long terme.

Mon plugin SEO met déjà l’auteur dans le schema. Que faire ?

Vérifiez la cohérence. Si la byline affiche plusieurs personnes, mais que le schema n’en affiche qu’une, vous aurez un décalage. Selon votre plugin SEO, vous pourrez filtrer le schema ou choisir une seule personne “principale”. Testez dans l’outil de test des résultats enrichis.

Ça casse les archives /author/ ?

Pas automatiquement, mais vous allez probablement vouloir des pages “personne” à la place. Si vos archives auteur sont indexées, prévoyez des redirections 301 et une stratégie canonical.

Je ne vois pas la meta dans l’éditeur. Pourquoi ?

Le cas le plus courant : register_post_meta() n’a pas show_in_rest, ou l’auth_callback renvoie false pour votre rôle, ou votre code est chargé trop tard. Vérifiez la réponse REST du post.

Je peux stocker les IDs de personnes dans un champ ACF à la place ?

Oui, mais faites attention à l’interop. Si ACF stocke une structure différente, vous devrez maintenir une couche d’adaptation. Sur des stacks avec page builders, un post meta standard (array d’entiers) est souvent plus simple à consommer partout.

Quelle est l’erreur la plus fréquente pendant la migration ?

Modifier l’affichage dans un endroit, mais oublier un autre (ex. template single OK, mais cartes d’articles, widgets, Open Graph, JSON-LD). Faites une liste de tous les endroits où l’auteur apparaît.

Dois-je régénérer les permaliens ?

Si vous ajoutez une réécriture (rewrite) pour la taxonomie “personne”, oui : allez dans Réglages → Permaliens et enregistrez. C’est un grand classique : “ça 404” juste parce que les règles ne sont pas flush.