To implement most shared url of any wordpress blog, first of all download facebook php sdk here Some basic setup already explained there.
Basic setup for write wordpress plugin
- Create your plugin directoy and file with same name.
i.e. Directory: MostPopular and File: MostPopular.php inside MostPopular direcotory.
- Place base_facebook.php, fb_ca_chain_bundle.crt and facebook.php within the directory.
1 2 3 4 5 6 7 | # your plugin directory .. . facebook.php fb_ca_chain_bundle.crt base_facebook.php MostPopular.php |
Start coding plugin in MostPopular.php with plugin info.
1 2 3 4 5 6 7 8 | /* Plugin Name: Most Liked Posts on Facebook Plugin URI: http://www.vikaskbh.com/ Description: Fetches and Display most Liked urls on facebook Version: 1.0.0 Author: Vikas Bhagwagar Author URI: http://www.vikaskbh.com/ */ |
It’s possible many other wordpress plugins may already using facebook sdk and initialized by them. So there might be class collision issue. (i.e. class re-declare error) To avoid this situation you could use php namespaces that we already discussed here. Otherwise, You could also check, if class already initialize by other plugins or not?
1 2 3 | if(!class_exists('FacebookApiException')) { include_once(plugin_dir_path(__FILE__) . 'facebook.php'); } |
Now initialize your widget class by extending wordpress WP_Widget class
1 2 3 4 5 | class MostPopular extends WP_Widget { function MostPopular() { parent::WP_Widget(false, 'Popular on Facebook'); } } |
Register your widget with wordpress framework.
1 2 3 4 5 | function register_MostPopular(){ register_widget('MostPopular'); } add_action( 'widgets_init', 'register_MostPopular' ); |
Wordpress will call our class ‘MostPopular‘ and initialize its constructor and then look for widget() function to draw widget (HTML/CSS) in frontend. (Why?)
Adding widget() function within our class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | function widget($args, $instance) { $args['title'] = $instance['title']; plugin_popularPosts($args); } function plugin_popularPosts(){ global $wpdb; $site_urls = Array(); $links = Array(); $request = 'SELECT ID,post_title FROM ' . $wpdb->posts . ' WHERE post_status="publish" and post_type="post" and post_parent=0 order by ID desc' ; $posts = $wpdb->get_results($request); foreach($posts as $key=>$value){ $link = get_permalink($value->ID); $links[get_permalink($value->ID)] = $value->post_title; $site_urls[] = "\"".get_permalink($value->ID)."\""; } if(get_option("plugin_fb_count_data") == ""){ do_this_hourly(); } $result = unserialize(get_option("plugin_fb_count_data")); if(get_option("plugin_widget_title") != ""){ $title = get_option("plugin_widget_title"); } else { $title = "Popular on Facebook"; } echo '<h2 style="clear:both">'.$title.'</h2>'; echo "<ul style='padding-top:5px;margin-left:0 !important'>"; foreach($result as $key=>$value){ echo "<li style='margin-bottom:5px !important;clear:both;overflow:hidden;padding:3px 0 3px 0;border-bottom:1px dotted #CDCDCD'>"; echo '<div style="float:left;width:50px;" class="fb-like" data-href="'.$value['url'].'" data-send="false" data-layout="box_count" data-width="50" data-show-faces="false" data-font="arial"></div>'; echo "<div style='float:left;width:220px;padding-left:5px'><a href='".$value['url']."'>".$links[$value['url']]."</a></div>"; echo "</li>"; } echo "</ul>"; } |
Admin Area:-
Widget Customization. Add form() & update() function in your widget. (why?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | function form($instance) { // outputs the options form on admin if ( isset( $instance[ 'title' ] ) ) { $title = $instance[ 'title' ]; } else { $title = __( 'Popular on Facebook', 'plugin_widget' ); } if ( isset( $instance[ 'count' ] ) ) { $count = $instance[ 'count' ]; } else { $count = __( '5', 'plugin_widget' ); } if ( isset( $instance[ 'skip_urls' ] ) ) { $skip_urls = $instance[ 'skip_urls' ]; } else { $skip_urls = __( '', 'plugin_widget' ); } ?> <p> <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Widget Title:' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Number of Posts to be displayed:' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>" type="text" value="<?php echo esc_attr( $count ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'skip_urls' ); ?>"><?php _e( 'List of urls to be Ommited<br/>(seprated by lines):' ); ?></label> <textarea class="widefat" style="height:150px" id="<?php echo $this->get_field_id( 'skip_urls' ); ?>" name="<?php echo $this->get_field_name( 'skip_urls' ); ?>" ><?php echo esc_attr( $skip_urls ); ?></textarea> </p> <?php } function update($new_instance, $old_instance) { // processes widget options to be saved update_option("plugin_skip_urls",$new_instance['skip_urls']); update_option("plugin_widget_title",$new_instance['title']); update_option("plugin_row_count",$new_instance['count']); return $new_instance; } Now time to add facebook api javascript in your wordpress. function plugin_scripts_load() { // Deregister the included library wp_deregister_script( 'plugin_fblike' ); // Register the library again wp_register_script( 'plugin_fblike', 'http://connect.facebook.net/en_US/all.js#xfbml=1&appId=000000000000', array(), null, false ); // replace 000000000000 with your app_id // For either a plugin or a theme, you can then enqueue the script: wp_enqueue_script( 'plugin_fblike' ); } add_action( 'wp_enqueue_scripts', 'plugin_scripts_load' ); |
Fetching and storing most liked posts using Facebook API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | function do_this_hourly() { if(!class_exists("Facebook")) { include_once(plugin_dir_path(__FILE__) . 'facebook.php'); } global $wpdb; $site_urls = Array(); $links = Array(); $request = 'SELECT ID,post_title FROM ' . $wpdb->posts . ' WHERE post_status="publish" and post_type="post" and post_parent=0 order by ID desc' ; $posts = $wpdb->get_results($request); if(get_option("plugin_skip_urls") == ""){ $skip_urls_array = Array(); } else { $skip_urls_array = preg_split("/\n|\r\n/",get_option("plugin_skip_urls")); } foreach($posts as $key=>$value){ $link = get_permalink($value->ID); $links[get_permalink($value->ID)] = $value->post_title; $site_urls[] = "\"".get_permalink($value->ID)."\""; } if(count($skip_urls_array) > 0){ foreach($skip_urls_array as $key=>$value){ $key_to_remove = array_search("\"".$value."\"", $site_urls); if (false !== $key_to_remove) { unset($site_urls[$key_to_remove]); } } } //Get Facebook SDK Object $config = array( 'appId' => "000000000000", 'secret' => "0000000000000000000000000000000", 'cookie' => true, ); try { $facebook = new Facebook($config); } catch (FacebookApiException $e) { // echo 'Excetption is' . $e->__toString(); } if(get_option("plugin_row_count") == ""){ $limit_count = 5; } else { $limit_count = get_option("plugin_row_count"); } $req = "select url,total_count from link_stat where url in(".implode(",",$site_urls).") order by total_count desc limit $limit_count"; //Create Query $params = array( 'method' => 'fql.query', 'query' => $req , ); $result = $facebook->api($params); $data = serialize($result); update_option("plugin_fb_count_data",$data); } |
Call this function() hourly using wordpress scheduler.
1 2 | wp_schedule_event(time(), 'hourly', 'hourly_event'); add_action('hourly_event', 'do_this_hourly'); |
Making plugin more graceful.
Use plugin activation and deactivation hook to start and stop wordpress cron jobs using register_activation_hook() and register_deactivation_hook() whenever user activate or deactivate the plugin.
1 2 3 4 5 6 7 8 9 10 11 12 | register_activation_hook(__FILE__, 'activation'); register_deactivation_hook( __FILE__, 'deactivate' ); add_action('hourly_event', 'do_this_hourly'); function activation() { update_option("plugin_fb_count_data",""); wp_schedule_event(time(), 'hourly', 'hourly_event'); } function deactivate() { wp_clear_scheduled_hook('hourly_event'); } |
So, what do you think ?