在管理员的用户列表中按自定义帖子类型显示用户的帖子计数?

时间:2010-10-24 作者:jaredwilli

我正在想办法/wp-admin/users.php manage page可创建自定义列,以显示用户对上的自定义帖子类型的帖子数量WPHonors.com.

我创建了一个trac ticket 为了这个但是@nacin 解释了为什么插件更适合做这项工作。

我无法找到一种方法来操作userstable的输出,因此我可以为每个用户的CPTs post计数添加自定义列。这可能与nacin提出的问题有关,Post count数字会链接到什么。对于用户当前的“帖子”帖子数量,它链接到帖子管理页面,显示该用户的所有帖子(/wp-admin/edit.php?author=%author_id%).

如果我将它链接到某个地方,它将是:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%
我想,如果这有可能的话。但我甚至不需要把它链接到任何地方。我主要想显示每个人的CPT帖子数量600 用户和合计300+ 跨越的帖子4 自定义帖子类型。管理员是唯一可以提交\'post\' 贴子,因此用户页面中的列是无用的。

4 个回复
最合适的回答,由SO网友:somatic 整理而成

下面是Mike教程答案的扩展。我添加了到所列类型的链接,这样您就可以单击其中一个,并可以直接看到该作者在该类型中的所有帖子的列表,这需要一个额外的变量$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;
}

SO网友:MikeSchinkel

假设我理解了这个问题,那么您需要做的是为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)

下载完整代码,您可以download 来自的完整代码Gist:

您可以将此代码复制到主题的functions.php 文件或存储区将文件包含在插件中,以您选择的为准。

希望这有帮助!

SO网友:somatic

以下是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() 它应该如何为您构建WHERE语句,但我得到的结果总是“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的教程将为自定义帖子类型添加一列,然后将它们列为该行中的一个表。相同的信息,不同的可视化。Mike的方法可能更适合于大量类型,因为它构建了一个精简的垂直列表(如果不是空的话,只显示计数项),而sorich87的方法适合于较小的数量,因为只有这么多的水平列空间可用。

不要忘记,您可以将“post\\u status=publish”添加到查询中,以仅返回已发布的项目,例如当前返回所有帖子。。。

SO网友:sorich87

将添加以下内容:

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\');

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗