'activitysparks', 'description' => 'A sparkline chart for posts/comments'); $this->WP_Widget('activitysparks', 'Activity Sparks', $widget_ops); } function widget($args, $instance) { extract($args); $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']); $url = $this->build_url($instance); // output echo $before_widget; if($title) echo $before_title.$title.$after_title; echo ''; echo $after_widget; } function build_url($instance) { $dataset = empty($instance['dataset']) ? 'posts' : $instance['dataset']; $width_px = empty($instance['width_px']) ? 250 : $instance['width_px']; $height_px = empty($instance['height_px']) ? 30 : $instance['height_px']; $period = empty($instance['period']) ? 30 : $instance['period']; $ticks = empty($instance['ticks']) ? 100 : $instance['ticks']; $chma = empty($instance['chma']) ? 0 : $instance['chma']; $bkgrnd = empty($instance['bkgrnd']) ? 'FFFFFF' : $instance['bkgrnd']; $posts_color = empty($instance['posts_color']) ? '4D89F9' : $instance['posts_color']; $comments_color = empty($instance['comments_color']) ? 'FF9900' : $instance['comments_color']; // load the data if($dataset != 'comments') $posts_data = $this->get_datapoints('posts',$period); if($dataset != 'posts') $comments_data = $this->get_datapoints('comments',$period); // build the URL for Google Chart API $url = 'http://chart.apis.google.com/chart?chs='.$width_px.'x'.$height_px.'&cht=ls'; $chd = ''; if($dataset != 'comments') { $chd = $posts_data; $chco = $posts_color; if($dataset != 'posts'){ $chd .= '|'; $chco .= ','; } } if($dataset != 'posts') { $chd .= $comments_data; $chco .= $comments_color; } $url .= '&chd=t:'.$chd; // line color(s) $url .= '&chco='.$chco; // display legend? if($dataset == 'legend') $url .= '&chdl=Posts|Comments'; //background color ? if($bkgrnd=='NONE') $bkgrnd = 'FFFFFF00'; // transparent background if($bkgrnd!='FFFFFF') $url .= '&chf=bg,s,'.$bkgrnd; // margin padding ? if($chma) { $url .= "&chma=$chma,$chma,$chma,$chma"; if($dataset=='legend') $url .= '|90,20'; } return $url; } function get_datapoints($type='posts', $period=30, $ticks=100) { global $wpdb; $wpdb->show_errors(); $now_tick = $wpdb->get_row("SELECT ROUND((TO_DAYS(now()))/$period) tick")->tick; if($type=='posts') { $sql = "SELECT ROUND((TO_DAYS(post_date))/$period) ticker, count(*) value FROM {$wpdb->prefix}posts WHERE post_status='publish' AND post_date > date_sub(now(), interval ($ticks*$period) day) GROUP BY ticker ORDER BY ticker"; } if($type=='comments') { $sql = "SELECT ROUND((TO_DAYS(comment_date))/$period) ticker, count(*) value FROM {$wpdb->prefix}comments WHERE comment_approved='1' AND comment_date > date_sub(now(), interval ($ticks*$period) day) GROUP BY ticker ORDER BY ticker"; } $rows = $wpdb->get_results($sql); $data = array(); $maxval=0; foreach($rows as $row){ $end_ticker=$row->ticker; $data[$row->ticker] = $row->value; if($maxval< $row->value){ $maxval=$row->value; } } // "normalize" data and build CSV if($maxval<4) $maxval=4; for($i=$now_tick-$ticks;$i<=$now_tick;$i++){ $value = $maxval ? intval(($data[$i]/$maxval)*100) : 0; $data_points .= (isset($data_points)) ? ','.$value : $value; } return $data_points; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = strip_tags(stripslashes($new_instance['title'])); $instance['dataset'] = $new_instance['dataset']; $instance['width_px'] = intval($new_instance['width_px']); $instance['height_px'] = intval($new_instance['height_px']); $instance['period'] = intval($new_instance['period']); $instance['ticks'] = intval($new_instance['ticks']); $instance['chma'] = intval($new_instance['chma']); $instance['bkgrnd'] = strtoupper($new_instance['bkgrnd']); $instance['posts_color'] = strtoupper($new_instance['posts_color']); $instance['comments_color'] = strtoupper($new_instance['comments_color']); return $instance; } function form($instance) { $instance = wp_parse_args((array)$instance, array( 'title' => 'Recent Activity', 'width_px' => 250, 'height_px' => 50, 'period' => 7, 'ticks' => 90, 'chma' => 5, 'bkgrnd' => 'FFFFFF', 'posts_color' => '4D89F9', 'comments_color' => 'FF9900' )); $title = htmlspecialchars($instance['title']); $dataset = $instance['dataset']; $width_px = intval($instance['width_px']); $height_px = intval($instance['height_px']); $period = intval($instance['period']); $ticks = intval($instance['ticks']); $chma = intval($instance['chma']); // Graph Margin $bkgrnd = htmlspecialchars($instance['bkgrnd']); $posts_color = htmlspecialchars($instance['posts_color']); $comments_color = htmlspecialchars($instance['comments_color']); ${'dataset_'.$dataset} = 'SELECTED'; ${'period_'.$period} = 'SELECTED'; echo '





Change the Period to suit the frequency of your posts, and Ticks to limit how many periods to graph.
 






e.g. FFFFAA or NONE


'; } } function activitysparks_init() { register_widget('activitysparks'); } add_action('widgets_init', 'activitysparks_init'); ?>