La rédaction des Éditions Faucon, une maison d’édition qui publie un magazine en ligne, fonctionnait avec un statut de relecture géré… dans un tableur partagé, en parallèle de WordPress. Chaque article validé par la rédactrice en chef devait être signalé manuellement ailleurs, avec les oublis que cela suppose. La demande initiale portait sur un plugin de gestion éditoriale complet, avec calendrier et assignation de tâches. Après discussion, le besoin réel tenait en une phrase : un indicateur visible dans l’éditeur, « à relire » ou « validé », modifiable uniquement par la rédactrice en chef.
Pourquoi un panneau de document plutôt qu’un bloc
Le statut de relecture n’est pas un contenu affiché sur la page publique : il concerne uniquement le processus interne de production. Il n’a donc pas sa place comme bloc dans le contenu de l’article, mais dans les réglages du document, aux côtés de la visibilité ou de la date de publication. C’est précisément le rôle de PluginDocumentSettingPanel, un composant qui ajoute un panneau repliable dans l’onglet « Document » de la barre latérale de l’éditeur.
Le champ meta et sa capacité de contrôle
Le statut est stocké en post meta, avec un auth_callback qui vérifie une capacité personnalisée plutôt que la capacité générique edit_posts :
add_action( 'init', function () {
register_post_meta( 'post', 'statut_relecture', [
'type' => 'string',
'single' => true,
'default' => 'a_relire',
'show_in_rest' => true,
'auth_callback' => fn() => current_user_can( 'valider_relecture' ),
'sanitize_callback' => function ( $valeur ) {
return in_array( $valeur, [ 'a_relire', 'valide' ], true )
? $valeur
: 'a_relire';
},
] );
} );
add_action( 'admin_init', function () {
$role = get_role( 'editor' );
if ( $role ) {
$role->add_cap( 'valider_relecture' );
}
} );
Sans capacité spécifique, n’importe quel contributeur aurait pu se marquer lui-même comme validé. Le panneau reste visible pour tous, mais son contrôle est verrouillé par capacité.
Le panneau côté JavaScript
Le composant s’enregistre via registerPlugin, dans un fichier séparé chargé uniquement sur l’écran d’édition, avec une dépendance sur wp-edit-post et wp-editor :
import { registerPlugin } from '@wordpress/plugins';
import { PluginDocumentSettingPanel } from '@wordpress/editor';
import { useEntityProp } from '@wordpress/core-data';
import { SelectControl } from '@wordpress/components';
const PanneauRelecture = () => {
const [meta, setMeta] = useEntityProp('postType', 'post', 'meta');
return (
<PluginDocumentSettingPanel title="Statut de relecture" icon="visibility">
<SelectControl
label="État"
value={meta.statut_relecture}
options={[
{ label: 'À relire', value: 'a_relire' },
{ label: 'Validé', value: 'valide' },
]}
onChange={(valeur) => setMeta({ ...meta, statut_relecture: valeur })}
/>
</PluginDocumentSettingPanel>
);
};
registerPlugin('editions-faucon-relecture', { render: PanneauRelecture });

Le contrôle SelectControl reste techniquement visible pour tout le monde dans l’interface ; c’est le sanitize_callback et surtout auth_callback côté serveur qui empêchent réellement l’écriture pour qui n’a pas la capacité requise, la requête REST échouant silencieusement en arrière-plan. Pour un contrôle plus honnête côté interface, un affichage conditionnel selon currentUser.capabilities reste préférable à terme, mais n’était pas prioritaire pour ce premier jet.
Un indicateur visuel dans la liste des articles
Pour que le statut soit visible sans ouvrir chaque article, une colonne personnalisée a été ajoutée à la liste des articles via manage_post_posts_columns et manage_post_posts_custom_column, affichant un badge coloré selon la valeur du meta.
- Un panneau de document convient aux métadonnées de processus, pas aux contenus affichés publiquement.
- Une capacité personnalisée protège l’écriture sans dépendre du rôle générique de l’utilisateur.
- Une colonne dans la liste des articles rend le statut visible sans ouvrir chaque brouillon.
Avant d’installer un plugin de gestion éditoriale complet, vérifiez si le besoin réel ne tient pas dans un panneau et un champ meta.
Ce que ce cas ne couvre pas
Ce panneau ne remplace pas un statut de publication personnalisé (comme un état « en attente de relecture » distinct de brouillon ou publié), qui relève d’un mécanisme différent via register_post_status et sort du périmètre de ce besoin précis, volontairement resté simple.
Notre verdict
Deux jours de développement ont remplacé un besoin qui aurait pu justifier l’achat d’un plugin de gestion éditoriale à l’abonnement mensuel, pour un besoin qui, en réalité, ne dépassait jamais un simple indicateur binaire contrôlé par capacité.