Zakładając, że rozumiem pytanie, co musisz zrobić, to podpiąć się do dwóch zaczepów związanych z nagłówkami kolumn i wartością kolumn dla stron zarządzania administratorem. Są 'manage_{$type}_columns'
i 'manage_{$type}_custom_column'
gdzie korzystanie-case {$type}
jest users
.
'manage_users_columns'
hak
Ten pierwszy jest prosty, pozwala określić nagłówki kolumn, a tym samym dostępne kolumny. WordPress koduje wartość kolumny „Posty”, więc ponieważ chcesz ją zmienić, po prostu ją usuniemy, unset()
a następnie dodamy nową kolumnę o tym samym tytule, która zamiast tego ma identyfikator '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;
}
'manage_users_custom_column'
hak
Następnie musisz użyć 'manage_users_custom_column'
haka, który jest wywoływany tylko dla niestandardowych kolumn. Sprawdzamy, czy $column_name=='custom_posts'
nasz kod jest niezawodny na wypadek, gdybyśmy dodawali nowe kolumny użytkowników w przyszłości, a następnie pobieramy liczby typów postów użytkownika z funkcji, którą napisałem, o _yoursite_get_author_post_type_counts()
której omówię w dalszej części. Potem grałem na kilka sposobów, aby to sformatować, ale zdecydowałem, że HTML <table>
jest najbardziej odpowiedni (ponieważ jest to tabela danych) . Jeśli tabela nie działa dla ciebie, zakładam, że będziesz w stanie dość łatwo wygenerować różne znaczniki:
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;
}
Pobieranie postów liczy się według typu posta dla każdego użytkownika / autora
Wreszcie jest pobieranie liczby postów według typu postu przez autora / użytkownika. Generalnie staram się trzymać przy użyciu WP_Query()
podczas uruchamiania zapytań do postów, ale to zapytanie wymagałoby użycia tak wielu innych haków, że po prostu łatwiej było być „niegrzecznym” i robić wszystko w jednym.
Pominąłem którykolwiek post $post->post_type
jest 'revision'
lub 'nav_menu_item'
pozostało w 'attachments'
. Może się okazać, że lepiej jest jawnie dołączyć typy postów, które chcesz, zamiast wykluczać kilka, które zrobiłem.
Filtrowałem też według $post->post_status
tylko 'publish'
i 'pending'
. Jeśli chcesz także 'future'
, 'private'
i / lub 'draft'
trzeba wprowadzić zmiany w kodzie.
Przy każdym ładowaniu strony wywołuję tę _yoursite_get_author_post_type_counts()
funkcję tylko raz, a następnie zapisuję w zmiennej statycznej zamiast wywoływać dla każdego użytkownika. Przechowuję w tablicy indeksowanej według identyfikatora autora / użytkownika zawierającej tablicę z nazwą typu postu w elemencie 'label'
i oczywiście liczbą w elemencie o tej samej nazwie:
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;
}
Wynikowy interfejs użytkownika
I tak to wygląda w przypadku mojej instalacji testowej WordPress 3.0.1:
(źródło: mikeschinkel.com )
Pobierz pełny kod
Możesz pobrać pełny kod z Gist :
Możesz skopiować ten kod do functions.php
pliku motywu lub zapisać plik we wtyczce, cokolwiek wybierzesz.
Mam nadzieję że to pomoże!