Par défaut, la liste des articles affiche titre, auteur, catégories, dates. Mais dès qu’un site gère des métadonnées métier (prix, statut d’un dossier, niveau de priorité), il devient vite indispensable de les rendre visibles sans ouvrir chaque fiche une à une.
Les deux hooks à connaître
Pour un type de contenu donné, on filtre d’abord la liste des en-têtes avec manage_{post_type}_posts_columns, qui reçoit un tableau associatif slug => libellé à compléter. Ensuite, l’action manage_{post_type}_posts_custom_column reçoit le nom de la colonne et l’identifiant de la ligne, à charge pour vous d’échapper et d’afficher la valeur voulue.
Pour rendre une colonne triable, il faut en plus déclarer son slug via le filtre manage_edit-{post_type}_sortable_columns, puis intercepter la requête avec le hook pre_get_posts pour définir orderby et meta_key.
Exemple
<?php
add_filter( 'manage_produit_posts_columns', function ( $cols ) {
$cols['prix'] = 'Prix';
return $cols;
} );
add_action( 'manage_produit_posts_custom_column', function ( $col, $post_id ) {
if ( 'prix' === $col ) {
echo esc_html( get_post_meta( $post_id, '_prix', true ) );
}
}, 10, 2 );
Bon à savoir
- L’ordre des colonnes dans le tableau final suit l’ordre des clés du tableau retourné : pour repositionner une colonne, il faut reconstruire tout le tableau plutôt que d’y ajouter simplement un élément.
- Les utilisateurs peuvent masquer une colonne personnalisée depuis l’écran d’options, ce qui est un comportement natif à ne pas chercher à bloquer.
- Sur un site multisite avec beaucoup de contenus, une colonne calculée coûteuse en requêtes SQL peut ralentir sensiblement l’écran de liste : mieux vaut mettre le résultat en cache transitoire.