Anzeigen der Beiträge von Benutzern nach benutzerdefinierten Posts Geben Sie die Benutzerliste des Administrators ein?

Ich versuche herauszufinden, wie man in die /wp-admin/users.php Manage-Seite /wp-admin/users.php , um benutzerdefinierte Spalten zu erstellen, um die Anzahl der Posts /wp-admin/users.php , die Benutzer für die benutzerdefinierten Post-Typen auf WPHonors.com haben .

Ich habe dafür ein Trac-Ticket 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 manipulieren, daher kann ich für jeden Benutzer benutzerdefinierte Spalten für CPT-Post-Zählungen hinzufügen. Und das könnte etwas mit der Frage zu tun haben, @nacin fragte, wozu die Post-Count-Nummern verlinken würden. Für die aktuelle Post-Post-Zählung, die ein Nutzer hat, verlinkt er auf die Post-Management-Seite und zeigt alle Posts für diesen Nutzer an ( /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 CPT Post-Zählungen für jede Person zeigen, mit 600 Benutzern und insgesamt über 300+ Posts in 4 benutzerdefinierten Post-Typen. Administratoren können nur 'post' Posts senden, sodass die Spalte auf der Benutzerseite nutzlos ist.

Solutions Collecting From Web of "Anzeigen der Beiträge von Benutzern nach benutzerdefinierten Posts Geben Sie die Benutzerliste des Administrators ein?"

Hier ist eine Erweiterung von Mikes Tutorial-Antwort. Ich habe Links zu den aufgelisteten Typen hinzugefügt, so dass Sie auf eine klicken können und direkt zu einer Liste aller Beiträge dieses Typs für diesen Autor weitergeleitet werden, die eine zusätzliche Variable für $counts und eine zusätzliche Ausgabe für $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{$count['label']}{$count['count']}"; } $custom_column = implode("\n",$custom_column); if (empty($custom_column)) $custom_column = "[none]"; $custom_column = "\n{$custom_column}\n
"; } return $custom_column; } function _yoursite_get_author_post_type_counts() { static $counts; if (!isset($counts)) { global $wpdb; global $wp_post_types; $sql = < <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; }

Angenommen, ich verstehe die Frage, was Sie tun müssen, ist Haken in die beiden Haken im Zusammenhang mit Spaltenüberschriften und Spalten Wert für die Admin-Verwaltungsseiten. Sie 'manage_{$type}_columns' und 'manage_{$type}_custom_column' wobei in Ihrem Anwendungsfall {$type} users .

Der Haken 'manage_users_columns'

Dieser erste ist einfach, Sie können die Spaltenüberschriften und damit die verfügbaren Spalten angeben. WordPress schreibt den Wert der “Posts” -Spalte fest. Da Sie ihn ändern wollen, werden wir ihn einfach mit unset() entfernen und dann eine neue Spalte mit dem gleichen Titel hinzufügen, die stattdessen die 'custom_posts' von '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' Hook

Als nächstes müssen Sie den 'manage_users_custom_column' Hook verwenden, der nur für Nicht-Standard-Spalten aufgerufen wird. Wir testen auf $column_name=='custom_posts' , um unseren Code robust zu machen, falls wir in der Zukunft neue Benutzerspalten hinzufügen, und dann greifen wir die _yoursite_get_author_post_type_counts() der Benutzertypen von der function ‘ _yoursite_get_author_post_type_counts() die ich als nächstes besprechen werde. Ich habe dann mit ein paar Möglichkeiten gespielt, dies zu formatieren, entschied aber, dass eine HTML

am besten geeignet ist (da es sich um eine Tabelle von Daten handelt) . Wenn eine Tabelle nicht für Sie arbeitet, nehme ich an, dass Sie in der Lage sind, ganz leicht andere Markups zu 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{$count['label']}" . "{$count['count']}"; $custom_column = implode("\n",$custom_column); } if (empty($custom_column)) $custom_column = "No Posts!"; else $custom_column = "\n{$custom_column}\n
"; return $custom_column; }

Erhalten von Posts Counts nach Posttyp für jeden Benutzer / Autor

Schließlich gibt es das Abrufen von Post-Zählungen nach Post-Typ nach Autor / Benutzer. Im Allgemeinen versuche ich bei der Verwendung von WP_Query() zu bleiben, wenn ich Abfragen auf Posts WP_Query() , aber diese Abfrage hätte erfordert, so viele andere Hooks zu verwenden, dass es einfacher erschien, “ungezogen” zu sein und alles in einem zu tun.

Ich habe einen Beitrag von $post->post_type ist 'revision' oder 'nav_menu_item' aber in 'attachments' belassen. Sie könnten es besser finden, die gewünschten Post-Typen explizit einzubeziehen, anstatt die wenigen, die ich gemacht habe, auszuschließen.

Ich habe auch gefiltert nach $post->post_status nur für 'publish' und 'pending' . Wenn Sie auch 'future' , 'private' und / oder 'draft' einfügen möchten, müssen Sie die Änderungen im Code vornehmen.

Für jede Seitenladung rufe ich diese _yoursite_get_author_post_type_counts() -function nur einmal auf und speichere sie dann in einer statischen Variablen, anstatt für jeden Benutzer aufzurufen. Ich speichere in einem Array, das durch Autoren- / Benutzer-IDs mit einem Array mit Post-Typ-Namen im Element 'label' indiziert ist 'label' und natürlich die Anzahl in einem gleichnamigen Element:

 function _yoursite_get_author_post_type_counts() { static $counts; if (!isset($counts)) { global $wpdb; global $wp_post_types; $sql = < <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 Test-Installation von WordPress 3.0.1 aus:

Laden Sie den vollständigen Code herunter

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

  • wp-post-zählt-für-Benutzer-nach-Post-type.php

Sie können diesen Code in die functions.php Datei Ihres Themes kopieren oder die Datei in einem Plugin speichern, je nachdem, was Sie wählen.

Hoffe das hilft!

Das Folgende ist eine Variation von sorich87’s Antwort, da ich ihn nicht zur Arbeit bringen konnte, und ich wollte automatisch mehrere Typen unterstützen:

 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 '' . $result . ''; } 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 lese auf get_posts_by_author_sql() und wie es eine WHERE-statement für Sie get_posts_by_author_sql() soll, aber die Ergebnisse, die ich bekam, waren immer “1 = 0”. Also habe ich einfach den Rest der SQL-statement geschrieben, denn get_posts_by_author_sql() speichert nur, dass Sie zwei Bits schreiben müssen: den Post-Typ 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 jeder nutzt horizontalen Platz, während Mikes Tutorial eine einzelne Spalte für benutzerdefinierte Post-Typen hinzufügt und sie dann als Tabelle innerhalb dieser Zeile auflistet. Gleiche Information, unterschiedliche Visualisierung. Mike’s ist wahrscheinlich besser für große Mengen von Typen, da es eine komprimierte vertikale Liste erstellt (und nur ein Zählelement anzeigt, wenn nicht leer), während sorich87s Methode für kleinere Mengen geeignet ist, da nur so viel horizontaler Spaltenraum verfügbar ist.

Vergessen Sie nicht, dass Sie “post_status = publish” zur Abfrage hinzufügen können, um nur veröffentlichte Artikel zurückzugeben, da das Beispiel aktuell alle Beiträge zurückgibt …

Folgendes 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 '' . $result . ''; } 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');