web-dev-qa-db-fra.com

Affichage du nombre de publications de l'utilisateur par type de publication personnalisée dans la liste des utilisateurs de l'administrateur?

J'essaie de comprendre comment connecter la page /wp-admin/users.php à la gestion afin de créer des colonnes personnalisées pour afficher le nombre de publications des utilisateurs pour les types de publication personnalisés sur WPHonors.com .

J'ai créé un ticket trac pour cela mais @nacin a expliqué pourquoi il s’agissait plutôt d’un travail qu’un plugin aurait à faire à la place.

Je suis incapable de trouver un moyen de manipuler la sortie de la table users. Je peux donc ajouter des colonnes personnalisées pour le nombre de publications CPT pour chaque utilisateur. Et cela peut avoir quelque chose à voir avec la question posée par @nacin, à quoi les numéros de comptage postaux seraient-ils liés. Pour le nombre de publications en cours d'un utilisateur, il est lié à la page de gestion de la publication, affichant toutes les publications de cet utilisateur (/wp-admin/edit.php?author=%author_id%).

Si je devais le lier quelque part, ce serait pour:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

Si cela était possible, je suppose. Mais je n'ai même pas nécessairement besoin de le lier à n'importe où. Je veux surtout montrer le nombre d'articles publiés par le CPT pour chaque personne, avec des utilisateurs 600 et un total combiné d'articles 300+ sur des types d'articles 4 personnalisés. Les administrateurs sont les seuls à pouvoir soumettre des articles 'post'; cette colonne de la page de l'utilisateur est donc inutile.

9
jaredwilli

Voici une extension de la réponse du tutoriel de Mike. J'ai ajouté des liens vers les types énumérés afin que vous puissiez cliquer dessus et obtenir directement la liste de tous les articles de ce type pour cet auteur, ce qui nécessitait une variable supplémentaire pour $counts et une sortie supplémentaire pour $custom_column[].

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    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 = _yoursite_get_author_post_type_counts();
        $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 _yoursite_get_author_post_type_counts() {
    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;
}
10
somatic

En supposant J'ai compris la question. Ce que vous devez faire, c'est vous accrocher aux deux crochets liés aux en-têtes de colonne et à la valeur des colonnes pour les pages d'administration administrées. Ils sont 'manage_{$type}_columns' et 'manage_{$type}_custom_column' où, dans votre cas d'utilisation, {$type} est users.

Le crochet 'manage_users_columns'

La première est simple, elle vous permet de spécifier les en-têtes de colonnes et donc les colonnes disponibles. WordPress code la valeur de la colonne "Posts" _ donc, comme vous voulez la changer, nous allons simplement la supprimer avec unset(), puis ajouter une nouvelle colonne avec le même titre mais avec l'identifiant 'custom_posts' :

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
  unset($column_headers['posts']);
  $column_headers['custom_posts'] = 'Posts';
  return $column_headers;
}

Le crochet 'manage_users_custom_column'

Ensuite, vous devez utiliser le hook 'manage_users_custom_column' qui n'est appelé que pour les colonnes non standard. Nous testons $column_name=='custom_posts' pour rendre notre code robuste au cas où nous ajouterions de nouvelles colonnes utilisateur à l'avenir, puis nous saisirions le nombre de types de publications de l'utilisateur à partir de la fonction que j'ai écrite _yoursite_get_author_post_type_counts(), dont je parlerai dans la prochaine. J'ai ensuite joué avec quelques façons de formater cela, mais j'ai décidé qu'un HTML <table> était le plus approprié (puisqu'il s'agit de est une table de données)}. Si une table ne fonctionne pas pour vous, je suppose que vous serez capable de générer assez facilement un balisage différent:

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 = _yoursite_get_author_post_type_counts();
    $custom_column = array();
    if (isset($counts[$user_id]) && is_array($counts[$user_id]))
      foreach($counts[$user_id] as $count)
        $custom_column[] = "\t<tr><th>{$count['label']}</th>" .
                                 "<td>{$count['count']}</td></tr>";
    $custom_column = implode("\n",$custom_column);
  }
  if (empty($custom_column)) 
    $custom_column = "No Posts!";
  else 
    $custom_column = "<table>\n{$custom_column}\n</table>";
  return $custom_column;
}

Obtenir des messages compte par type de message pour chaque utilisateur/auteur

Enfin, il est possible de récupérer le nombre de messages par type de message par auteur/utilisateur. En général, j'essaie de rester avec WP_Query() lors de l'exécution de requêtes sur des publications, mais cette requête aurait nécessité l'utilisation de tant d'autres points d'ancrage qu'il semblait plus facile d'être "méchant" et de tout faire en un.

J'ai omis tout post de $post->post_type qui est 'revision' ou 'nav_menu_item' mais laissé dans 'attachments'. Vous trouverez peut-être préférable d’inclure explicitement les types de publication que vous voulez plutôt que d’exclure les quelques-uns que j’ai faits.

J'ai aussi filtré par $post->post_status pour seulement 'publish' et 'pending'. Si vous souhaitez également inclure 'future', 'private' et/ou 'draft', vous devez modifier le code.

Pour chaque chargement de page, je n’appelle cette fonction _yoursite_get_author_post_type_counts() qu’une seule fois, puis je l’enregistre dans une variable statique plutôt qu’un appel pour chaque utilisateur. Je stocke dans un tableau indexé par l'auteur/utilisateur ID contenant un tableau avec Post Type name dans l'élément 'label' et bien sûr le nombre dans un élément de même nom:

function _yoursite_get_author_post_type_counts() {
  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')
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,
        );
    }
  }
  return $counts;
}

L'interface utilisateur résultante

Et voici à quoi il ressemble appliqué à mon installation test de WordPress 3.0.1:

  
(source: mikeschinkel.com )

Télécharger le code complet

Vous pouvez télécharger le code complet de Gist :

Vous pouvez copier ce code dans le fichier functions.php de votre thème ou le stocker dans un plugin, selon votre choix.

J'espère que cela t'aides!

10
MikeSchinkel

Ce qui suit est une variante de la réponse de sorich87, car je ne pouvais pas faire en sorte que sa réponse fonctionne, et je souhaitais prendre en charge plusieurs types automatiquement:

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

J'ai lu sur get_posts_by_author_sql() et comment il est supposé construire une instruction WHERE pour vous, mais les résultats que j'ai obtenus sont toujours "1 = 0". Donc, je viens d'écrire le reste de l'instruction SQL, car get_posts_by_author_sql() ne vous évite que d'écrire deux bits: le type de publication et l'auteur:

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

Cela fonctionne aussi bien et ajoute autant de colonnes que vous le souhaitez, mais chacune utilise un espace horizontal, alors que le tutoriel de Mike ajoute une seule colonne pour les types de publication personnalisés, puis les répertorie sous forme de tableau dans cette ligne. Même information, visualisation différente. Mike est probablement préférable pour les grandes quantités de types, car il crée une liste verticale condensée (et n'affiche qu'un élément de comptage s'il n'est pas vide), tandis que la méthode de sorich87 convient aux petites quantités, car il n'y a pas beaucoup de colonnes horizontales disponibles.

N'oubliez pas que vous pouvez ajouter "post_status = publish" à la requête pour ne renvoyer que les éléments publiés, car l'exemple renvoie actuellement toutes les publications ...

2
somatic

Ce qui suit va l'ajouter:

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');
1
sorich87