Title: [Plugin: Multisite Latest Posts Widget] Updated for WP 3.4.1
Last modified: August 20, 2016

---

# [Plugin: Multisite Latest Posts Widget] Updated for WP 3.4.1

 *  [CGAdmin](https://wordpress.org/support/users/cgadmin/)
 * (@cgadmin)
 * [13 years, 10 months ago](https://wordpress.org/support/topic/plugin-multisite-latest-posts-widget-updated-for-wp-341/)
 * I tweaked your code so this widget will work with the latest version of WP. The
   biggest issues were a change in database location and slight deviation in hooks.
   I am including it here for others until you determine whether or not to release
   a new version.
 *     ```
       <?php
       /*
       Plugin Name: Multisite Latest Posts Widget
       Description: A sidebar widget to display latest posts from all blogs
       Author: Tristan Min, edited by Jon Thorp
       Version: 1.4.1
       Plugin URI: http://www.wpclue.com/development/
       Author URI: http://www.wpclue.com/
       */
   
       ### widget start
       function  multisite_Latest_Posts_Widget_init(){
       	if ( !function_exists('wp_register_sidebar_widget') )
       		return;
   
       	function multisite_Latest_Posts_Widget($args) {
                   extract($args);
   
                   $options = get_option('multisite_Latest_Posts_Widget');
                   $title = $options['title'];
                   $limit = $options['limit'];
                   if ($limit<1) $limit = 5;
   
                   $before_widget = '<li class="widget-container widget_ms_latest_posts" id="ms_latest_posts">';
                   $after_widget = '</li>';
                   $before_title = '<h3 class="widget-title">';
                   $after_title = '</h3>';
   
                   echo $before_widget . $before_title . $title . $after_title;
                   echo get_ms_latest_posts($limit) . $after_widget;
       	}
   
               function multisite_Latest_Posts_Widget_control(){
                   $options = get_option('multisite_Latest_Posts_Widget');
                   if ( !is_array($options) )
                       $options = array('title'=>'Multisite Latest Posts', 'limit'=>'5');
   
                   if ( $_POST['ms-latest-posts-submit'] ) {
                       $options['title'] = strip_tags(stripslashes($_POST['title']));
                       $options['limit'] = strip_tags(stripslashes($_POST['limit']));
                       update_option('multisite_Latest_Posts_Widget', $options);
                   }
   
                   $title = htmlspecialchars($options['title'], ENT_QUOTES);
                   $limit = htmlspecialchars($options['limit'], ENT_QUOTES);
   
                   echo '<p style="text-align:right;">
                                   <label for="title">' . __('Title:') . '
                                   <input style="width: 200px;" id="title" name="title" type="text" value="'.$title.'" />
                                   </label></p>';
                   echo '<p style="text-align:right;">
                                   <label for="limit">' . __('Limit:') . '
                                   <input style="width: 200px;" id="limit" name="limit" type="text" value="'.$limit.'" />
                                   </label></p>';
                   echo '<input type="hidden" id="ms-latest-posts-submit" name="ms-latest-posts-submit" value="1" />';
               }
   
       	wp_register_sidebar_widget('ms-latest-posts', 'Multisite Latest Posts', 'multisite_Latest_Posts_Widget');
   
       	wp_register_widget_control('ms-latest-posts', 'Multisite Latest Posts', 'multisite_Latest_Posts_Widget_control', 300, 200);
   
               ### Output
               if(!function_exists('get_ms_latest_posts')){
                   function get_ms_latest_posts($limit) {
                       global $wpdb;
                       $output = '';
   
                       $request = $wpdb->prepare("SELECT ".$wpdb->base_prefix."ms_posts.*
                          FROM ".$wpdb->base_prefix."ms_posts
                          WHERE post_type='post' ORDER BY post_date DESC LIMIT ".$limit);
   
                       $results = $wpdb->get_results($request);
   
                       if(!empty($results)){
                           $output = '<ul>';
   
                           foreach($results as $post){
                               if (empty($post->post_excerpt)) {
                                    $post->post_excerpt = explode(" ",strrev(substr(strip_tags($post->post_content), 0, 100)),2);
                                    $post->post_excerpt = strrev($post->post_excerpt[1]);
                                    $post->post_excerpt.= " ...";
                               }
   
                               switch_to_blog($wpdb->blogid);
                               $post_link = get_permalink($post->ID);
                               restore_current_blog();
   
                               $output .= '<li>';
                               $output .= '<a rel="bookmark" href="'.$post_link.'"><strong class="title">'.$post->post_title.'</strong></a>';
                               $output .= '<br>'.$post->post_excerpt;
                               $output .= '</li>';
                           }
   
                           $output .= '</ul>';
                       }
                       return $output;
                   }
               }
       }
       add_action('widgets_init', 'multisite_Latest_Posts_Widget_init');
   
       ### For short_code
       if(!function_exists('get_sc_ms_latest_posts')){
                   function get_sc_ms_latest_posts($limit, $style) {
                       global $wpdb;
                       $output = '';
   
                       if($style == 'list'){
                           $outer_start = '<ul class="mslp_ul">';
                           $outer_end = '</ul>';
                           $inner_start = '<li class="mslp_li">';
                           $inner_end = '</li>';
                       }
                       elseif($style == 'div'){
                           $outer_start = '<div class="mslp_wrapper_div">';
                           $outer_end = '</div>';
                           $inner_start = '<div class="mslp_post_div">';
                           $inner_end = '</div>';
                       }
       														// $base_prefix returns 'wp_' while $prefix returns 'wp_#_'
                       $request = $wpdb->prepare("SELECT ".$wpdb->base_prefix."ms_posts.*
                          FROM ".$wpdb->base_prefix."ms_posts
                          WHERE post_type='post' ORDER BY post_date DESC LIMIT ".$limit); // This looks for database called 'wp_ms_posts'
   
                       $results = $wpdb->get_results($request); 
   
                       if(!empty($results)){
                           $output = $outer_start;
   
                           foreach($results as $post){
                               if (empty($post->post_excerpt)) {
                                    $post->post_excerpt = explode(" ",strrev(substr(strip_tags($post->post_content), 0, 100)),2);
                                    $post->post_excerpt = strrev($post->post_excerpt[1]);
                                    $post->post_excerpt.= " ...";
                                    $post->post_excerpt = wpautop($post->post_excerpt);
                               }
   
                               switch_to_blog($post->blog_id);
                               $post_link = get_permalink($post->ID);
                               restore_current_blog();
   
                               $output .= $inner_start;
                               $output .= '<a rel="bookmark" href="'.$post_link.'"><strong class="mslp_title">'.$post->post_title.'</strong></a>';
                               $output .= '<br>'.$post->post_excerpt;
                               $output .= $inner_end;
                           }
   
                           $output .= $outer_end;
                       }
                       return $output;
                   }
               }
   
       add_shortcode('mslp', 'do_mslp'); // Adds shortcode [mslp] to run function "do_mslp"
   
       function do_mslp($attr) {
           $attr = shortcode_atts(array('limit' => 5, 'style' => 'list'), $attr); // Combines user shortcode attributes with known attributes
           $limit = $attr['limit'];
           $style = $attr['style'];
   
           if ($limit<1) $limit = 5;
           if ($style != 'list' && $style !='div') $style = 'list';
   
           return get_sc_ms_latest_posts($limit, $style); // This function is created at the Short Code section above
       }
   
       register_activation_hook( __FILE__, 'latest_post_build_views_add' );
       /**
        * Builds a view that contains posts from all blogs.
        * Views are built by activate_blog, desactivate_blog, archive_blog, unarchive_blog, delete_blog and wpmu_new_blog hooks.
        */
       add_action ('wpmu_new_blog', 'latest_post_build_views_add');
       add_action ('delete_blog', 'latest_post_build_views_drop', 10, 1);
       add_action ('archive_blog', 'latest_post_build_views_drop', 10, 1);
       add_action ('unarchive_blog', 'latest_post_build_views_unarchive', 10, 1);
       add_action ('activate_blog', 'latest_post_build_views_activate', 10, 1);
       add_action ('deactivate_blog', 'latest_post_build_views_drop', 10, 1);
   
       if(!function_exists('latest_post_build_views_drop')) {
               function latest_post_build_views_drop($trigger) {
                   global $wpdb;
   
                   $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM {$wpdb->blogs} WHERE blog_id != {$trigger} AND site_id = {$wpdb->siteid} AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC"));
                   latest_post_v_query($blogs);
               }
       }
   
       if(!function_exists('latest_post_build_views_add')) {
               function latest_post_build_views_add() {
                   global $wpdb;
   
                   $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM {$wpdb->blogs} WHERE site_id = {$wpdb->siteid} AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC"));
                   latest_post_v_query($blogs);
               }
       }
   
       if(!function_exists('latest_post_build_views_activate')) {
               function latest_post_build_views_activate($trigger) {
                   global $wpdb;
   
                   $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM {$wpdb->blogs} WHERE (blog_id = {$trigger} AND archived = '0' AND mature = '0' AND spam = '0') OR (site_id = {$wpdb->siteid} AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0') ORDER BY registered DESC"));
   
                   latest_post_v_query($blogs);
               }
       }
   
       if(!function_exists('latest_post_build_views_unarchive')) {
               function latest_post_build_views_unarchive($trigger) {
                   global $wpdb;
   
                   $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM {$wpdb->blogs} WHERE (blog_id = {$trigger} AND deleted = '0' AND mature = '0' AND spam = '0') OR (site_id = {$wpdb->siteid} AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0') ORDER BY registered DESC"));
                   latest_post_v_query($blogs);
               }
       }
   
       if(!function_exists('latest_post_v_query')) {
               function latest_post_v_query($blogs) {
                   global $wpdb;
   
                   $i = 0;
                   $posts_query = '';
   
                   foreach ($blogs as $blog) {
                       if ($i != 0) {
                           $posts_query    .= ' UNION ';
                       }
   
                       if($blog->blog_id == 1) {
                               $posts_query    .= " (SELECT '{$blog->blog_id}' AS blog_id,
       												'{$blog->domain}' AS domain,
       												'{$blog->path}' AS path,
       												posts{$blog->blog_id}.*
       											FROM {$wpdb->base_prefix}posts posts{$blog->blog_id}
       											WHERE posts{$blog->blog_id}.post_type != 'revision'
       											AND posts{$blog->blog_id}.post_status = 'publish') ";
                       } else {
                               $posts_query    .= " (SELECT '{$blog->blog_id}' AS blog_id,
       												'{$blog->domain}' AS domain,
       												'{$blog->path}' AS path,
       												posts{$blog->blog_id}.*
       											FROM {$wpdb->base_prefix}{$blog->blog_id}_posts posts{$blog->blog_id}
       											WHERE posts{$blog->blog_id}.post_type != 'revision'
       											AND posts{$blog->blog_id}.post_status = 'publish') ";
                       }
                       $i++;
                   }
   
                       $v_query1  = "CREATE OR REPLACE VIEW <code>{$wpdb->prefix}posts</code> AS ".$posts_query;
                       $wpdb->query($wpdb->prepare($v_query1));
               }
       }
       ?>
       ```
   
 * [http://wordpress.org/extend/plugins/multisite-latest-posts-widget/](http://wordpress.org/extend/plugins/multisite-latest-posts-widget/)

Viewing 1 replies (of 1 total)

 *  Thread Starter [CGAdmin](https://wordpress.org/support/users/cgadmin/)
 * (@cgadmin)
 * [13 years, 10 months ago](https://wordpress.org/support/topic/plugin-multisite-latest-posts-widget-updated-for-wp-341/#post-2958793)
 * Caveat:
 * It seems that the `wp_ms_posts` database does not get updated as frequently as
   the `wp_v_posts` database? Or perhaps I messed up my loading function as I’ve
   been playing with all of the innards? Regardless, switching `wp_ms_posts` to `
   wp_v_posts` seems to work better. Feedback on whether this is just my site or
   everyone’s would be much appreciated.
 * I also noticed that the links were not working correctly. Line 85 needs to be
   adjusted as follows:
    `switch_to_blog($post->blog_id);`

Viewing 1 replies (of 1 total)

The topic ‘[Plugin: Multisite Latest Posts Widget] Updated for WP 3.4.1’ is closed
to new replies.

 * ![](https://s.w.org/plugins/geopattern-icon/multisite-latest-posts-widget.svg)
 * [Multisite Latest Posts Widget](https://wordpress.org/plugins/multisite-latest-posts-widget/)
 * [Support Threads](https://wordpress.org/support/plugin/multisite-latest-posts-widget/)
 * [Active Topics](https://wordpress.org/support/plugin/multisite-latest-posts-widget/active/)
 * [Unresolved Topics](https://wordpress.org/support/plugin/multisite-latest-posts-widget/unresolved/)
 * [Reviews](https://wordpress.org/support/plugin/multisite-latest-posts-widget/reviews/)

## Tags

 * [last post](https://wordpress.org/support/topic-tag/last-post/)

 * 1 reply
 * 1 participant
 * Last reply from: [CGAdmin](https://wordpress.org/support/users/cgadmin/)
 * Last activity: [13 years, 10 months ago](https://wordpress.org/support/topic/plugin-multisite-latest-posts-widget-updated-for-wp-341/#post-2958793)
 * Status: not resolved