vendredi 25 septembre 2026

À propos

Contact

Tips

Un widget de tableau de bord qui résume les brouillons en attente par auteur

Pour une rédactrice en chef, voir d'un coup d'œil qui a des brouillons en souffrance vaut mieux que de fouiller la liste des articles filtrée auteur par auteur.

Par Clément Hadrot • 8 novembre 2024 • 5 min de lecture • Aucun commentaire
Un widget de tableau de bord qui résume les brouillons en attente par auteur

Une rédactrice en chef d’un magazine spécialisé en cuisine me demandait, chaque lundi matin, de lui dire combien de brouillons chaque pigiste avait en cours, une information qu’elle allait chercher manuellement en filtrant la liste des articles auteur par auteur, six fois de suite. Un widget de tableau de bord qui affiche cette synthèse au chargement de l’écran d’accueil de l’administration lui a fait gagner ce rituel hebdomadaire fastidieux.

WordPress permet d’ajouter un widget personnalisé au tableau de bord avec wp_add_dashboard_widget(), une fonction simple qui ne demande qu’un identifiant, un titre et une fonction de rendu.

Déclarer le widget

add_action( 'wp_dashboard_setup', function () {
    if ( ! current_user_can( 'edit_others_posts' ) ) {
        return;
    }

    wp_add_dashboard_widget(
        'magazine_brouillons_par_auteur',
        'Brouillons en attente par rédacteur',
        'magazine_afficher_widget_brouillons'
    );
} );

La vérification current_user_can( 'edit_others_posts' ) est essentielle : ce widget n’a de sens que pour quelqu’un qui supervise le travail de plusieurs personnes. L’ajouter pour un simple contributeur qui ne voit que ses propres contenus n’apporterait rien et exposerait inutilement une information sur le travail des autres.

Regrouper les brouillons par auteur

L'essentiel à retenir : wp_add_dashboard_widget pour un widget sur mesure ; Regrouper les brouillons par auteur avec une seule requête ; Des liens directs vers la liste filtrée, pas juste des chiffres

Plutôt que de lancer une requête par auteur (ce qui multiplierait les appels à la base sans nécessité), une seule requête get_posts() récupère tous les brouillons, puis un simple regroupement en PHP les classe par auteur :

function magazine_afficher_widget_brouillons() {
    $brouillons = get_posts( array(
        'post_type'      => 'post',
        'post_status'    => 'draft',
        'posts_per_page' => -1,
        'orderby'        => 'modified',
        'order'          => 'DESC',
    ) );

    if ( empty( $brouillons ) ) {
        echo '<p>Aucun brouillon en attente pour le moment.</p>';
        return;
    }

    $par_auteur = array();

    foreach ( $brouillons as $brouillon ) {
        $par_auteur[ $brouillon->post_author ][] = $brouillon;
    }

    echo '<ul>';

    foreach ( $par_auteur as $id_auteur => $liste ) {
        $auteur = get_userdata( $id_auteur );
        $nom    = $auteur ? $auteur->display_name : 'Auteur supprimé';
        $lien   = add_query_arg( array(
            'post_status' => 'draft',
            'author'      => $id_auteur,
        ), admin_url( 'edit.php' ) );

        printf(
            '<li><a href="%s">%s</a> — %d brouillon(s)</li>',
            esc_url( $lien ),
            esc_html( $nom ),
            count( $liste )
        );
    }

    echo '</ul>';
}

Signaler les brouillons les plus anciens

Un simple décompte ne suffisait pas totalement : la rédactrice en chef voulait surtout repérer les brouillons oubliés depuis longtemps, pas seulement leur nombre. On enrichit donc la boucle avec la date de dernière modification du brouillon le plus ancien de chaque auteur :

foreach ( $par_auteur as $id_auteur => $liste ) {
    usort( $liste, function ( $a, $b ) {
        return strtotime( $a->post_modified ) <=> strtotime( $b->post_modified );
    } );

    $plus_ancien = $liste[0];
    $jours       = (int) ( ( time() - strtotime( $plus_ancien->post_modified ) ) / DAY_IN_SECONDS );

    if ( $jours > 14 ) {
        echo ' <span style="color:#b32d2e;">(dont un brouillon vieux de ' . $jours . ' jours)</span>';
    }
}

Limiter aux types de contenu pertinents

Sur ce magazine, seuls les articles de blog passaient par ce circuit de rédaction ; les fiches recettes, gérées par un autre type de post avec un flux de validation distinct, n’avaient pas besoin d’apparaître ici. Le filtre sur post_type => 'post' dans la requête évite de mélanger les deux flux dans le même widget, ce qui aurait rendu la synthèse moins lisible.

Placer le widget en haut du tableau de bord

Par défaut, un nouveau widget de tableau de bord s’ajoute en bas de la colonne. Pour qu’il soit visible sans défilement, on peut le repositionner en manipulant directement le tableau global des widgets, une astuce peu documentée mais fiable :

add_action( 'wp_dashboard_setup', function () {
    global $wp_meta_boxes;

    $widget = $wp_meta_boxes['dashboard']['normal']['core']['magazine_brouillons_par_auteur'] ?? null;

    if ( $widget ) {
        unset( $wp_meta_boxes['dashboard']['normal']['core']['magazine_brouillons_par_auteur'] );
        $wp_meta_boxes['dashboard']['normal']['core'] = array( 'magazine_brouillons_par_auteur' => $widget )
            + $wp_meta_boxes['dashboard']['normal']['core'];
    }
}, 20 );
  • Vérifiez toujours la capacité de l’utilisateur avant d’afficher des informations sur le travail des autres membres de l’équipe.
  • Limitez le nombre de brouillons chargés si le site a un très gros volume de contenu, avec une pagination simple dans le widget si besoin.
  • Testez le rendu quand un auteur a été supprimé du site : get_userdata() peut renvoyer false.

Sur les projets éditoriaux à plusieurs contributeurs, un widget de tableau de bord bien ciblé remplace souvent un rapport envoyé par email chaque semaine : l’information est disponible au moment où la personne se connecte, pas seulement quand quelqu’un pense à l’envoyer.

À vous de jouer

Ce widget reste volontairement simple : une requête, un regroupement, quelques liens directs. Il peut s’enrichir selon les besoins réels de l’équipe (filtrage par catégorie, alerte par email au-delà d’un certain nombre de jours), mais l’essentiel tient déjà dans cette structure de base, qui règle concrètement le problème du suivi manuel répétitif.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi