Предполагая, что я понял вопрос, вам нужно подключиться к двум хукам, связанным с заголовками столбцов и значением столбцов для страниц администрирования администратора. Они 'manage_{$type}_columns'
и 'manage_{$type}_custom_column'
где в вашем потребительная случае {$type}
это users
.
'manage_users_columns'
крюк
Первый простой, он позволяет вам указать заголовки столбцов и, следовательно, доступные столбцы. WordPress жестко кодирует значение столбца «Posts», поэтому, так как вы хотите изменить его, мы просто удалим его, unset()
а затем добавим новый столбец с тем же заголовком, но вместо этого с идентификатором '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'
крюк
Далее вам нужно использовать 'manage_users_custom_column'
хук, который вызывается только для нестандартных столбцов. Мы проверяем, $column_name=='custom_posts'
чтобы сделать наш код устойчивым в случае, если мы добавим новые пользовательские столбцы в будущем, а затем мы извлекаем количество типов пользовательских записей из написанной _yoursite_get_author_post_type_counts()
мной функции, о которой я расскажу в следующем. Затем я поиграл с несколькими способами, чтобы отформатировать это, но решил, что HTML <table>
является наиболее подходящим (так как это таблицей данных) . Если таблица не работает для вас, я предполагаю, что вы сможете сгенерировать разметку довольно легко:
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;
}
Получение сообщений учитывается по типу сообщения для каждого пользователя / автора
Наконец, происходит поиск количества постов по типу поста по автору / пользователю. Обычно я пытаюсь придерживаться использования WP_Query()
при выполнении запросов к сообщениям, но для этого запроса потребовалось бы использовать так много других хуков, что просто было бы легче "непослушным" и делать все в одном.
Я опустил любой пост $post->post_type
IS 'revision'
или'nav_menu_item'
, но оставили в 'attachments'
. Возможно, вам будет лучше явно включить типы сообщений, которые вы хотите, а не исключать те, которые я сделал.
Я также отфильтровал $post->post_status
только 'publish'
и 'pending'
. Если вы хотите также включить 'future'
,'private'
и / или 'draft'
вам нужно будет внести изменения в код.
Для каждой загрузки страницы я вызываю эту _yoursite_get_author_post_type_counts()
функцию только один раз и затем сохраняю в статическую переменную, а не вызываю для каждого пользователя. Я храню в массиве, проиндексированном по идентификатору автора / пользователя, содержащему массив с именем типа сообщения в элементе 'label'
и, конечно, счет в элементе с таким же именем:
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;
}
Результирующий интерфейс
И вот как это выглядит применительно к моей тестовой установке WordPress 3.0.1:
(источник: mikeschinkel.com )
Скачать полный код
Вы можете скачать полный код из Gist :
Вы можете скопировать этот код в functions.php
файл вашей темы или сохранить файл в плагине, какой бы вы ни выбрали.
Надеюсь это поможет!