Advertisement

A Featured Blog Plugin for WordPress Multisite

by

This Cyber Monday Tuts+ courses will be reduced to just $3 (usually $15). Don't miss out.

WordPress is become one of the most popular open source blogging platforms. As of WordPress 3.0 WordPressMU also became a part of WordPress. The WordPress Multisite feature allows you to create a network of sites which run from the same WordPress installation. So one can upload a plugin or a theme to the installation and it will be available to all the sites on that WordPress network.

In this article we are going to see how to create a Featured Blog plugin which creates a widget and shortcode to display a Featured Blog on a WordPress Multisite installation.


Step 1 WordPress Multisite Installation

In case you don't have the WordPress Multisite installation done already you can download the latest WordPress installation from WordPress.org. This article lists through the steps for creating a WordPress Multisite installation. You can follow the steps to successfully install WordPress Multisite instance on your server.


Step 2 Creating a Network Plugin

Now we are going to create a network plugin called as featured blog. In your wp-content/plugins folder create a directory called featuredblog. Inside that directory create a file featuredblog.php with the following content:

/*
Plugin Name: Featured Blog
Plugin URI: http://wp.tutsplus.com/tutorials/plugins/a-featured-blog-plugin-for-wordpress-multisite/
Description: This plugin helps you display featured blogs on you multisite installation
Author: Abbas
Version: 0.1
Author URI: http://wp.tutsplus.com/author/AbbasSuterwala/
Network: true
*/

This should create a network plugin for us as the Network: true is used and we should be able to see this plugin in the network admin plugin list as follows. Now we can activate this plugin for the whole network from the network admin.


Step 3 Creating Functions to Fetch Posts From Different Blogs

Function for Getting the Post From a Blog

function Featured_blog_posts_for_blog($blog_id,$numberofpost) {

	$output = '';
	wp_reset_query();
	switch_to_blog($blog_id);

	global $post;
	$my_query = new WP_Query('order=DSC&posts_per_page='.$numberofpost);
	while ($my_query->have_posts()) :
		$my_query->the_post();
		$output .='<li class="post_link"><a href="'.get_permalink(). '" rel="bookmark">'.get_the_title().'</a> </li>';
	endwhile; 

	restore_current_blog();

	return $output;
}

In this function we take in the $blog_id and the number of posts we want to fetch. In this function the first thing we do is switch to the blog which is passed to the function. This is done through the WordPress function switch_to_blog. For more details check out href="http://codex.wordpress.org/WPMU_Functions/switch_to_blog">switch_to_blog in the WordPress Codex. Then we create a query depending on the number of posts which are to be displayed using the WP_Query. In case you are not already familiar with it, you can check out WP_Query in the WordPress Codex too. Then we loop through the results of WP_Query and add in a list of the post title and the post name. Then we use the restore_current_blog function to restore to the blog which was there before we switched blogs.

Function to Get Post for a List of Blogs

function Featured_blog_posts_for_specified_blogs($commaseparatedblogids,$numberofpost) {

	$commaseparatedblogids = str_replace (" ", "", $commaseparatedblogids);

	$output = '';

	if(strlen($commaseparatedblogids) > 0 ) {

		$blogids = explode(',',$commaseparatedblogids);
		
		foreach($blogids as $blogid) {

			$blog_details = get_blog_details($blogid);
			$output .='<li class="blog_link"><a href="'.$blog_details->siteurl. '" rel="bookmark">'.$blog_details->blogname.'</a> </li>';
			$output.='<ul>'.Featured_blog_posts_for_blog($blogid,$numberofpost).'</ul>';
		}
	}

	return $output;
}

This function takes a list of comma separated blog IDs and the number of posts we want for each blog as input. In this function we remove any white space present in the comma separated blog list. Then it is exploded on the basis of the comma and we loop through each blog ID. Then using the previous function Featured_blog_posts_for_blog we fetch the posts for each blog. The result is created in a list and returned by this function.


Step 4 Creating a Shortcode

Now we are going to create a shortcode to display the featured blogs.

function Featured_blog_shortcode($atts, $content = null) {

	extract(shortcode_atts(array('blogids' => '', 'numberofpost' => '3'), $atts));
	
	if(strlen($blogids) > 0 )
		 return '<ul>' .  Featured_blog_posts_for_specified_blogs($blogids,$numberofpost) . '</ul>';
	
}
add_shortcode('FEATURED_BLOG', 'Featured_blog_shortcode');

In the function Featured_blog_shortcode the arguments from the shortcode are passed. Then using the function shortcode_atts we merge the passed arguments with default values. For more details read the href="http://codex.wordpress.org/Function_Reference/shortcode_atts">shortcode_atts page in the WordPress Codex. Then we pass the comma separated blog list to the function Featured_blog_posts_for_specified_blogs which fetches the post from those blogs and returns a list.


Step 5 Using the ShortCode

To use the shortcode now we will create a new post, we will create a new post called "Featured Blogs" and then add the shortcode in its content as [FEATURED_BLOG blogids="3,1" numberofpost="2"], see also in the screen shot.

If we see the post preview now it will be seen as follows showing the featured blogs.


Step 6 Creating a Featured Blog Widget

To create a widget we will have to create a class that inherits from WP_Widget. The code for the widget is as follows:

class FeaturedBlogWidget extends WP_Widget {

	function FeaturedBlogWidget() {
		// widget actual processes
		$widget_ops = array('classname' => 'FeaturedBlogWidget', 'description' => 'Widget for featured blog' );
		$this->WP_Widget('FeaturedBlogWidget', 'FeaturedBlogWidget', $widget_ops);
	}

	function form($instance) {
		// outputs the options form on admin
		 $defaults = array( 'title' => 'Featured Blogs', 'blogids' => '' , 'numberofpost' => '3');
		 $instance = wp_parse_args( (array) $instance, $defaults );
		 
		 ?>
		 <p>
		 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php echo 'Title:'; ?></label>
		 <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" />
		 </p>
		 <p>
		 <label for="<?php echo $this->get_field_id( 'blogids' ); ?>"><?php echo 'Blog Ids: Separated By comma' ; ?></label>
		 <input id="<?php echo $this->get_field_id( 'blogids' ); ?>" name="<?php echo $this->get_field_name( 'blogids' ); ?>" value="<?php echo $instance['blogids']; ?>" class="widefat" />
		 </p>
		 <p>
		 <label for="<?php echo $this->get_field_id( 'numberofpost' ); ?>"><?php echo 'Number of posts per blog' ; ?></label>
		 <input id="<?php echo $this->get_field_id( 'numberofpost' ); ?>" name="<?php echo $this->get_field_name( 'numberofpost' ); ?>" value="<?php echo $instance['numberofpost']; ?>" class="widefat" />
		 </p>

		<?php
		 
	}

	function update($new_instance, $old_instance) {
		// processes widget options to be saved

		 $instance = $old_instance;
		 $instance['title'] = strip_tags( $new_instance['title'] );
		 $instance['blogids'] = $new_instance['blogids'];
		 $instance['numberofpost'] = $new_instance['numberofpost'];
		 return $instance;
	}

	function widget($args, $instance) {
		// outputs the content of the widget
		 extract( $args );
		 $title = apply_filters('widget_title', $instance['title'] );
		 echo $before_widget;
		 if ( $title )
			echo $before_title . $title . $after_title;
			
		 echo '<ul>';
		 echo Featured_blog_posts_for_specified_blogs($instance['blogids'],$instance['numberofpost']);
 		 echo '</ul>';
		 echo $after_widget;
	}

}

function Featured_blog_widget_init() {

	// Check for the required API functions
	if ( !function_exists('register_widget') )
		return;
	
	register_widget('FeaturedBlogWidget');
}
add_action('widgets_init', 'Featured_blog_widget_init');

In the constructor below

function FeaturedBlogWidget() {
	// widget actual processes
	$widget_ops = array('classname' => 'FeaturedBlogWidget', 'description' => 'Widget for featured blog' );
	$this->WP_Widget('FeaturedBlogWidget', 'FeaturedBlogWidget', $widget_ops);
}

In this we add the name and the description for the widget.

In the form function

function form($instance) {
	// outputs the options form on admin
	$defaults = array( 'title' => 'Featured Blogs', 'blogids' => '' , 'numberofpost' => '3');
	$instance = wp_parse_args( (array) $instance, $defaults );

	?>
	<p>
	<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php echo 'Title:'; ?></label>
	<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" />
	</p>
	<p>
	<label for="<?php echo $this->get_field_id( 'blogids' ); ?>"><?php echo 'Blog Ids: Separated By comma' ; ?></label>
	<input id="<?php echo $this->get_field_id( 'blogids' ); ?>" name="<?php echo $this->get_field_name( 'blogids' ); ?>" value="<?php echo $instance['blogids']; ?>" class="widefat" />
	</p>
	<p>
	<label for="<?php echo $this->get_field_id( 'numberofpost' ); ?>"><?php echo 'Number of posts per blog' ; ?></label>
	<input id="<?php echo $this->get_field_id( 'numberofpost' ); ?>" name="<?php echo $this->get_field_name( 'numberofpost' ); ?>" value="<?php echo $instance['numberofpost']; ?>" class="widefat" />
	</p>

	<?php

}

We create three text fields for

  • The title of the widget
  • The blog list
  • The number of posts per blog to be displayed

Here we merge the default values for the widget with the instance values using the function wp_parse_args. For more details on href="http://codex.wordpress.org/Function_Reference/wp_parse_args">wp_parse_args view the page in the WordPress Codex. The widget in the admin should now look as follows.

In the updated function

function update($new_instance, $old_instance) {
	// processes widget options to be saved

	 $instance = $old_instance;
	 $instance['title'] = strip_tags( $new_instance['title'] );
	 $instance['blogids'] = $new_instance['blogids'];
	 $instance['numberofpost'] = $new_instance['numberofpost'];
	 return $instance;
}

We update the title, blogids and numberofpost function when save is clicked by coping it in the instance. In the widget function

function widget($args, $instance) {
	// outputs the content of the widget
	extract( $args );
	$title = apply_filters('widget_title', $instance['title'] );
	echo $before_widget;
	if ( $title )
		echo $before_title . $title . $after_title;

	echo '<ul>';
	echo Featured_blog_posts_for_specified_blogs($instance['blogids'],$instance['numberofpost']);
	echo '</ul>';
	echo $after_widget;
}

In this function we get the values saved for the widget instance. The title is used as the title of the widget. We get the values for the blog list and the number of posts and pass it to the function Featured_blog_posts_for_specified_blogs which returns the list of posts from each blog.

We need to register this widget

function Featured_blog_widget_init() {

	// Check for the required API functions
	if ( !function_exists('register_widget') )
		return;
	
	register_widget('FeaturedBlogWidget');
}
add_action('widgets_init', 'Featured_blog_widget_init');

To register the widget we use the function register_widget in the function Featured_blog_widget_init which is added to the action hook 'widgets_init'.

The output of the widget will look as follows.


Conclusion

WordPress Multisite is a great platform to create a network of sites. In this plugin we saw how we can create a network plugin to display featured blogs. By creating such plugins we can enhance the WordPress Multisite platform and also provide the extra features which we need for our site network. There are also a lot of open source plugins for WordPress Multisite.

So have fun using WordPress Multisite for your network of sites!

Advertisement