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 :

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
$pagenowet 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
$_GETavant de les réinjecter dans une requête SQL directe. - Sur une taxonomie non hiérarchique, utiliser
wp_dropdown_categoriesreste possible mais un menu construit à la main viaget_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.