- 
		AuthorPosts
- 
		
			
				
February 1, 2014 at 11:02 pm #939I have upgraded to the most recent theme and professional plugin and done some testing. The new analytics function is still buggy. When I do a search for a search term NOT available on my site I find a number of entries like below in the error_log: [01-Feb-2014 22:53:22 UTC] WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '2014-02-01 22:53:22', 1)
 ON DUPLICATE KEY UPDATE
 views = views + 1,
 l' at line 4 for query INSERT INTO `hsr_ss_analytics_term`
 (`id`, `lastview`, `views`)
 VALUES
 (, '2014-02-01 22:53:22', 1)
 ON DUPLICATE KEY UPDATE
 views = views + 1,
 lastview = '2014-02-01 22:53:22' made by require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/symbiostock/search.php'), network_manager->network_search_all_similar, ajt_network_search_all, network_manager->display_network_results, network_manager->display_results, symbiostock_build_html_results, ss_analytics->__construct, ss_analytics->update_term_analyticNote of caution: I have included a number of modification to the theme. So it might be good if someone could try and confirm same behavior with the unmodified theme. February 2, 2014 at 12:44 am #9181Thanks. I’ll get on that Asap. February 2, 2014 at 12:50 am #9182Upgrade now you should be fine. February 2, 2014 at 1:06 am #9183Can you update on Github, please? – I can’t just upgrade from within WP because it’ll wipe out my code modifications… February 2, 2014 at 1:18 am #9184I have to reset my local github folder, but instead, simply paste this into the analytics file. OPEN: inc/class/analytics.phpReplace entire file: 
 <?php
 /**
 * Symbiostock's Analytics System. Tracks general visits and network referrals.
 *
 * This class tracks 4 page types: Image Views, Keyword Views, Keyword History, Category Views, and Human Searches.
 * It also tracks referring URLs as well as Symbiostock-specific referrals (from the networks).
 * It tracks general history back 60 days.
 *
 * To call analytics, you must add the proper variables to the URL:
 *
 * ss_analytics= (history|referrals|image_views|term_views)
 * If getting traffic history ss_analytics=history, then you must specify the date range.
 *
 * Example General History:
 * "?ss_analytics=history&ss_sdt=2014-01-28_21:05:37&ss_edt=2014-01-30_00:00:00" (mysql datetimes)
 *
 * Example, Keywords History:
 * ?ss_analytics=keyword_history&ss_sdt=2014-01-27_06:48:45&ss_edt=2014-01-31_06:50:14
 *
 * (ss_sdt means Start Date, ss_edt means End Date).
 *
 * @link http://dev.mysql.com/doc/refman/4.1/en/datetime.html
 *
 * @category Symbiostock Analytics
 * @package symbiostock
 * @author Leo Blanchette
 * @copyright Symbiostock
 */
 
 class ss_analytics{
 
 /**
 * Whether or not to execute analytics log for given page. 1 = yes, 0 = no
 * @var bool
 */
 public $execute;
 
 /**
 * Client IP
 * @var string
 */
 public $client_ip;
 
 /**
 * Type of page: 1=image, 2=keyword, 3=category, 4=search
 * @var int
 */
 public $type;
 
 /**
 * ID of Image or Term
 * @var int
 */
 public $id;
 
 /**
 * User-entered search terms, when they are entering searches while browsing a Symbiostock site.
 * @var string
 */
 public $search_term;
 
 /**
 * If this is a symbiostock site referral, we log it.
 * @var string
 */
 public $referrer;
 
 /**
 * The URL of the general referrer, Symbiostock site or not.
 * @var string url of referrer
 */
 public $referring_url;
 
 /**
 * When the site delivers search results, this variable distinguishes between local, network, and promoted results.
 * @var int 1: local 2: network 3: promoted
 */
 public $search_result_type;
 
 /**
 * For local or network results, we list the website its coming from. This is used in keyword tracking.
 * @var string the website results came from.
 */
 public $results_website;
 
 /**
 * Set up initial class properties for analytics
 */
 
 /**
 * For tracking both keywords and tags as one.
 * @var string
 */
 public $keyword_or_tag;
 
 
 public function __construct($action, $site = '', $result_type = '' ){
 
 global $wpdb;
 
 global $analytic_run_once;
 
 $public_analytics = get_option('symbiostock_public_analytics', 1);
 
 if($action == 1){
 
 header('Content-type: text/plain');
 
 
 if($public_analytics == 0){
 echo 0;
 die;
 }
 
 
 switch($_GET){
 
 case 'history':
 
 $this->history();
 
 break;
 
 case 'keyword_history':
 
 $this->keyword_history();
 
 break;
 
 case 'referrals':
 
 $this->referrals();
 
 break;
 
 case 'image_views':
 
 $this->image_views();
 
 break;
 
 case 'term_views':
 
 $this->term_views();
 
 break;
 
 }
 die;
 
 }
 
 
 
 $theme_data = wp_get_theme( 'symbiostock' );
 
 $last_version = get_option('ss_analytics_last_version', 0);
 
 if($last_version version){
 $installer = 1;
 } else {
 $installer = 0;
 }
 
 if($installer){
 $ss_analytic_tables = array(
 
 //ANALYTICS HISTORY
 "CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."ss_analytics_history` (
 `time` datetime NOT NULL,
 `ip` varchar(128) NOT NULL,
 `type` int(11) NOT NULL,
 `id` int(11) NOT NULL,
 `ss_referrer` varchar(2000) NOT NULL,
 `r_url` varchar(2000) NOT NULL,
 `search_term` varchar(128) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;",
 
 //ANALYTICS KEYWORD PERFORMANCE
 "CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."ss_analytics_keyword_performance` (
 `time` datetime NOT NULL,
 `site` varchar(2000) NOT NULL,
 `keyword` varchar(100) NOT NULL,
 `result_type` int(11) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;",
 
 //IMAGE ANALYTICS
 "CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."ss_analytics_image` (
 `id` int(11) NOT NULL,
 `lastview` datetime NOT NULL,
 `views` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;",
 
 //TERM ANALYTICS
 "CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."ss_analytics_term` (
 `id` int(11) NOT NULL,
 `lastview` datetime NOT NULL,
 `views` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;",
 
 //REFERRAL ANALYTICS
 "CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."ss_analytics_referrals` (
 `siteid` varchar(50) NOT NULL,
 `referrals` int(11) NOT NULL,
 PRIMARY KEY (`siteid`),
 UNIQUE KEY `siteid` (`siteid`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;",
 );
 
 foreach($ss_analytic_tables as $ss_analytic_table){
 $wpdb->query($ss_analytic_table);
 
 }
 
 update_option('ss_analytics_last_version', $theme_data->version);
 }
 
 
 //set up IP address
 $this->client_ip = $this->get_client_ip();
 
 //if image, carry out image analytic functions
 if ( 'image' == get_post_type() ){
 
 //Since we are on valid page, we can issue an analytic logging
 $this->execute = 1;
 
 $this->type = 1;
 $this->id = get_the_ID();
 }
 
 //if is keyword taxonomy, set up keyword analytic functions
 if ( is_tax('image-tags') ){
 
 //Since we are on valid page, we can issue an analytic logging
 $this->execute = 1;
 
 $this->type = 2;
 $tag = get_query_var( 'image-tags' );
 
 $obj = get_term_by( 'slug', $tag, 'image-tags', OBJECT);
 
 $this->keyword_or_tag = $obj->name;
 
 $this->id = $obj->term_id;
 }
 
 //if is category taxonomy, set up category analytic functions
 if ( is_tax('image-type') ){
 
 //Since we are on valid page, we can issue an analytic logging
 $this->execute = 1;
 
 $this->type = 3;
 $category = get_query_var( 'image-type' );
 
 $obj = get_term_by( 'slug', $category, 'image-type', OBJECT);
 
 $this->id = $obj->term_id;
 }
 
 //if is search, set up search analytic functions
 if ( is_search() ) {
 
 //Since we are on valid page, we can issue an analytic logging
 $this->execute = 1;
 
 $this->type = 3;
 
 $s = get_query_var( 's' );
 
 $this->keyword_or_tag = $s;
 
 $this->search_term = $s;
 } else {
 $this->search_term = 'NA';
 }
 
 //get Symbiostock Referrer (if from another site)
 if(isset($_GET)){
 
 if(!symbiostock_validate_url( $_GET ))
 $this->referrer = 'NULL';
 
 $this->referrer = $_GET;
 } else {
 $this->referrer = 'NULL';
 }
 
 if(isset($_SERVER)){
 $this->referring_url = $_SERVER;
 } else {
 $this->referring_url = 'NULL';
 }
 
 if ((isset($_SERVER)) && ($_SERVER == 'prefetch')) {
 // This is a prefetch request. stop it.
 $this->execute = 0;
 }
 
 if($this->execute == 1){
 
 $this->update_referrals();
 
 switch($this->type){
 case 1: #IMAGE
 $this->update_history();
 $this->update_image_analytic();
 
 break;
 
 case 2: #TAG
 $this->update_history();
 $this->update_term_analytic();
 
 break;
 
 case 3: #CATEGORY
 $this->update_history();
 $this->update_term_analytic();
 break;
 }
 
 if($action == 2){
 if(empty($site))
 return;
 
 $this->results_website = $site;
 $this->search_result_type = $result_type;
 $this->update_keyword_performance();
 }
 
 $this->delete_expired();
 }
 
 }
 
 /**
 * Logs a page visit to the analytics history.
 */
 public function update_history(){
 global $wpdb;
 
 $results = $wpdb->insert(
 $wpdb->prefix."ss_analytics_history",
 array(
 'time' => date('Y-m-d H:i:s'),
 'ip' => mysql_real_escape_string($this->client_ip),
 'type' => mysql_real_escape_string($this->type),
 'id' => mysql_real_escape_string($this->id),
 'ss_referrer' => mysql_real_escape_string($this->referrer),
 'r_url' => mysql_real_escape_string($this->referring_url),
 'search_term' => mysql_real_escape_string($this->search_term)
 ),
 array(
 '%s', // time
 '%s', // ip
 '%s', // type
 '%s', // id
 '%s', // ss_referrer
 '%s', // r_url
 '%s', // search_term
 )
 );
 }
 
 /**
 * Updates image count
 */
 function update_image_analytic(){
 global $wpdb;
 
 $wpdb->query(
 "INSERT INTO `".$wpdb->prefix."ss_analytics_image`
 (`id`, `lastview`, `views`)
 VALUES
 (".$this->id.", '".date('Y-m-d H:i:s')."', 1)
 ON DUPLICATE KEY UPDATE
 views = views + 1,
 lastview = '".date('Y-m-d H:i:s')."'"
 );
 }
 
 /**
 * Updates term count
 */
 function update_term_analytic(){
 global $wpdb;
 
 if(!isset($this->id) || empty($this->id))
 return;
 
 $wpdb->query(
 "INSERT INTO `".$wpdb->prefix."ss_analytics_term`
 (`id`, `lastview`, `views`)
 VALUES
 (".$this->id.", '".date('Y-m-d H:i:s')."', 1)
 ON DUPLICATE KEY UPDATE
 views = views + 1,
 lastview = '".date('Y-m-d H:i:s')."'"
 );
 }
 
 /**
 * Updates keyword performance
 */
 function update_keyword_performance(){
 global $wpdb;
 
 if(empty($this->keyword_or_tag) || empty($this->keyword_or_tag))
 return;
 
 $wpdb->query(
 "INSERT INTO `".$wpdb->prefix."ss_analytics_keyword_performance`
 (`time`, `site`, `keyword`, `result_type`)
 VALUES
 ('".date('Y-m-d H:i:s')."', '".$this->results_website."', '".$this->keyword_or_tag."', ".$this->search_result_type.")"
 );
 }
 
 /**
 * Updates referral count
 */
 function update_referrals(){
 global $wpdb;
 
 if(empty($this->referrer))
 return;
 
 $wpdb->query(
 "INSERT INTO `".$wpdb->prefix."ss_analytics_referrals`
 (`siteid`, `referrals`)
 VALUES
 ('".mysql_real_escape_string($this->referrer)."', 1)
 ON DUPLICATE KEY UPDATE
 referrals = referrals + 1"
 );
 }
 
 /**
 * Deletes history over 60 days old
 */
 public function delete_expired(){
 $expiration = 60;
 global $wpdb;
 $wpdb->query("DELETE FROM ".$wpdb->prefix."ss_analytics_history
 WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(),
 INTERVAL ".$expiration." DAY))");
 $wpdb->query("DELETE FROM ".$wpdb->prefix."ss_analytics_keyword_performance
 WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(),
 INTERVAL ".$expiration." DAY))");
 }
 
 
 /**
 * Fairly reliable function for getting the IP address of visitor.
 *
 * @return string ip address
 */
 public function get_client_ip() {
 $ipaddress = '';
 if (getenv('HTTP_CLIENT_IP'))
 $ipaddress = getenv('HTTP_CLIENT_IP');
 else if(getenv('HTTP_X_FORWARDED_FOR'))
 $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
 else if(getenv('HTTP_X_FORWARDED'))
 $ipaddress = getenv('HTTP_X_FORWARDED');
 else if(getenv('HTTP_FORWARDED_FOR'))
 $ipaddress = getenv('HTTP_FORWARDED_FOR');
 else if(getenv('HTTP_FORWARDED'))
 $ipaddress = getenv('HTTP_FORWARDED');
 else if(getenv('REMOTE_ADDR'))
 $ipaddress = getenv('REMOTE_ADDR');
 else
 $ipaddress = 'UNKNOWN';
 return $ipaddress;
 }
 
 public function time_hint(){
 return "Try: nn" . '&ss_std=' .
 str_replace(' ', '_', date("Y-m-d H:i:s",strtotime(date("Y-m-d H:i:s"))-(60*60*24))) .
 '&ss_edt=' . str_replace(' ', '_', date('Y-m-d H:i:s'))
 ."nn(Retrieves one day back from present server time)";
 }
 
 //---- ---- ---- Analytics Sharing ---- ---- ---- ----
 
 public function generateCsv($data, $delimiter = ',', $enclosure = '"') {
 $handle = fopen('php://temp', 'r+');
 foreach ($data as $line) {
 fputcsv($handle, $line, $delimiter, $enclosure);
 }
 rewind($handle);
 while (!feof($handle)) {
 $contents .= fread($handle, 8192);
 }
 fclose($handle);
 return $contents;
 }
 
 /**
 * Gets general history logs of visits.
 */
 public function history(){
 global $wpdb;
 
 #date format: 2010-10-01
 
 if(!isset($_GET)||!isset($_GET)){
 echo "Request invalidn";
 }
 
 $start = mysql_real_escape_string(trim(str_replace('_', ' ', $_GET)));
 $end = mysql_real_escape_string(trim(str_replace('_', ' ', $_GET)));
 
 $history = $wpdb->get_results(
 "SELECT *
 FROM `".$wpdb->prefix."ss_analytics_history`
 WHERE time
 BETWEEN '".$start."' AND '".$end."'
 ORDER BY time DESC", ARRAY_A
 );
 
 if(empty($history)){
 echo "No results for given parametersnn";
 echo $this->time_hint();
 return;
 }
 
 $keys = array(
 'TIME',
 'IP',
 'TYPE(1:image 2:keyword 3:category)',
 'ID',
 'SYMBIOSTOCK REFERRAL',
 'REFERRING URL',
 'SEARCH TERM (human entered)',
 );
 
 array_unshift($history, $keys);
 
 echo $this->generateCsv($history);
 }
 
 /**
 * Gets history of keyword results in general search (for keyword research)
 */
 public function keyword_history(){
 global $wpdb;
 
 #date format: 2010-10-01
 
 if(!isset($_GET)||!isset($_GET)){
 echo "Request invalidn";
 }
 
 $start = mysql_real_escape_string(trim(str_replace('_', ' ', $_GET)));
 $end = mysql_real_escape_string(trim(str_replace('_', ' ', $_GET)));
 
 $history = $wpdb->get_results(
 "SELECT *
 FROM `".$wpdb->prefix."ss_analytics_keyword_performance`
 WHERE time
 BETWEEN '".$start."' AND '".$end."'
 ORDER BY time DESC", ARRAY_A
 );
 
 if(empty($history)){
 echo "No results for given parametersnn";
 echo $this->time_hint();
 return;
 }
 
 $keys = array(
 'TIME',
 'SITE',
 'KEYWORD',
 'RESULT TYPE (1: Local 2:Network 3:Promoted)',
 );
 
 array_unshift($history, $keys);
 
 echo $this->generateCsv($history);
 }
 /**
 * Gets the referral count of network sites.
 */
 public function referrals(){
 
 global $wpdb;
 
 $referrals = $wpdb->get_results(
 "SELECT *
 FROM `".$wpdb->prefix."ss_analytics_referrals` ORDER BY referrals DESC", ARRAY_A
 );
 
 if(empty($referrals)){
 echo 'No results';
 return;
 }
 
 $keys = array(
 'SITE',
 '# REFERRALS'
 );
 
 array_unshift($referrals, $keys);
 
 echo $this->generateCsv($referrals);
 
 }
 
 /**
 * Gets image views.
 */
 public function image_views(){
 global $wpdb;
 $imageviews = $wpdb->get_results(
 "SELECT *
 FROM `".$wpdb->prefix."ss_analytics_image` ORDER BY views DESC", ARRAY_A
 );
 
 if(empty($imageviews)){
 echo 'No results';
 return;
 }
 
 $keys = array(
 'IMAGE ID',
 'LAST VIEW',
 'TOTAL VIEWS'
 );
 
 array_unshift($imageviews, $keys);
 
 echo $this->generateCsv($imageviews);
 }
 
 /**
 * Gets term views.
 */
 public function term_views(){
 global $wpdb;
 
 $term_view_list = array();
 
 $termviews = $wpdb->get_results(
 "SELECT *
 FROM `".$wpdb->prefix."ss_analytics_term` ORDER BY views DESC", ARRAY_A
 );
 
 if(empty($termviews)){
 echo 'No results';
 return;
 }
 
 foreach($termviews as $termview){
 $obj = get_term_by( 'id', $termview, 'image-tags', ARRAY_A);
 if($obj == NULL){
 $obj = get_term_by( 'id', $termview, 'image-type', ARRAY_A);
 }
 
 array_push(
 $term_view_list,
 array(
 $obj == 'image-type' ? 'keyword' : 'category',
 $obj,
 $obj,
 $termview,
 $termview
 )
 );
 }
 
 $keys = array(
 'TAXONOMY',
 'NAME',
 'SLUG',
 'LAST VIEW',
 'TOTAL VIEWS'
 );
 
 array_unshift($term_view_list, $keys);
 
 echo $this->generateCsv($term_view_list);
 }
 
 }
 
 function ss_get_analytics(){
 $analytics = new ss_analytics(0);
 }
 
 add_action('wp_head', 'ss_get_analytics');
 
 function ss_share_analytics(){
 
 if(isset($_GET)){
 $analytics = new ss_analytics(1);
 }
 
 }
 
 add_action('init', 'ss_share_analytics');
 
 /**
 * Prior function for logging keyword performance. No longer needed.
 *
 * @deprecated
 * @param string $tag
 */
 function symbiostock_keyword_update($tag = ''){
 
 
 if( function_exists('get_terms_meta') && function_exists('update_terms_meta')){
 
 $term = get_term_by( 'slug', $tag, 'image-tags', ARRAY_A );
 
 if(is_array($term) && !empty($term)){
 
 $n = get_terms_meta($term, 'views');
 
 if(!isset($n[0]) || empty($n[0])){
 
 update_terms_meta($term, 'views', 1);
 
 } else {
 $n[0]++;
 update_terms_meta($term, 'views', $n[0]);
 }
 
 //write log file
 
 if(isset($_GET)){
 $r = str_replace('http://', '', $_GET);
 } else {
 $r = 0;
 }
 
 if($_SERVER == $_SERVER){
 $type = 1;
 } else {
 $type = 2;
 }
 
 $info = array(
 $tag, //keyword
 $type, // 1 = local, 2 = remote
 $r, // referrer (humans only)
 $_SERVER, //remote referring IP
 current_time( 'mysql', 1 ), //IMPORTANT gives GMT time
 );
 
 $name = ABSPATH . '/symbiostock_search_log.csv';
 
 //if its the first of the month, delete file
 if(date('d') == 1){
 if(file_exists($name)){
 unlink($name);
 }
 }
 
 if(file_exists($name)){
 $linecount = 0;
 $handle = fopen($name, "r");
 while(!feof($handle)){
 $line = fgets($handle);
 $linecount++;
 }
 if($linecount > 5000){
 unlink($name);
 }
 }
 file_put_contents($name, implode(',', $info).PHP_EOL, FILE_APPEND);
 }
 
 }
 
 }February 2, 2014 at 7:12 am #9185Sure, that’ll do just fine. Thanks. I just replaced the code and it seems to be working now. At least I don’t get any error_log entries. I just hope your end of the analytics features works as you intended as well 🙂 
- 
		AuthorPosts
You must be logged in to reply to this topic.

