Photographie - Ecrivain public

Afficher le nombre d’articles par type de contenu dans la liste des utilisateurs de WordPress

Suite au tutoriel sur l’ajout de colonnes personnalisées dans le back-office de WordPress, je vous propose une nouvelle technique permettant de lister le nombre de contenu produits par chaque utilisateur – articles, pages, custom post type, autres, dans la liste des utilisateurs. Un complément très pratique pour retrouver les contenus d’un auteur en particulier à portée de main.

Si vous consultez le module Utilisateurs de WordPress, une colonne comptabilise le nombre d’articles rédigés par un auteur. Le problème est qu’avec l’avénément des types de contenus personnalisés – les fameux custom post types, ces derniers ne sont pas pris en compte.

Capture d'écran - Compteur d'articles des auteurs

Par défaut, seuls les articles sont comptabilisés

Notre objectif est d’obtenir un total pour chaque contenu comme ceci :

Capture d'écran - Compteurs par type de contenu sous WordPress

Des compteurs de contenu par utilisateur

Pour parvenir à ce résultat, copiez / collez le code suivant dans votre fichier functions.php ou dans un fichier de fonctions globales :

// Custom Post Type colonne utilisateurs
add_action('manage_users_columns','compteur_posts');
function compteur_posts($column_headers) {
 unset($column_headers['posts']);
 $column_headers['custom_posts'] = 'Contenu';
 return $column_headers;
}

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);

function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
 if ($column_name=='custom_posts') {
 $counts = _compteur_posts();
 $custom_column = array();
 if (isset($counts[$user_id]) && is_array($counts[$user_id]))
 foreach($counts[$user_id] as $count) {
 $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
 // admin_url() . "edit.php?author=" . $user->ID;
 $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
 }
 $custom_column = implode("\n",$custom_column);
 if (empty($custom_column))
 $custom_column = "<th>[none]</th>";
 $custom_column = "<table>\n{$custom_column}\n</table>";
 }
 return $custom_column;
}

function _compteur_posts() {
static $counts;
 if (!isset($counts)) {
 global $wpdb;
 global $wp_post_types;
 $sql = <<<SQL
 SELECT
 post_type,
 post_author,
 COUNT(*) AS post_count
 FROM
 {$wpdb->posts}
 WHERE 1=1
 AND post_type NOT IN ('revision','nav_menu_item')
 AND post_status IN ('publish','pending', 'draft')
 GROUP BY
 post_type,
 post_author
SQL;
 $posts = $wpdb->get_results($sql);
 foreach($posts as $post) {
 $post_type_object = $wp_post_types[$post_type = $post->post_type];
 if (!empty($post_type_object->label))
 $label = $post_type_object->label;
 else if (!empty($post_type_object->labels->name))
 $label = $post_type_object->labels->name;
 else
 $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
 if (!isset($counts[$post_author = $post->post_author]))
 $counts[$post_author] = array();
 $counts[$post_author][] = array(
 'label' => $label,
 'count' => $post->post_count,
 'type' => $post->post_type,
 );
 }
 }
 return $counts;
}

Cette astuce a été proposée sur l’excellent WordPress Answers. A visiter d’urgence !

Pour ma part, j’estime que les prochaines versions de WordPress devraient intégrer davantage d’aspects propres aux types de contenu personnalisé. Qu’en pensez-vous ?

Crédits photo : kimioo

Aurélien Denis est le fondateur du projet WordPress Channel proposant tutoriels et podcasts librement téléchargeables. En 2010, il fonde Neticpro, une agence Web spécialisée WordPress. Il est aussi co-fondateur du site Protuts.net (tutoriels PC/Mac/Linux) et community manager pour l’Imagine Cup 2011/2012, une compétition mondiale organisée par Microsoft. Voir tous les tutoriels de Aurélien Denis →