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!
Oto odmiana odpowiedzi sorich87, ponieważ nie mogłem zmusić go do pracy i chciałem automatycznie obsługiwać wiele typów:
Czytam dalej
get_posts_by_author_sql()
i jak to ma dla ciebie skonstruować instrukcję WHERE, ale wyniki, które otrzymywałem były zawsze „1 = 0”. Właśnie napisałem resztę instrukcji SQL, coget_posts_by_author_sql()
oszczędza tylko pisania dwóch bitów: typu postu i autora:Działa to równie dobrze i doda tyle kolumn, ile chcesz, ale każda z nich zajmuje przestrzeń poziomą, podczas gdy samouczek Mike'a doda jedną kolumnę dla niestandardowych typów postów, a następnie wyświetli listę jako tabelę w tym rzędzie. Te same informacje, inna wizualizacja. Metoda Mike'a jest prawdopodobnie lepsza w przypadku dużych ilości typów, ponieważ tworzy skondensowaną listę pionową (i wyświetla tylko element liczenia, jeśli nie jest pusty), podczas gdy metoda sorich87 jest dobra dla mniejszych ilości, ponieważ jest tylko tyle dostępnego miejsca w poziomej kolumnie.
Nie zapomnij, że możesz dodać do zapytania „post_status = opublikować”, aby zwrócić tylko opublikowane elementy, ponieważ przykład obecnie zwraca wszystkie posty ...
źródło
get_posts_by_author_sql( $column, true, $user_id );
powinien skonstruować instrukcję where.Dodają to:
źródło
get_posts_by_author_sql()
co? Ten jest dla mnie nowy; dzięki! Ale właśnie sprawdziłem twój kod i nie sądzę, że robi to, czego się spodziewał. Twojeget_posts_by_author_sql()
połączenie zawsze powraca'1=0
”, a on chciał uzyskać listę zliczeń według typu posta dla użytkownika; chyba że źle zrozumiem ten kod tego nie robi. Może możesz to naprawić?post_type
nazwą typu posta. Np .:get_posts_by_author_sql( 'book', true, $user_id );
dla typu posta o nazwie „książka”. Przetestowane i działa.