# 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.

- Auteur : Clément Hadrot
- Publié le : 2024-05-07
- Mis à jour le : 2024-05-07
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/filtrer-liste-articles-taxonomie-restrict-manage-posts/

## L’essentiel

- 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

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.
