Created
March 8, 2010 16:16
-
-
Save mhawksey/325305 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* The Google Analytics Stats Widget | |
* | |
* Now using widget API available in WordPress 2.8 | |
* @author Spiral Web Consulting | |
**/ | |
class GoogleStatsWidget extends WP_Widget | |
{ | |
function GoogleStatsWidget() { | |
$widget_ops = array('classname' => 'widget_google_stats', 'description' => __("Displays Stat Info From Google Analytics", 'google-analyticator') ); | |
$control_ops = array('width' => 400, 'height' => 400); | |
$this->WP_Widget('googlestats', __('Google Analytics Stats', 'google-analyticator'), $widget_ops, $control_ops); | |
} | |
function widget($args, $instance) { | |
extract($args); | |
$title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']); | |
$acnt = $instance['account']; | |
$timeFrame = empty($instance['timeFrame']) ? '1' : $instance['timeFrame']; | |
$pageBg = empty($instance['pageBg']) ? 'fff' : $instance['pageBg']; | |
$widgetBg = empty($instance['widgetBg']) ? '999' : $instance['widgetBg']; | |
$innerBg = empty($instance['innerBg']) ? 'fff' : $instance['innerBg']; | |
$font = empty($instance['font']) ? '333' : $instance['font']; | |
$line1 = empty($instance['line1']) ? 'Unique' : $instance['line1']; | |
$line2 = empty($instance['line2']) ? 'Visitors' : $instance['line2']; | |
$type = empty($instance['type']) ? '' : $instance['type']; | |
# Before the widget | |
echo $before_widget; | |
# The title | |
if ( $title ) | |
echo $before_title . $title . $after_title; | |
# Make the stats chicklet | |
echo '<!-- Data gathered from last ' . number_format($timeFrame) . ' days using Google Analyticator -->'; | |
if ($type == "Visitors"){ | |
$this->initiateBackground($pageBg, $font); | |
$this->beginWidget($font, $widgetBg); | |
$this->widgetInfo($this->getUniqueVisitors($acnt, $timeFrame), $line1, $line2, $innerBg, $font); | |
$this->endWidget(); | |
} else { | |
$this->getTopPages($acnt); | |
echo '<div style="font-size:9px;color:#666666;margin-top:0px;font-family:Verdana;text-align:right;">Powered By <a href="http://google.com/analytics/" title="Google Analytics" style="text-decoration:none;"><img src="' . plugins_url('/google-analyticator/ga_logo.png') . '" alt="Google Analytics" style="border:0px;position:relative;top:4px;" /></a></div>'; | |
} | |
# After the widget | |
echo $after_widget; | |
} | |
function update($new_instance, $old_instance) { | |
$instance = $old_instance; | |
$instance['title'] = strip_tags(stripslashes($new_instance['title'])); | |
$instance['account'] = strip_tags(stripslashes($new_instance['account'])); | |
$instance['timeFrame'] = strip_tags(stripslashes($new_instance['timeFrame'])); | |
$instance['pageBg'] = strip_tags(stripslashes($new_instance['pageBg'])); | |
$instance['widgetBg'] = strip_tags(stripslashes($new_instance['widgetBg'])); | |
$instance['innerBg'] = strip_tags(stripslashes($new_instance['innerBg'])); | |
$instance['font'] = strip_tags(stripslashes($new_instance['font'])); | |
$instance['line1'] = strip_tags(stripslashes($new_instance['line1'])); | |
$instance['line2'] = strip_tags(stripslashes($new_instance['line2'])); | |
$instance['type'] = strip_tags(stripslashes($new_instance['type'])); | |
return $instance; | |
} | |
function form($instance) { | |
//Defaults | |
$instance = wp_parse_args( (array) $instance, array('title'=>'', 'account'=>'', 'timeFrame'=>'1', 'pageBg'=>'fff', 'widgetBg'=>'999', 'innerBg'=>'fff', 'font'=>'333', 'line1'=>'Unique', 'line2'=>'Visitors', 'type'=>'') ); | |
$title = htmlspecialchars($instance['title']); | |
$acnt = htmlspecialchars($instance['account']); | |
$timeFrame = htmlspecialchars($instance['timeFrame']); | |
$pageBg = htmlspecialchars($instance['pageBg']); | |
$widgetBg = htmlspecialchars($instance['widgetBg']); | |
$innerBg = htmlspecialchars($instance['innerBg']); | |
$font = htmlspecialchars($instance['font']); | |
$line1 = htmlspecialchars($instance['line1']); | |
$line2 = htmlspecialchars($instance['line2']); | |
$type = htmlspecialchars($instance['type']); | |
$accounts = array(); | |
# Get the current memory limit | |
$current_mem_limit = substr(ini_get('memory_limit'), 0, -1); | |
# Check if this limit is less than 96M, if so, increase it | |
if ( $current_mem_limit < 96 || $current_mem_limit == '' ) { | |
if ( function_exists('memory_get_usage') ) | |
@ini_set('memory_limit', '96M'); | |
} | |
# Get the class for interacting with the Google Analytics | |
require_once('class.analytics.stats.php'); | |
# Create a new Gdata call | |
$stats = new GoogleAnalyticsStats(); | |
# Check if Google sucessfully logged in | |
$login = $stats->checkLogin(); | |
# Get a list of accounts | |
$accounts = $stats->getAnalyticsAccounts(); | |
# Output the options | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('title') . '">' . __('Title', 'google-analyticator') . ': <input style="width: 250px;" id="' . $this->get_field_id('title') . '" name="' . $this->get_field_name('title') . '" type="text" value="' . $title . '" /></label></p>'; | |
# display type (visitors or top pages | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('type') . '">' . __('Widget Type', 'google-analyticator') . ': '; | |
echo '<select name="' . $this->get_field_name('type') . '" id="' . $this->get_field_id('type') . '" style="margin-top: -3px; margin-bottom: 10px;">'; | |
echo '<option value="Visitors"' . (( $type == "Visitors") ? ' selected="selected"' : ''). '>Visitors</option>'; | |
echo '<option value="TopPosts"' . (( $type == "TopPosts") ? ' selected="selected"' : ''). '>Top Posts</option>'; | |
echo '</select></label></p>'; | |
# The list of accounts | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('account') . '">' . __('Analytics account', 'google-analyticator') . ': '; | |
echo '<select name="' . $this->get_field_name('account') . '" id="' . $this->get_field_id('account') . '" style="margin-top: -3px; margin-bottom: 10px;">'; | |
if ( count($accounts) > 0 ) | |
foreach ( $accounts AS $account ) { $select = ( $acnt == $account['id'] ) ? ' selected="selected"' : ''; echo '<option value="' . $account['id'] . '"' . $select . '>' . $account['title'] . '</option>'; } | |
elseif ( $login == false ) | |
echo '<option value="">' . __('Authenticate on settings page.', 'google-analyticator') . '</option>'; | |
else | |
echo '<option value="">' . __('No Analytics accounts available.', 'google-analyticator') . '</option>'; | |
echo '</select></label></p>'; | |
echo '<p style="text-align:center; border-top: 1px dashed #cccccc; font-weight:bold;">Settings for Visitors</p>'; | |
# Time frame | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('timeFrame') . '">' . __('Days of data to get', 'google-analyticator') . ': <input style="width: 150px;" id="' . $this->get_field_id('timeFrame') . '" name="' . $this->get_field_name('timeFrame') . '" type="text" value="' . $timeFrame . '" /></label></p>'; | |
# Page background | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('pageBg') . '">' . __('Page background', 'google-analyticator') . ': <input style="width: 150px;" id="' . $this->get_field_id('pageBg') . '" name="' . $this->get_field_name('pageBg') . '" type="text" value="' . $pageBg . '" /></label></p>'; | |
# Widget background | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('widgetBg') . '">' . __('Widget background', 'google-analyticator') . ': <input style="width: 150px;" id="' . $this->get_field_id('widgetBg') . '" name="' . $this->get_field_name('widgetBg') . '" type="text" value="' . $widgetBg . '" /></label></p>'; | |
# Inner background | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('innerBg') . '">' . __('Inner background', 'google-analyticator') . ': <input style="width: 150px;" id="' . $this->get_field_id('innerBg') . '" name="' . $this->get_field_name('innerBg') . '" type="text" value="' . $innerBg . '" /></label></p>'; | |
# Font color | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('font') . '">' . __('Font color', 'google-analyticator') . ': <input style="width: 150px;" id="' . $this->get_field_id('font') . '" name="' . $this->get_field_name('font') . '" type="text" value="' . $font . '" /></label></p>'; | |
# Text line 1 | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('line1') . '">' . __('Line 1 text', 'google-analyticator') . ': <input style="width: 200px;" id="' . $this->get_field_id('line1') . '" name="' . $this->get_field_name('line1') . '" type="text" value="' . $line1 . '" /></label></p>'; | |
# Text line 2 | |
echo '<p style="text-align:right;"><label for="' . $this->get_field_name('line2') . '">' . __('Line 2 text', 'google-analyticator') . ': <input style="width: 200px;" id="' . $this->get_field_id('line2') . '" name="' . $this->get_field_name('line2') . '" type="text" value="' . $line2 . '" /></label></p>'; | |
} | |
/** | |
* This function is used to display the background color behind the widget. This is necessary | |
* for the Google Analytics text to have the same background color as the page. | |
* | |
* @param $font_color - Hexadecimal value for the font color used within the Widget (does not effect "Powered By Google Analytics Text"). This effects border color as well. | |
* @param $page_background_color - Hexadecimal value for the page background color | |
* @return void | |
**/ | |
function initiateBackground($page_background_color = 'FFF', $font_color = '000') | |
{ | |
echo '<br />'; | |
echo '<div style="background:#' . $page_background_color . ';font-size:12px;color:#' . $font_color . ';font-family:\'Lucida Grande\',Helvetica,Verdana,Sans-Serif;">'; | |
} | |
/** | |
* This function starts the widget. The font color and widget background color are customizable. | |
* | |
* @param $font_color - Hexadecimal value for the font color used within the Widget (does not effect "Powered By Google Analytics Text"). This effects border color as well. | |
* @param $widget_background_color - Hexadecimal value for the widget background color. | |
* @return void | |
**/ | |
function beginWidget($font_color = '000', $widget_background_color = 'FFF') | |
{ | |
echo '<table style="width:auto!important;border-width:2px;border-color:#' . $font_color . ';border-style:solid;background:#' . $widget_background_color . ';"><tr>'; | |
} | |
/** | |
* This function encases the text that appears on the right hand side of the widget. | |
* Both lines of text are customizable by each individual user. | |
* | |
* It also displays the visitor count that was pulled from the user's Google Analytics account. | |
* | |
* @param $visitor_count - Number of unique visits to the site pulled from the user's Google Analytics account. | |
* @param $line_one - First line of text displayed on the right hand side of the widget. | |
* @param $line_two - Second line of text displayed on the right hand side of the widget. | |
* @param $inner_background_color - Hexadecimal value for the background color that surrounds the Visitor Count. | |
* @param $font_color - Hexadecimal value for the font color used within the Widget (does not effect "Powered By Google Analytics Text"). This effects border color as well | |
* @return void | |
**/ | |
function widgetInfo($visitor_count, $line_one = 'Unique', $line_two = 'Visitors', $inner_background_color = 'FFF', $font_color = '000') | |
{ | |
echo '<td style="width:auto!important;border-width:1px;border-color:#' . $font_color . ';border-style:solid;padding:0px 5px 0px 5px;text-align:right;background:#' . $inner_background_color . ';min-width:80px;*width:80px!important;"><div style="min-width:80px;">'. $visitor_count . '</div></td>'; | |
echo '<td style="width:auto!important;padding:0px 5px 0px 5px;text-align:center;font-size:11px;">' . $line_one . '<br />' . $line_two . '</td>'; | |
} | |
/** | |
* The function is used strictly for visual appearance. It also displays the Google Analytics text. | |
* | |
* @return void | |
**/ | |
function endWidget() | |
{ | |
// This closes off the widget. | |
echo '</tr></table>'; | |
// The following is used to displayed the "Powered By Google Anayltics" text. | |
echo '<div style="font-size:9px;color:#666666;margin-top:0px;font-family:Verdana;">Powered By <a href="http://google.com/analytics/" title="Google Analytics" style="text-decoration:none;"><img src="' . plugins_url('/google-analyticator/ga_logo.png') . '" alt="Google Analytics" style="border:0px;position:relative;top:4px;" /></a></div></div>'; | |
} | |
/** | |
* Grabs the cached value of the unique visits for the previous day | |
* | |
* @param account - the account to get the unique visitors from | |
* @param time - the amount of days to get | |
* @return void | |
**/ | |
function getUniqueVisitors($account, $time = 1) | |
{ | |
# Get the value from the database | |
$visits = unserialize(get_option('google_stats_visits_' . $account)); | |
# Check to make sure the timeframe is an int and greater than one | |
$time = (int) $time; | |
if ( $time < 1 ) | |
$time = 1; | |
# Check if the call has been made before | |
if ( is_array($visits) ) { | |
# Check if the last time called was within two hours, if so, return that | |
if ( $visits['lastcalled'] > ( time() - 7200 ) ) | |
return $visits['unique']; | |
} | |
# If here, the call has not been made or it is expired | |
# Get the current memory limit | |
$current_mem_limit = substr(ini_get('memory_limit'), 0, -1); | |
# Check if this limit is less than 96M, if so, increase it | |
if ( $current_mem_limit < 96 || $current_mem_limit == '' ) { | |
if ( function_exists('memory_get_usage') ) | |
@ini_set('memory_limit', '96M'); | |
} | |
# Get the class for interacting with the Google Analytics | |
require_once('class.analytics.stats.php'); | |
# Create a new Gdata call | |
$stats = new GoogleAnalyticsStats(); | |
# Set the account to the one requested | |
$stats->setAccount($account); | |
# Get the latest stats | |
$before = date('Y-m-d', strtotime('-' . $time . ' days')); | |
$yesterday = date('Y-m-d', strtotime('-1 day')); | |
$uniques = number_format($stats->getMetric('ga:visitors', $before, $yesterday)); | |
# Make the array for database storage | |
$visit = serialize(array('unique'=>$uniques, 'lastcalled'=>time())); | |
# Store the array | |
update_option('google_stats_visits_' . $account, $visit); | |
# Return the visits | |
return $uniques; | |
} | |
function getTopPages($account) | |
{ | |
# Get the value from the database | |
$cached = unserialize(get_option('google_stats_topPages_'.$account)); | |
if ( is_array($cached) ) { | |
$stats = $cached['stats']; | |
} | |
# Check the size of the stats array | |
if ( count($stats) <= 0 || !is_array($stats) ) { | |
echo '<p>' . __('There is no data for view...', 'google-analyticator') . '</p>'; | |
} else { | |
# Build the top pages list | |
echo '<ol>'; | |
# Set variables needed to correct (not set) bug | |
$new_stats = array(); | |
$notset_stats = array(); | |
# Loop through each stat and create a new array | |
foreach ( $stats AS $stat ) { | |
# If the stat is not set | |
if ( $stat['ga:pageTitle'] == '(not set)' ) { | |
# Add it to separate array | |
$notset_stats[] = $stat; | |
} else { | |
# Add it to new array with index set | |
$new_stats[$stat['ga:pagePath']] = $stat; | |
} | |
} | |
# Loop through all the (not set) stats and attempt to add them to their correct stat | |
foreach ( $notset_stats AS $stat ) { | |
# If the stat has a "partner" | |
if ( $new_stats[$stat['ga:pagePath']] != NULL ) { | |
# Add the pageviews to the stat | |
$new_stats[$stat['ga:pagePath']]['ga:pageviews'] = $new_stats[$stat['ga:pagePath']]['ga:pageviews'] + $stat['ga:pageviews']; | |
} else { | |
# Stat goes to the ether since we couldn't find a partner (if anyone reads this and has a suggestion to improve, let me know) | |
} | |
} | |
# Renew new_stats back to stats | |
$stats = $new_stats; | |
# Sort the stats array, since adding the (not set) items may have changed the order | |
// usort($stats, array($this, 'statSort')); | |
# Since we can no longer rely on the API as a limiter, we need to keep track of this ourselves | |
$stat_count = 0; | |
# Loop through each stat for display | |
foreach ( $stats AS $stat ) { | |
echo '<li class="google_stat_list"><a href="' . esc_url($stat['ga:pagePath']) . '">' . esc_html($stat['ga:pageTitle']) . '</a></li>'; | |
# Increase the stat counter | |
$stat_count++; | |
# Stop at 5 | |
if ( $stat_count >= 5 ) | |
break; | |
} | |
# Finish the list | |
echo '</ol>'; | |
} | |
} | |
}// END class | |
/** | |
* Register Google Analytics Stat Widget. | |
*/ | |
function GoogleStatsWidget_init() { | |
register_widget('GoogleStatsWidget'); | |
} | |
add_action('widgets_init', 'GoogleStatsWidget_init'); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment