Ajouter un filtre par auteur dans l’administration
Dans l’administration, WordPress propose de filtrer nos articles par date et catégorie, mais il manque encore la possibilité de trier par auteur.
Quand nous sommes dans l’administration des articles ou d’un custom post type, l’un des inconvénients de WordPress est de ne pas proposer un filtre par auteur.
Cette fonction ajoute une liste déroulante des auteurs à côté des filtres existants (date et catégorie). Elle fonctionne sur le principe de filtrage par auteur qui est disponible lorsque vous cliquez sur un auteur dans les pages admin (par défaut sur la liste des articles et des pages).
Il faut insérer le code ci-dessous dans le fichier functions.php
présent à la racine de votre thème.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
add_action('restrict_manage_posts', 'gkp_restrict_manage_authors');
function gkp_restrict_manage_authors() {
global $wpdb, $typenow;
// On prepare la requete pour recuperer tous les auteurs qui ont publiés au moins 1 article
$query = $wpdb->prepare( 'SELECT DISTINCT post_author
FROM '. $wpdb->posts . '
WHERE post_type = %s
', $typenow );
// On recupere les id
$users = $wpdb->get_col($query);
// On génére le select avec la liste des auteurs
wp_dropdown_users(array(
'show_option_all' => 'Voir tous les auteurs',
'show_option_none' => false,
'name' => 'author',
'include' => $users,
'selected' => !empty($_GET['author']) ? (int)$_GET['author'] : 0,
'include_selected' => true
));
}
[/pastacode]
Ci-dessous, une capture d’écran du résultat :
15 Commentaires
;-) bien utile
Fonctionne très bien, merci Jonathan :)
Attention, ton code à sauté dans le premier contrôle.
Il faut remplacer les & amp; par deux esperluettes. Sinon utiliser AND à la place.
Bonne soirée !
@GEOFFREY : Merci pour le retour, c’est corrigé :)
Attention à la faille SQL injection !
On ne mets pa de $_GET/$_POST/$_COOKIE/$_REQUEST direct dans une requête !
Voilà qui est mieux, même si le post_type_exists($_GET[‘post_type’]) empêche le script d’aller plus loin, un bon $wpdb->prepare() est toujours bon ;)
Merci Julio :)
Le code est à jour !
Quelle réactivité ! 10mn !!
Pas envie de me faire taper sur les doigts à cause d’une faille :$
Belle réactivité !
Sinon pour les bonnes pratiques WordPress, je dirai aussi qu’il faut rajouter un contrôle sur l’existence de la fonction :
if ( !function_exists(‘restrict_manage_authors’) )
C’est plus pratique lorsqu’on crée des child themes puisque ça permet “d’écraser” la fonction.
Et le bonux pour la traduction :
‘show_option_all’ => __(‘Voir tous les auteurs’),
J’aime bien ce genre de snippets, encore merci pour le partage ;)
@Geoffrey : qu’est ce que tu entends par “écrasé” ? Si la fonction existe déjà, on ne peut pas la re-déclarer.
En fait quand tu fais un child theme, il me semble que le fichier functions.php du thème enfant est exécuté avant le fichier du même nom du thème parent. Ce qui fait que si tu veux écraser une fonction du thème parent, il te suffit de la déclarée avec le même nom dans le thème enfant.
C’est le seul fichier qui est exécuté en addition au fichier du thème parent (avec d’abord le fichier du thème enfant, puis le fichier du thème parent), contrairement aux autres fichiers qui sont exécutés en remplacement à ceux du thème parent.
@Geoffrey : Ah ok, merci pour les informations ! je connaissais pas cette subtilité par rapport aux thèmes enfants.
Je viens de mettre à jour l’astuce. J’utilise à présent la variable global $typenow pour récupérer la valeur du custom post type courant.
Extra cette snippet, ça fonctionne aussi en multi-sites.
Merci.
Excellent ! Merci beaucoup. C’est con, mais cela devrait être natif.
Salut Johnattan et merci pour ce script.
Par contre, aujourd’hui, cela ne fonctionne plus correctement car la variable globale $typenow est vide dans la partie media.
J’ai du changer par la variable globale `$post_type` qui correspond mieux à la valeur demandée.
Ce qui donne :
“`
function gkp_restrict_manage_authors() {
global $wpdb, $post_type;
// On prepare la requete pour recuperer tous les auteurs qui ont publiés au moins 1 article
$query = $wpdb->prepare( ‘SELECT DISTINCT post_author
FROM ‘. $wpdb->posts . ‘
WHERE post_type = %s
‘, $post_type );
“`