Adding Custom Post Type Counts to the Dashboard

The dashboard conveniently tells me how many posts, pages, and comments I have. I would like it to tell me how many articles, videos and cartoons I have too (three custom post types registered with my theme). How would I go about including these into the “Right Now” panel on the dashboard?

alt text

Related posts

Leave a Reply

4 comments

  1. Yes, there are several actions within that widget, including right_now_content_table_end. Example:

    function my_right_now() {
        $num_widgets = wp_count_posts( 'widget' );
    
        $num = number_format_i18n( $num_widgets->publish );
        $text = _n( 'Widget', 'Widgets', $num_widgets->publish );
        if ( current_user_can( 'edit_pages' ) ) { 
            $num = "<a href='edit.php?post_type=widget'>$num</a>";
            $text = "<a href='edit.php?post_type=widget'>$text</a>";
        }   
    
        echo '<tr>';
        echo '<td class="first b b_pages">' . $num . '</td>';
        echo '<td class="t pages">' . $text . '</td>';
        echo '</tr>';
    }
    add_action( 'right_now_content_table_end', 'my_right_now' );
    
  2. Based on this same code, you may use this to show every custom post types and custom taxonomies count :

    // Add custom taxonomies and custom post types counts to dashboard
    add_action( 'right_now_content_table_end', 'my_add_counts_to_dashboard' );
    function my_add_counts_to_dashboard() {
        // Custom taxonomies counts
        $taxonomies = get_taxonomies( array( '_builtin' => false ), 'objects' );
        foreach ( $taxonomies as $taxonomy ) {
            $num_terms  = wp_count_terms( $taxonomy->name );
            $num = number_format_i18n( $num_terms );
            $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name, $num_terms );
            $associated_post_type = $taxonomy->object_type;
            if ( current_user_can( 'manage_categories' ) ) {
                $num = '<a href="edit-tags.php?taxonomy=' . $taxonomy->name . '&post_type=' . $associated_post_type[0] . '">' . $num . '</a>';
                $text = '<a href="edit-tags.php?taxonomy=' . $taxonomy->name . '&post_type=' . $associated_post_type[0] . '">' . $text . '</a>';
            }
            echo '<td class="first b b-' . $taxonomy->name . 's">' . $num . '</td>';
            echo '<td class="t ' . $taxonomy->name . 's">' . $text . '</td>';
            echo '</tr><tr>';
        }
    
        // Custom post types counts
        $post_types = get_post_types( array( '_builtin' => false ), 'objects' );
        foreach ( $post_types as $post_type ) {
            $num_posts = wp_count_posts( $post_type->name );
            $num = number_format_i18n( $num_posts->publish );
            $text = _n( $post_type->labels->singular_name, $post_type->labels->name, $num_posts->publish );
            if ( current_user_can( 'edit_posts' ) ) {
                $num = '<a href="edit.php?post_type=' . $post_type->name . '">' . $num . '</a>';
                $text = '<a href="edit.php?post_type=' . $post_type->name . '">' . $text . '</a>';
            }
            echo '<td class="first b b-' . $post_type->name . 's">' . $num . '</td>';
            echo '<td class="t ' . $post_type->name . 's">' . $text . '</td>';
            echo '</tr>';
    
            if ( $num_posts->pending > 0 ) {
                $num = number_format_i18n( $num_posts->pending );
                $text = _n( $post_type->labels->singular_name . ' pending', $post_type->labels->name . ' pending', $num_posts->pending );
                if ( current_user_can( 'edit_posts' ) ) {
                    $num = '<a href="edit.php?post_status=pending&post_type=' . $post_type->name . '">' . $num . '</a>';
                    $text = '<a href="edit.php?post_status=pending&post_type=' . $post_type->name . '">' . $text . '</a>';
                }
                echo '<td class="first b b-' . $post_type->name . 's">' . $num . '</td>';
                echo '<td class="t ' . $post_type->name . 's">' . $text . '</td>';
                echo '</tr>';
            }
        }
    }
    
  3. For anyone interested in changing the “Discussion” section to show the pending post count instead of having it all in “content” the right_now_discussion_table_end hook can be used like so:

    add_action( 'right_now_discussion_table_end', 'my_add_counts_to_rightnow_discussion' );
    function my_add_counts_to_rightnow_discussion() {
        // Custom post types counts
        $post_types = get_post_types( array( '_builtin' => false, 'public' => true , 'show_ui' => true), 'objects' );
        foreach ( $post_types as $post_type ) {
                if ( current_user_can( 'edit_posts' ) ) {
    
            $num_posts = wp_count_posts( $post_type->name );
             $text = _n( $post_type->labels->singular_name, $post_type->labels->name, $num_posts->publish );
    
               $num = number_format_i18n( $num_posts->pending );
                $post_types = get_post_types( array( '_builtin' => false, 'public' => true , 'show_ui' => true), 'objects' );
    
                $num = '<a href="edit.php?post_status=pending&post_type=' . $post_type->name . '">' . $num . '</a>';
                    $text = '<a class="waiting" href="edit.php?post_status=pending&post_type=' . $post_type->name . '">' . $text . ' Pending </a>';
    
                echo '<td class="first b b-' . $post_type->name . 's">' . $num . '</td>';
                echo '<td class="t ' . $post_type->name . 's">' . $text . '</td>';
                echo '</tr>';
            }
        }
    }
    

    I also removed the if(pending >0) this way the post types will line up with the count on the left. If you use this code just use Sébastien or Adam’s code for the counts and remove the pending section.

    Also note, I added a check to see if the post types were public and set to show in the UI. This can be added to either of the other’s code.

  4. add_action( 'dashboard_glance_items', 'cor_right_now_content_table_end' );
    
    function cor_right_now_content_table_end() {
    
        $args = array(
            'public' => true,
            '_builtin' => false
        );
        $output = 'object';
        $operator = 'and';
    
        $post_types = get_post_types( $args, $output, $operator );
        foreach ( $post_types as $post_type ) {
            $num_posts = wp_count_posts( $post_type->name );
            $num = number_format_i18n( $num_posts->publish );
            $text = _n( $post_type->labels->singular_name, $post_type->labels->name, intval( $num_posts->publish ) );
            if ( current_user_can( 'edit_posts' ) ) {
                $output = '<a href="edit.php?post_type=' . $post_type->name . '">' . $num . '&nbsp;' . $text . '</a>';
            }
            echo '<li class="post-count ' . $post_type->name . '-count">' . $output . '</li>';
        }
        $taxonomies = get_taxonomies( $args, $output, $operator );
        foreach ( $taxonomies as $taxonomy ) {
            $num_terms = wp_count_terms( $taxonomy->name );
            $num = number_format_i18n( $num_terms );
            $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name, intval( $num_terms ) );
            if ( current_user_can( 'manage_categories' ) ) {
                $output = '<a href="edit-tags.php?taxonomy=' . $taxonomy->name . '">' . $num . '&nbsp;' . $text . '</a>';
            }
            echo '<li class="taxonomy-count ' . $taxonomy->name . '-count">' . $output . '</li>';
        }
    }
    
    // Add Some CSS to "At a Glance" Widget
    
    function custom_colors() {
    
        echo '<style type="text/css">
            .slides-count a:before {content:"f233"!important}
            .gallery-count a:before {content:"f163"!important}
            </style>';
    }
    
    add_action('admin_head', 'custom_colors');