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.
# your plugin directory .. . facebook.php fb_ca_chain_bundle.crt base_facebook.php MostPopular.php
Start coding plugin in MostPopular.php with plugin info.
/* Plugin Name: Most Liked Posts on Facebook Plugin URI: https://www.vikaskbh.com/ Description: Fetches and Display most Liked urls on facebook Version: 1.0.0 Author: Vikas Bhagwagar Author URI: https://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?
if(!class_exists('FacebookApiException')) { include_once(plugin_dir_path(__FILE__) . 'facebook.php'); }
Now initialize your widget class by extending wordpress WP_Widget class
class MostPopular extends WP_Widget { function MostPopular() { parent::WP_Widget(false, 'Popular on Facebook'); } }
Register your widget with wordpress framework.
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.
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?)
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
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.
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.
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'); }