WP, BP & EM show totals on user list

The code below adds a column to the Users tab in the Dashboard to show the users totals for how many Posts, Locations, Events etc they have made.  It should work with any post type and will create a link that will bring up search results for each

/* 
* Changes All Users list in dashboard to show custom post totals
*/

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;
        $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>No contribution yet.</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;
}

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.