vendredi 25 septembre 2026

À propos

Contact

Tips

Filtrer la liste des articles par taxonomie avec restrict_manage_posts

Ajoutez un menu déroulant de filtre par taxonomie ou par champ personnalisé au-dessus de la liste des articles, sans extension supplémentaire.

Par Clément Hadrot • 7 mai 2024 • 3 min de lecture • Aucun commentaire
Filtrer la liste des articles par taxonomie avec restrict_manage_posts

Sur un site d’un cabinet d’avocats, plus de trois cents articles étaient classés par domaine de droit (« droit du travail », « droit des sociétés », « droit immobilier »). Retrouver les articles d’un domaine précis dans la liste d’administration obligeait à faire défiler des pages entières, la recherche texte n’étant pas toujours suffisante. La solution native de WordPress pour ce genre de besoin, le hook restrict_manage_posts, ajoute un menu déroulant directement au-dessus du tableau, à côté des filtres de date et de catégorie déjà présents.

Afficher le menu déroulant

Le hook restrict_manage_posts s’exécute juste avant l’affichage de la liste des articles et reçoit le type de contenu courant ainsi que l’emplacement (liste principale ou corbeille) :

add_action( 'restrict_manage_posts', function ( $post_type, $which ) {
    if ( 'post' !== $post_type ) {
        return;
    }

    $taxonomie = 'domaine_droit';
    $terme_selectionne = $_GET[ $taxonomie ] ?? '';

    wp_dropdown_categories( [
        'show_option_all' => __( 'Tous les domaines du droit', 'mon-theme' ),
        'taxonomy'         => $taxonomie,
        'name'             => $taxonomie,
        'orderby'          => 'name',
        'selected'         => $terme_selectionne,
        'hierarchical'     => true,
        'value_field'      => 'slug',
    ] );
}, 10, 2 );

Appliquer le filtre à la requête

Le menu déroulant affiché seul ne fait rien : encore faut-il intercepter la requête d’administration pour y ajouter la condition de taxonomie, via le filtre parse_query :

L'essentiel à retenir : Un hook pour afficher le menu, un filtre pour appliquer la requête ; Fonctionne pour une taxonomie ou un champ personnalisé ; Aucune extension nécessaire
add_action( 'parse_query', function ( $query ) {
    global $pagenow;

    if ( ! is_admin() || 'edit.php' !== $pagenow ) {
        return;
    }

    $taxonomie = 'domaine_droit';

    if ( ! empty( $_GET[ $taxonomie ] ) && $query->get( 'post_type' ) === 'post' ) {
        $query->query_vars['tax_query'] = [
            [
                'taxonomy' => $taxonomie,
                'field'    => 'slug',
                'terms'    => sanitize_text_field( $_GET[ $taxonomie ] ),
            ],
        ];
    }
} );

Adapter pour un champ personnalisé plutôt qu’une taxonomie

Le même principe s’applique à un champ personnalisé, en remplaçant le menu de taxonomie par une liste déroulante construite manuellement à partir des valeurs distinctes présentes en base, et en filtrant via meta_query plutôt que tax_query :

add_action( 'restrict_manage_posts', function ( $post_type ) {
    if ( 'dossier' !== $post_type ) {
        return;
    }

    global $wpdb;
    $statuts = $wpdb->get_col(
        "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'statut_dossier'"
    );

    $selection = $_GET['statut_dossier'] ?? '';
    echo '<select name="statut_dossier"><option value="">' . esc_html__( 'Tous les statuts', 'mon-theme' ) . '</option>';
    foreach ( $statuts as $statut ) {
        printf(
            '<option value="%1$s" %2$s>%1$s</option>',
            esc_attr( $statut ),
            selected( $selection, $statut, false )
        );
    }
    echo '</select>';
} );

Points de vigilance

  • Toujours vérifier $pagenow et le type de contenu avant d’appliquer le filtre, sous peine de casser d’autres listes d’administration du site.
  • Échapper systématiquement les valeurs issues de $_GET avant de les réinjecter dans une requête SQL directe.
  • Sur une taxonomie non hiérarchique, utiliser wp_dropdown_categories reste possible mais un menu construit à la main via get_terms() est parfois plus lisible.

Un client ne demande jamais « ajoute-moi un tax_query » ; il demande « je veux retrouver mes articles plus vite ». Le filtre par taxonomie dans la liste d’admin est souvent la réponse la plus simple à cette frustration.

En résumé

Deux hooks, restrict_manage_posts pour l’affichage et parse_query pour l’application, suffisent à transformer une liste d’articles difficile à parcourir en un tableau filtrable en un clic. Ce réglage, une fois en place, ne demande ensuite aucune maintenance particulière.

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