How to Display Network Post Count?

Made a couple of tweaks to brasofilo’s example as we were getting hit with memory execution issues; one of which may be related to a possible switch_to_blog memory leak that has been impacting sites doing a lot of switch_to_blog calls (we would typically run around ~1000 or so when loading this dashboard widget.) Even with memory limits of 256MB+; still getting execution errors. The fix was adding wp_cache_flush();

Crude perhaps, but cleans up the memory enough to allow it to execute. Additional changes also include some logic to avoid displaying sites with only 1 post (presumably the default) and show the total number of “active” sites with 2+ posts with the summary at the bottom of the table.

    add_action( 'wp_network_dashboard_setup', 'wpse_66963_network_dashboard_setup' );

function wpse_66963_network_dashboard_setup()
{
    wp_add_dashboard_widget(
        'wpse_66963_posts_count_widget',
        '<div id="icon-edit" class="icon32"></div><h2>Network Posts Count</h2>',
        'wpse_66963_posts_count' );
}

function wpse_66963_posts_count()
{
    global $wpdb;
    $blogs = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$wpdb->blogs} WHERE  spam = '0' 
            AND deleted = '0' AND archived = '0' 
            ORDER BY registered DESC, 2", ARRAY_A ) );

    $original_blog_id = get_current_blog_id();

    if ( empty( $blogs ) )
    {
        echo '<p>No blogs!</p>';
        break;
    }
    ?>
    <table class="widefat">
        <thead>
            <tr>
                <th>Site</th>
                <th>Total posts</th>
                <th>Draft posts</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
            <th>Site</th>
            <th>Total posts</th>
            <th>Draft posts</th>
            </tr>
        </tfoot>
        <tbody>
        <?php
    $args = array(
        'numberposts'     => -1,
        'post_type'       => 'post',
        'post_status'     => 'publish' );
    $total_network = $draft_network = 0;
    $total_sites = 0;

    foreach ($blogs as $blog)
    {
        wp_cache_flush();
        switch_to_blog( $blog->blog_id );
        $args['post_status'] = 'publish';
        if (count(get_posts($args))<2) { continue; }
        $total_posts = count( get_posts( $args ) );
        $total_network += $total_posts;
        $total_sites += 1;

        $args['post_status'] = 'draft';
        $draft_posts = count( get_posts( $args ) );
        $draft_network += $draft_posts;
        ?>
           <tr>
             <td><a href="https://wordpress.stackexchange.com/questions/66963/<?php echo site_url(); ?>"><?php echo site_url(); ?></a></td>
             <td><?php echo $total_posts; ?></td>
             <td><?php echo $draft_posts; ?></td>
           </tr>
        <?php
    }
    ?>
           <tr>
             <td><b>Total count (<?php echo $total_sites;?> sites with content)</b></td>
             <td><?php echo $total_network; ?></td>
             <td><?php echo $draft_network; ?></td>
           </tr>
        </tbody>
    </table>
<?php echo memory_get_usage(); ?>
<br/>
<?php echo memory_get_peak_usage(); ?>
    <?php
    switch_to_blog( $original_blog_id );
}

Leave a Comment