Я пытаюсь выяснить, как сцепиться в /wp-admin/users.php
управляйте страницей для создания пользовательских столбцов для показа, что число пользователей сообщений имеет для пользовательских типов сообщения на WPHonors.com.
Я создал trac тикет для этого, но @nacin объяснил, почему это - задание больше для плагина, чтобы сделать вместо этого.
Я не мог найти способ управлять выводом пользовательской таблицы, таким образом, я могу добавить пользовательские столбцы для счетов сообщения CPTs для каждого пользователя. И это может иметь некоторое отношение к вопросу @nacin спрошенный, что было бы числа количества сообщения связываться с. Для текущего 'сообщения' рассчитывает сообщение, пользователь имеет, оно связывается с сообщением, управляют страницей, показывая все сообщения для того пользователя (/wp-admin/edit.php?author=%author_id%
).
Если бы я должен был связать его где-нибудь, то это было бы к:
/wp-admin/edit.php?post_type=%post_type%&author=%author_id%
Если это было даже так или иначе возможно, я предполагаю. Но я не должен даже обязательно связывать его с нигде. Я главным образом хочу просто показать счета сообщения CPT для каждого человека, имея 600
пользователи и объединенное общее количество 300+
сообщения через 4
пользовательские типы сообщения. Администраторы - только один, кто может отправить 'post'
сообщения, так, чтобы столбец на странице пользователя был бесполезен.
Вот расширение учебного ответа Mike's. Я добавил ссылки к типам, перечисленным, таким образом, можно нажать один и быть взяты право на список всех сообщений в том типе для того автора, который потребовал дополнительной переменной для $counts
и некоторый дополнительный вывод для $custom_column[]
add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
unset($column_headers['posts']);
$column_headers['custom_posts'] = 'Assets';
return $column_headers;
}
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) {
$link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
// admin_url() . "edit.php?author=" . $user->ID;
$custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
}
$custom_column = implode("\n",$custom_column);
if (empty($custom_column))
$custom_column = "<th>[none]</th>";
$custom_column = "<table>\n{$custom_column}\n</table>";
}
return $custom_column;
}
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', 'draft')
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,
'type' => $post->post_type,
);
}
}
return $counts;
}
При принятии я понял вопрос, что необходимо сделать, сцепиться в два рычага, связанные со значением заголовков столбцов и столбцов для администратора, управляют страницами. Они 'manage_{$type}_columns'
и 'manage_{$type}_custom_column'
где в Вашем примере использования {$type}
users
.
'manage_users_columns'
рычагЭтот первый прост, он позволяет Вам указать заголовки столбцов и следовательно доступные столбцы. WordPress hardcodes значение столбца "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
'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)
Можно загрузить полный код с Сути:
Можно скопировать этот код в тему functions.php
файл или хранилище включают файл в плагин, какой бы ни Вы выбираете.
Надеюсь, это поможет!
Следующее является вариацией на ответ sorich87, поскольку я не мог заставить его работать, и я хотел поддерживать несколько типов автоматически:
function my_manage_users_custom_column($output = '', $column, $user_id) {
global $wpdb;
$result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);
function my_manage_users_columns($columns) {
// create columns for each type, make sure to use the post_type slug
$columns['animals'] = 'Animals Count';
$columns['plants'] = 'Plants Count';
$columns['insects'] = 'Insect Count';
return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');
Я читал на get_posts_by_author_sql()
и как это, как предполагается, создает, ГДЕ оператор для Вас, но результаты я добрался, всегда был "1=0". Таким образом, я просто выписал остальную часть SQL-оператора, как get_posts_by_author_sql()
только сохраняет Вас имеющий необходимость записать два бита: тип сообщения и автор:
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"
Это работает точно также и добавит столько столбцов, сколько Вы хотите, но каждый израсходовал горизонтальное пространство, тогда как учебное руководство Mike's добавит отдельный столбец для пользовательских типов сообщения и затем перечислит их как таблицу в той строке. Та же информация, другая визуализация. Mike's, вероятно, лучше для большого объема типов, поскольку это создает сжатый вертикальный список (и только отображает объект количества, если не пустой), в то время как метод sorich87 хорош для меньших количеств, как существует только так много горизонтальной доступной комнаты столбца.
Не забывайте, что можно добавить "post_status=publish" к запросу, чтобы только возвратить опубликованные объекты, поскольку пример в настоящее время возвращает все сообщения...
get_posts_by_author_sql( $column, true, $user_id );
должен создать где оператор.
– sorich87
24.10.2010, 22:01
Следующее добавит его:
function my_manage_users_custom_column($output = '', $column_name, $user_id) {
global $wpdb;
if( $column_name !== 'post_type_count' )
return;
$where = get_posts_by_author_sql( 'post_type', true, $user_id );
$result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);
function my_manage_users_columns($columns) {
$columns['post_type_count'] = __( 'Post Type', 'textdomain' );
return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');
get_posts_by_author_sql()
а? Тот плохо мне знаком;спасибо! но я просто проверил Ваш код, и я не думаю, что он делает то, что он ожидает. Ваш get_posts_by_author_sql()
вызов всегда возвращается '1=0
', и он хотел получить список количеств типом сообщения для пользователя; если я не неправильно понимаю этот код, не делает этого. Возможно, можно ли зафиксировать его?
– MikeSchinkel
24.10.2010, 10:57
post_type
именем типа сообщения. Например: get_posts_by_author_sql( 'book', true, $user_id );
для сообщения тип назвал 'книгу'. Протестированный и это работает.
– sorich87
24.10.2010, 11:45