假设我理解了这个问题,您需要做的是将两个钩子关联到与admin管理页面的列标题和列值相关的两个钩子中。他们是'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()
一次此函数,然后将其存储到静态变量中,而不是为每个用户调用。我存储在一个由作者/用户ID索引的数组中,该数组包含元素中具有Post Type名称的数组'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
文件中,或将该文件存储在插件中。
希望这可以帮助!