Supponendo di aver compreso la domanda, quello che devi fare è agganciare i due hook relativi alle intestazioni di colonna e al valore delle colonne per le pagine di gestione dell'amministratore. Essi sono 'manage_{$type}_columns'
e 'manage_{$type}_custom_column'
dove nel vostro caso d'uso {$type}
è users
.
Il 'manage_users_columns'
gancio
Questo primo è semplice, ti consente di specificare le intestazioni di colonna e quindi le colonne disponibili. WordPress codifica il valore della colonna "Post" , quindi, poiché si desidera modificarlo, è sufficiente rimuoverlo unset()
e quindi aggiungere una nuova colonna con lo stesso titolo ma che ha invece l'identificatore di '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;
}
Il 'manage_users_custom_column'
gancio
Successivamente è necessario utilizzare l' 'manage_users_custom_column'
hook che viene chiamato solo per colonne non standard. Testiamo per $column_name=='custom_posts'
rendere solido il nostro codice nel caso in cui aggiungiamo nuove colonne utente in futuro e quindi prendiamo i conteggi del tipo di post dell'utente dalla funzione che ho scritto di _yoursite_get_author_post_type_counts()
cui parlerò in seguito. Ho quindi giocato con alcuni modi per formattare questo, ma ho deciso che un HTML <table>
era il più appropriato (dal momento che è una tabella di dati) . Se una tabella non funziona per te, suppongo che sarai in grado di generare markup diversi abbastanza facilmente:
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;
}
Ottenere messaggi conta per tipo di posta per ciascun utente / autore
Infine, viene recuperato il conteggio dei post per tipo di post per autore / utente. In genere cerco di continuare a utilizzare WP_Query()
quando eseguo query sui post, ma questa query avrebbe richiesto l'utilizzo di così tanti altri hook che sembrava più facile essere "cattivi" e fare tutto in uno.
Ho omesso qualsiasi post di $post->post_type
is 'revision'
o 'nav_menu_item'
ma lasciato in 'attachments'
. Potresti trovare meglio includere esplicitamente i tipi di post desiderati anziché escludere i pochi che ho fatto.
Ho anche filtrato $post->post_status
per solo 'publish'
e 'pending'
. Se si desidera includere anche 'future'
, 'private'
e / o 'draft'
è necessario apportare le modifiche nel codice.
Per ogni caricamento di pagina chiamo questa _yoursite_get_author_post_type_counts()
funzione una sola volta e quindi memorizzo in una variabile statica anziché chiamare per ogni utente. Conservo in un array indicizzato per ID autore / utente contenente un array con nome Post Type nell'elemento 'label'
e ovviamente il conteggio in un elemento con lo stesso nome:
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'interfaccia utente risultante
E questo è come appare applicato alla mia installazione di prova di WordPress 3.0.1:
(fonte: mikeschinkel.com )
Scarica il codice completo
Puoi scaricare il codice completo da Gist :
Puoi copiare questo codice nel functions.php
file del tuo tema o archiviare includendo il file in un plug-in, a seconda della scelta.
Spero che sia di aiuto!