Anzeigen der Beitragszahlen des Benutzers nach benutzerdefiniertem Beitragstyp in der Benutzerliste des Administrators?

9

Ich versuche herauszufinden, wie ich mich in die /wp-admin/users.phpVerwaltungsseite einbinden kann, um benutzerdefinierte Spalten zu erstellen, in denen die Anzahl der Beiträge angezeigt wird , die Benutzer für die benutzerdefinierten Beitragstypen auf WPHonors.com haben .

Ich habe ein Trac-Ticket dafür erstellt, aber @nacin hat erklärt, warum es eher ein Job für ein Plugin ist.

Ich konnte keine Möglichkeit finden, die Ausgabe der Benutzertabelle zu bearbeiten, sodass ich für jeden Benutzer benutzerdefinierte Spalten für die Anzahl der CPTs hinzufügen kann. Und das hat möglicherweise etwas mit der Frage zu tun, die @nacin gestellt hat, auf die die Post-Count-Nummern verweisen würden. Für die aktuelle Anzahl der Posts, die ein Benutzer hat, wird ein Link zur Post-Verwaltungsseite erstellt, auf der alle Posts für diesen Benutzer angezeigt werden ( /wp-admin/edit.php?author=%author_id%).

Wenn ich es irgendwo verlinken würde, wäre es:

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

Wenn das überhaupt irgendwie möglich wäre, denke ich. Aber ich muss es nicht unbedingt irgendwo verlinken. Ich möchte hauptsächlich nur 600die Anzahl der CPT- 300+Posts für jede Person anzeigen, wobei Benutzer und eine Gesamtzahl von Posts über 4benutzerdefinierte Post-Typen hinweg vorliegen. Administratoren sind nur einer, der 'post'Beiträge einreichen kann , sodass diese Spalte auf der Benutzerseite unbrauchbar ist.

jaredwilli
quelle

Antworten:

10

Hier ist eine Erweiterung von Mikes Tutorial-Antwort. Ich habe Links zu den aufgelisteten Typen hinzugefügt, damit Sie auf einen klicken und direkt zu einer Liste aller Beiträge in diesem Typ für diesen Autor gelangen können, für die eine zusätzliche Variable $countsund eine zusätzliche Ausgabe erforderlich sind$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;
}
somatisch
quelle
10

Angenommen, ich habe die Frage verstanden, müssen Sie sich in die beiden Hooks einbinden, die sich auf Spaltenüberschriften und Spaltenwerte für die Verwaltungsseiten des Administrators beziehen. Sie sind 'manage_{$type}_columns'und 'manage_{$type}_custom_column'wo in Ihrem Anwendungsfall {$type}ist users.

Der 'manage_users_columns'Haken

Diese erste ist einfach. Sie können die Spaltenüberschriften und damit die verfügbaren Spalten angeben. WordPress codiert den Wert der Spalte "Posts" fest. Da Sie ihn also ändern möchten, entfernen wir ihn einfach mit unset()und fügen dann eine neue Spalte mit demselben Titel hinzu, die jedoch den folgenden Bezeichner hat '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;
}

Der 'manage_users_custom_column'Haken

Als nächstes müssen Sie den 'manage_users_custom_column'Hook verwenden, der nur für nicht standardmäßige Spalten aufgerufen wird. Wir testen $column_name=='custom_posts', ob unser Code robust ist, falls wir in Zukunft neue Benutzerspalten hinzufügen, und ermitteln dann die Anzahl der Benutzerbeitragstypen aus der von mir geschriebenen Funktion, _yoursite_get_author_post_type_counts()die ich im Folgenden erläutern werde. Ich habe dann mit ein paar Möglichkeiten gespielt, dies zu formatieren, aber entschieden, dass ein HTML <table>am besten geeignet ist (da es sich um eine Datentabelle handelt) . Wenn eine Tabelle für Sie nicht funktioniert, können Sie vermutlich ganz einfach andere Markups generieren:

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;
}

Abrufen der Anzahl der Beiträge nach Beitragstyp für jeden Benutzer / Autor

Zuletzt werden die Anzahl der Beiträge nach Beitragstyp nach Autor / Benutzer abgerufen. Im Allgemeinen versuche ich, WP_Query()bei der Ausführung von Abfragen für Posts bei der Verwendung zu bleiben , aber für diese Abfrage wären so viele andere Hooks erforderlich gewesen, dass es einfach einfacher schien, "ungezogen" zu sein und alles in einem zu tun.

Ich habe jeden Beitrag von $post->post_typeis weggelassen 'revision'oder bin dabei 'nav_menu_item'geblieben 'attachments'. Möglicherweise ist es besser, die gewünschten Beitragstypen explizit einzuschließen, als die wenigen, die ich getan habe, auszuschließen.

Ich habe auch $post->post_statusnur nach 'publish'und gefiltert 'pending'. Wenn Sie auch enthalten sein sollen 'future', 'private'und / oder 'draft'Sie die Änderungen im Code vornehmen müssen.

Bei jedem Seitenaufruf rufe ich diese _yoursite_get_author_post_type_counts()Funktion nur einmal auf und speichere sie dann in einer statischen Variablen, anstatt sie für jeden Benutzer aufzurufen. Ich speichere in einem Array, das durch Autoren- / Benutzer-IDs indiziert ist und ein Array mit dem Post-Post-Namen im Element 'label'und natürlich der Anzahl in einem gleichnamigen Element enthält:

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;
}

Die resultierende Benutzeroberfläche

Und so sieht es bei meiner Testinstallation von WordPress 3.0.1 aus:


(Quelle: mikeschinkel.com )

Laden Sie den vollständigen Code herunter

Sie können den vollständigen Code von Gist herunterladen :

Sie können diesen Code in die functions.phpDatei Ihres Themas kopieren oder die Datei in ein Plugin aufnehmen, je nachdem, was Sie auswählen.

Hoffe das hilft!

MikeSchinkel
quelle
Das ist einfach. Alles, was Sie tun mussten, war zu sagen, dass es die 'verwalten _ {$ type} _columns' und 'verwalten _ {$ type} _custom_column' verwendet, wobei $ type = users, und ich hätte den Rest von dort herausfinden können. Ich hatte das Gefühl, dass es so war, aber ich habe es überprüft und keine Benutzer gesehen. Der Rest ist einfach genug. Ich schätze die umfangreichen Anstrengungen, die Sie unternommen haben, und ich werde auf WPHonors mit Sicherheit für Sie stimmen (da ich es bereits getan habe). Goo.gl/CrSi Vielen Dank: D
jaredwilli
1
@jaredwilli - Ja natürlich. Das Ziel von WordPress Answers ist es jedoch, Antworten für Personen bereitzustellen, die weit über die erste Person hinausgehen, die danach fragt. Aus diesem Grund schreibe ich ausführlich, auch wenn Sie möglicherweise nur einige Informationen benötigen. Andere sind möglicherweise völlig neu im Ansatz. Ich versuche beiden zu helfen. Oh, und danke für die netten Kommentare auf der Seite (und die Chance, dass ich das Foto ändern könnte? :)
MikeSchinkel
Ja, deshalb habe ich dich nicht davon abgehalten, mir nur den Haken zu sagen, den ich benutzen musste. Ich weiß, dass ich nicht der einzige sein werde, der einen Bedarf dafür findet, also ist alles gut.
Jaredwilli
Oh, tut mir leid, natürlich werde ich. Ich war abgelenkt von einem benutzerdefinierten Post-Typ, den ich für eine Shop-Site mache, die ich baue. Ich nehme nicht an, dass Sie eine Möglichkeit gefunden haben, die Anzahl der Beiträge mit einer edit.php-Seite zu verknüpfen, auf der Beiträge für die Autoren der Beiträge angezeigt werden. Wahrscheinlich muss ich das in mein CPT einbauen.
Jaredwilli
@jaredwilli - Ah, ja, aber es sieht so aus, als hätte @somatic es für dich getan, oder?
MikeSchinkel
2

Das Folgende ist eine Variation der Antwort von sorich87, da ich seine nicht zum Laufen bringen konnte und mehrere Typen automatisch unterstützen wollte:

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');

Ich habe nachgelesen get_posts_by_author_sql()und wie es eine WHERE-Anweisung für Sie erstellen soll, aber die Ergebnisse, die ich erhalten habe, waren immer "1 = 0". Also habe ich gerade den Rest der SQL-Anweisung ausgeschrieben, da get_posts_by_author_sql()Sie nur zwei Bits schreiben müssen: den Beitragstyp und den Autor:

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

Dies funktioniert genauso gut und fügt so viele Spalten hinzu, wie Sie möchten, aber jede belegt horizontalen Platz, während Mikes Tutorial eine einzelne Spalte für benutzerdefinierte Beitragstypen hinzufügt und diese dann als Tabelle in dieser Zeile auflistet. Gleiche Infos, unterschiedliche Visualisierung. Mikes ist wahrscheinlich besser für große Mengen von Typen, da es eine komprimierte vertikale Liste erstellt (und nur ein Zählelement anzeigt, wenn es nicht leer ist), während die Methode von sorich87 für kleinere Mengen gut ist, da nur so viel horizontaler Spaltenraum verfügbar ist.

Vergessen Sie nicht, dass Sie der Abfrage "post_status = veröffentlichen" hinzufügen können, um nur veröffentlichte Elemente zurückzugeben, da im Beispiel derzeit alle Beiträge zurückgegeben werden ...

somatisch
quelle
Toll! get_posts_by_author_sql( $column, true, $user_id );sollte die where-Anweisung konstruieren.
Sorich87
1

Das Folgende wird es hinzufügen:

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');
sorich87
quelle
@ sorich87 - wie get_posts_by_author_sql()? Dieser ist neu für mich; Vielen Dank! Aber ich habe gerade Ihren Code überprüft und glaube nicht, dass er das tut, was er erwartet. Ihr get_posts_by_author_sql()Anruf wird immer zurückgegeben '1=0, und er wollte eine Liste der Zählungen nach Beitragstyp für einen Benutzer erhalten. es sei denn, ich verstehe diesen Code falsch, macht das nicht. Vielleicht können Sie es beheben?
MikeSchinkel
Ja, ich habe die Frage falsch verstanden. Mein Code fügt nur eine Spalte für einen benutzerdefinierten Beitragstyp hinzu. Ersetzen Sie einfach post_typedurch den Namen des Beitragstyps. ZB: get_posts_by_author_sql( 'book', true, $user_id );für einen Beitragstyp namens "Buch". Getestet und es funktioniert.
Sorich87
PS: Auch bei WPHonors für dich gestimmt. Du hast es definitiv verdient!
Sorich87
Ich habe dies noch nicht getestet, aber es sieht so aus, als würde es funktionieren. Vielleicht habe ich nicht alle Funktionen, die ich suche, aber das ist immer noch einfach hinzuzufügen. Danke :)
jaredwilli
@ sorich87 - Super!
MikeSchinkel