假设我理解了这个问题,那么您需要做的是为admin-manage页面连接与列标题和列值相关的两个挂钩。他们是\'manage_{$type}_columns\'
和\'manage_{$type}_custom_column\'
在您的用例中{$type}
是users
.
The\'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;
}
The\'manage_users_custom_column\'
挂钩
接下来,您需要使用
\'manage_users_custom_column\'
仅对非标准列调用的钩子。我们测试
$column_name==\'custom_posts\'
为了使代码更加健壮,以防将来添加新的用户列,然后从我编写的函数中获取用户帖子类型计数
_yoursite_get_author_post_type_counts()
我将在下一节讨论。然后我尝试了几种格式化方法,但决定使用HTML
<table>
是最合适的
is 数据表)。如果表不适合您,我假设您可以很容易地生成不同的标记:
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()
函数一次,然后存储到静态变量中,而不是为每个用户调用。我存储在按作者/用户ID索引的数组中,该数组包含元素中具有Post类型名称的数组\'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;
}
生成的UI,这是应用于我的WordPress 3.0.1测试安装的样子:
(来源:mikeschinkel.com)
您可以将此代码复制到主题的
functions.php
文件或存储区将文件包含在插件中,以您选择的为准。
希望这有帮助!