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_type
is 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_status
nur 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.php
Datei Ihres Themas kopieren oder die Datei in ein Plugin aufnehmen, je nachdem, was Sie auswählen.
Hoffe das hilft!
Das Folgende ist eine Variation der Antwort von sorich87, da ich seine nicht zum Laufen bringen konnte und mehrere Typen automatisch unterstützen wollte:
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, daget_posts_by_author_sql()
Sie nur zwei Bits schreiben müssen: den Beitragstyp und den Autor: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 ...
quelle
get_posts_by_author_sql( $column, true, $user_id );
sollte die where-Anweisung konstruieren.Das Folgende wird es hinzufügen:
quelle
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. Ihrget_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?post_type
durch den Namen des Beitragstyps. ZB:get_posts_by_author_sql( 'book', true, $user_id );
für einen Beitragstyp namens "Buch". Getestet und es funktioniert.