Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
save_bvnghean.vn
/
wp-content
/
plugins
/
count-per-day
:
counter.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /* Plugin Name: Count Per Day Plugin URI: http://easyplugin.co.uk/count-per-day/ Description: Counter, shows reads and visitors per page; today, yesterday, last week, last months ... on dashboard, per shortcode or in widget. Version: 3.6.1 License: Postcardware Author: EasyPlugin (Jon Highham) Author URI: http://easyplugin.co.uk/ */ if (!defined('ABSPATH')) exit; $cpd_dir_name = 'count-per-day'; $cpd_version = '3.6.1'; if (strpos($_SERVER['SERVER_NAME'], '.test')) $cpd_path = str_replace('/', DIRECTORY_SEPARATOR, ABSPATH.PLUGINDIR.'/'.$cpd_dir_name.'/'); else $cpd_path = dirname(__FILE__).'/'; include_once($cpd_path.'counter-core.php'); /** * Count per Day */ class CountPerDay extends CountPerDayCore { /** * constructor */ function __construct() { $this->init(); } /** * counts and shows visits * * @param string $before string before the number * @param string $after string after the number * @param boolean $show "echo" (true, standard) or "return" * @param boolean $count count visits (true, standard) or only show vistis * @param string/int $page PostID to count * @return string counter string */ function show( $before='', $after=' reads', $show = true, $count = true, $page = 'x' ) { global $wpdb; // count once only if ( $count && !$this->options['autocount'] ) $this->count(); if ( $page == 'x' ) $page = get_the_ID(); else $page = (int) $page; // get count from collection $c = $this->getCollectedPostReads($page); // add current data $c += $this->mysqlQuery('var', $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE page = %d", $page), 'show '.__LINE__); if ($show) echo $before.$c.$after; else return $c; } /** * counts visits (without show) * @param $x some wp data (ignore it) * @param string/int $page PostID to count */ function count( $x, $page = 'x' ) { global $wpdb, $wp_query, $cpd_path, $cpd_geoip, $cpd_geoip_dir, $userdata; if ($this->options['debug']) $this->queries[] = 'called Function: <b style="color:blue">count</b> page: <code>'.$page.'</code>'; if ($page == 'x') // normal counter $page = $this->getPostID(); else // ajax counter on cached pages $page = (int) $page; $pt = get_post_type($page); // don't count these post type if ( !empty($this->options['posttypes']) && !in_array($pt, explode(',', $this->options['posttypes'])) ) { if ($this->options['debug']) $this->queries[] = "Post Type: $pt - don't count it"; return; } if ($this->options['debug']) $this->queries[] = "Post Type: $pt - count it"; // get userlevel from role if (current_user_can('administrator')) $userlevel = 10; else if (current_user_can('editor')) $userlevel = 7; else if (current_user_can('author')) $userlevel = 2; else if (current_user_can('contributor')) $userlevel = 1; else if (current_user_can('subscriber')) $userlevel = 0; else $userlevel = -1; $date = date_i18n('Y-m-d'); // count visitor? $countUser = 1; if (!$this->options['user'] && is_user_logged_in() ) $countUser = 0; // don't count loged user if ( $this->options['user'] && isset($userdata) && $this->options['user_level'] < $userlevel ) $countUser = 0; // loged user, but higher user level $isBot = $this->isBot(); if ($this->options['debug']) $this->queries[] = 'called Function: <b style="color:blue">count (variables)</b> ' .'isBot: <code>'.(int) $isBot.'</code> ' .'countUser: <code>'.$countUser.'</code> ' .'page: <code>'.$page.'</code> ' .'userlevel: <code>'.$userlevel.'</code>'; // only count if: non bot, Logon is ok, no password required or ok if ( !$isBot && $countUser && isset($page) && !post_password_required($page) ) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { // get real IP, not local IP $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $real_ip = $ips[0]; } else $real_ip = $_SERVER['REMOTE_ADDR']; $userip = $this->anonymize_ip($real_ip); $client = ($this->options['referers']) ? wp_strip_all_tags($_SERVER['HTTP_USER_AGENT']) : ''; $client = substr( $client, 0, $this->options['fieldlen'] ); $referer = ($this->options['referers'] && isset($_SERVER['HTTP_REFERER'])) ? wp_strip_all_tags($_SERVER['HTTP_REFERER']) : ''; $referer = esc_url($referer); if (filter_var($referer, FILTER_VALIDATE_URL)) { if ($this->options['referers_cut']) $referer = substr( $referer, 0, strpos($referer,'?') ); $referer = substr( $referer, 0, $this->options['fieldlen'] ); } else $referer = ''; // new visitor on page? $count = $this->mysqlQuery('var', $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE ip=$this->aton(%s) AND date=%s AND page=%d", $userip, $date, $page), 'count check '.__LINE__); if ( !$count ) { // IP to IPv4 if (filter_var($userip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // IPv4 $userip2 = $userip; } else if (filter_var($userip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { // IPv6 // store dummy ipv4 until we can handle ipv6 $packed = $this->inetPton($userip); if (strlen($packed) === 4) $unpacked = array_pad(unpack( "C4", $packed), -16, 0); else $unpacked = array_merge(unpack( "C16", $packed)); $unpacked = array_slice($unpacked, 12); $userip2 = implode('.', $unpacked); } else { // no valid IP address -> dummy $userip = '127.0.0.1'; $userip2 = $userip; } // save count if ($cpd_geoip) { // with GeoIP addon save country $gi = geoip_open($cpd_geoip_dir.'GeoIP.dat', GEOIP_STANDARD); if (filter_var($userip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) // IPv4 -> IPv6 $userip = '::'.$userip; $country = strtolower(geoip_country_code_by_addr_v6($gi, $userip)); if (empty($country)) $country = '-'; // insert if not an excluded country if ( !in_array($country, explode(',', $this->options['exclude_countries'])) ) $this->mysqlQuery('', $wpdb->prepare("INSERT INTO $wpdb->cpd_counter (page, ip, client, date, country, referer) VALUES (%d, $this->aton(%s), %s, %s, %s, %s)", $page, $userip2, $client, $date, $country, $referer), 'count insert '.__LINE__); } else // without country $this->mysqlQuery('', $wpdb->prepare("INSERT INTO $wpdb->cpd_counter (page, ip, client, date, referer) VALUES (%d, $this->aton(%s), %s, %s, %s)", $page, $userip2, $client, $date, $referer), 'count insert '.__LINE__.' - '.$userip.' - '.$userip2.' -'); } // online counter $oc = (array) get_option('count_per_day_online'); $oc[$userip] = array( time(), $page ); update_option('count_per_day_online', $oc); } // save searchstring if exists $s = $this->getSearchString(); if ($s) { $search = get_option('count_per_day_search'); // reset if array is corrupt if (!is_array($search)) $search = array($date=>''); if (isset($search[$date]) && is_array($search[$date])) { if (!in_array($s, $search[$date])) $search[$date][] = $s; } else $search[$date] = array($s); update_option('count_per_day_search', $search); unset($search); } } /** * deletes old online user */ function deleteOnlineCounter() { $oc = (array) get_option('count_per_day_online', array()); foreach ($oc as $k => $v) if ($v[0] < time() - $this->options['onlinetime']) unset($oc[$k]); update_option('count_per_day_online', $oc); } /** * creates dashboard summary metabox content */ function dashboardReadsAtAll() { $thisMonth = date_i18n('F'); ?> <ul> <li><?php _e('Total reads', 'cpd') ?>: <b><span><?php $this->getReadsAll() ?></span></b></li> <li><?php _e('Reads today', 'cpd') ?>: <b><?php $this->getReadsToday() ?></b></li> <li><?php _e('Reads yesterday', 'cpd') ?>: <b><?php $this->getReadsYesterday() ?></b></li> <li><?php _e('Reads last week', 'cpd') ?>: <b><?php $this->getReadsLastWeek() ?></b></li> <li><?php _e('Reads', 'cpd') ?> <?php echo $thisMonth ?>:<b><?php $this->getReadsThisMonth() ?></b></li> <li><?php _e('Total visitors', 'cpd') ?>: <b><span><?php $this->getUserAll() ?></span></b></li> <li><?php _e('Visitors currently online', 'cpd') ?>:<b><span><?php $this->getUserOnline() ?></span></b></li> <li><?php _e('Visitors today', 'cpd') ?>: <b><?php $this->getUserToday() ?></b></li> <li><?php _e('Visitors yesterday', 'cpd') ?>: <b><?php $this->getUserYesterday() ?></b></li> <li><?php _e('Visitors last week', 'cpd') ?>: <b><?php $this->getUserLastWeek() ?></b></li> <li><?php _e('Visitors', 'cpd') ?> <?php echo $thisMonth ?>: <b><?php $this->getUserThisMonth() ?></b></li> <li>Ø <?php _e('Visitors per day', 'cpd') ?>: <b><?php $this->getUserPerDay($this->options['dashboard_last_days']) ?></b></li> <li><?php _e('Since', 'cpd') ?>: <b><?php $this->getFirstCount() ?></b></li> <li><?php _e('Most visited day', 'cpd') ?>: <b class="cpd-r"><?php $this->getDayWithMostReads(1) ?></b></li> <li><?php _e('Most visited day', 'cpd') ?>: <b class="cpd-r"><?php $this->getDayWithMostUsers(1) ?></b></li> </ul> <?php } /** * creates the big chart with reads and visotors * @param int $limit last x days */ function getFlotChart( $limit = 0 ) { wp_enqueue_script('cpd_flot', $this->dir.'/js/jquery.flot.min.js', 'jQuery'); global $wpdb; if ( $limit == 0 ) $limit = (!empty($this->options['chart_days'])) ? $this->options['chart_days'] : 30; $limit -= 1; // last day $end_sql = (isset($_GET['cpd_chart_start'])) ? $_GET['cpd_chart_start'] : date_i18n('Y-m-d'); $end_time = strtotime($end_sql); $end_str = mysql2date(get_option('date_format'), $end_sql); // first day $start_time = $end_time - $limit * 86400; $start_sql = date('Y-m-d', $start_time); $start_str = mysql2date(get_option('date_format'), $start_sql); // buttons $button_back = date('Y-m-d', $start_time - 86400); $button_forward = date('Y-m-d', $end_time + 86400 * ($limit + 1)); // create data array $data = array(); for ( $day = $start_time; $day < $end_time; $day = $day + 86400 ) $data[date('Y,n,j', $day)] = array(0, 0); // reads $sql = $wpdb->prepare(" SELECT COUNT(*) count, c.date FROM $wpdb->cpd_counter c WHERE c.date BETWEEN %s AND %s GROUP BY c.date", $start_sql, $end_sql ); $res = $this->mysqlQuery('rows', $sql, 'ChartReads '.__LINE__); if ($res) foreach ($res as $row) $data[date('Y,n,j', strtotime($row->date))][0] = $row->count; // visitors $sql = $wpdb->prepare(" SELECT COUNT(*) count, t.date FROM ( SELECT COUNT(*) count, date FROM $wpdb->cpd_counter GROUP BY date, ip ) AS t WHERE t.date BETWEEN %s AND %s GROUP BY t.date", $start_sql, $end_sql ); $res = $this->mysqlQuery('rows', $sql, 'ChartVisitors '.__LINE__); if ($res) foreach ($res as $row) $data[date('Y,n,j', strtotime($row->date))][1] = $row->count; // fill data array $reads = array(); $visitors = array(); foreach ( $data as $day => $values ) { $reads[] = '[gd('.$day.'),'.$values[0].']'; $visitors[] = '[gd('.$day.'),'.$values[1].']'; } $reads_line = '['.implode(',', $reads).']'; $visitors_line = '['.implode(',', $visitors).']'; ?> <div id="cpd-flot-place"> <div id="cpd-flot-choice"> <div style="float:left"> <a href="index.php?page=cpd_metaboxes&cpd_chart_start=<?php echo $button_back ?>" class="button"><</a> <?php echo $start_str ?> </div> <div style="float:right"> <?php echo $end_str ?> <a href="index.php?page=cpd_metaboxes&cpd_chart_start=<?php echo $button_forward ?>" class="button">></a> </div> </div> <div id="cpd-flot" style="height:<?php echo (!empty($this->options['chart_height'])) ? $this->options['chart_height'] : 200; ?>px"></div> </div> <script type="text/javascript"> //<![CDATA[ jQuery(function() { var placeholder = jQuery("#cpd-flot"); var choiceContainer = jQuery("#cpd-flot-choice"); var colors = ['blue', 'red']; var datasets = { 'reads': { data: <?php echo $reads_line ?>, label: '<?php _e('Reads per day', 'cpd') ?>' }, 'visitors' : { data: <?php echo $visitors_line ?>, label: '<?php _e('Visitors per day', 'cpd') ?>' } }; // Checkboxen var i = 0; jQuery.each(datasets, function(key, val) { val.color = i; ++i; choiceContainer.append( '<input type="checkbox" name="' + key + '" checked="checked" id="id' + key + '" \/> ' + '<label style="padding-left:3px;margin-right:10px;border-left:14px solid ' + colors[val.color] + '" for="id' + key + '">' + val.label + '<\/label> '); }); choiceContainer.find("input").click(plotAccordingToChoices); function showTooltip(x, y, contents) { jQuery('<div id="cpd-tooltip">' + contents + '<\/div>').css({ top:y-70, left:x-80 }).appendTo("body").fadeIn(200); } var previousPoint = null; jQuery(placeholder).bind("plothover", function (event, pos, item) { if (item) { if (previousPoint != item.datapoint) { previousPoint = item.datapoint; jQuery("#cpd-tooltip").remove(); var dx = new Date(item.datapoint[0]); var datum = dx.getDate() + '.' + (dx.getMonth() + 1) + '.' + dx.getFullYear(); showTooltip(item.pageX, item.pageY, datum + '<br\/><b>' + item.datapoint[1] + '<\/b> ' + item.series.label); } } else { jQuery("#cpd-tooltip").remove(); previousPoint = null; } }); function weekendAreas(axes) { var markings = []; var d = new Date(axes.xaxis.min); d.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 1) % 7)); d.setUTCSeconds(0); d.setUTCMinutes(0); d.setUTCHours(0); var i = d.getTime(); do { markings.push({ xaxis: { from: i, to: i + 2 * 24 * 60 * 60 * 1000 } }); i += 7 * 24 * 60 * 60 * 1000; } while (i < axes.xaxis.max); return markings; } function plotAccordingToChoices() { var data = []; choiceContainer.find("input:checked").each(function () { var key = jQuery(this).attr("name"); if (key && datasets[key]) data.push(datasets[key]); }); if (data.length > 0) jQuery.plot(jQuery(placeholder), data , { xaxis: { mode: 'time', timeformat: '%d.%m.%y' }, legend: { show: false }, colors: colors, lines: { fill: true }, grid: { borderWidth: 1, borderColor: '#ccc', hoverable: true, markings: weekendAreas } }); } function gd(year, month, day) { return new Date(year, month - 1, day).getTime(); } plotAccordingToChoices(); }); //]]> </script> <?php } /** * shows current visitors */ function getUserOnline( $frontend = false, $country = false, $return = false ) { global $wpdb, $cpd_geoip, $cpd_path, $cpd_geoip_dir; $c = ''; $oc = get_option('count_per_day_online'); if ( $oc && $cpd_geoip && $country ) { // map link if ( !$frontend && file_exists($cpd_path.'map/map.php') ) $c .= '<div style="margin: 5px 0 10px 0;"><a href="?page=cpd_map&map=online' .'&KeepThis=true&TB_iframe=true" title="Count per Day - '.__('Map', 'cpd').'" class="thickbox button">'.__('Map', 'cpd').'</a></div>'; // countries list $geoip = new GeoIP(); $gi = geoip_open($cpd_geoip_dir.'GeoIP.dat', GEOIP_STANDARD); $vo = array(); foreach ( $oc as $ip=>$x ) { if ( strpos($ip,'.') !== false && strpos($ip,':') === false) // IPv4 $country = strtolower(geoip_country_code_by_addr_v6($gi, '::'.$ip)); else // IPv6 $country = strtolower(geoip_country_code_by_addr_v6($gi, $ip)); $id = $geoip->GEOIP_COUNTRY_CODE_TO_NUMBER[strtoupper($country)]; if ( empty($id) ) { $name = '???'; $country = 'unknown'; } else $name = $geoip->GEOIP_COUNTRY_NAMES[$id]; $count = (isset($vo[$country])) ? $vo[$country][1] + 1 : 1; $vo[$country] = array($name, $count); } $c .= '<ul class="cpd_front_list">'; foreach ( $vo as $k => $v ) $c .= '<li><div class="cpd-flag cpd-flag-'.$k.'"></div> '.$v[0].' <b>'.$v[1].'</b></li>'."\n"; $c .= "</ul>\n"; } else if ( $oc ) $c = count($oc); // number only else $c = 0; if ($return) return $c; else echo $c; } /** * shows all visitors */ function getUserAll( $return = false ) { global $wpdb; $res = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter GROUP BY date, ip", 'getUserAll '.__LINE__); $c = $res + (int) $this->options['startcount'] + $this->getCollectedUsers(); if ($return) return $c; else echo $c; } /** * shows all reads */ function getReadsAll( $return = false ) { global $wpdb; $res = $this->mysqlQuery('var', "SELECT COUNT(*) FROM $wpdb->cpd_counter", 'getReadsAll '.__LINE__); $c = (int) $res + (int) $this->options['startreads'] + $this->getCollectedReads(); if ($return) return $c; else echo $c; } /** * shows today visitors */ function getUserToday( $return = false ) { global $wpdb; $date = date_i18n('Y-m-d'); $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE date = '$date' GROUP BY ip", 'getUserToday '.__LINE__); if ($return) return $c; else echo $c; } /** * shows today reads */ function getReadsToday( $return = false ) { global $wpdb; $date = date_i18n('Y-m-d'); $c = $this->mysqlQuery('var', "SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE date = '$date'", 'getReadsToday '.__LINE__); if ($return) return $c; else echo $c; } /** * shows yesterday visitors */ function getUserYesterday( $return = false ) { global $wpdb; $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE date = DATE_SUB('".date_i18n('Y-m-d')."', INTERVAL 1 DAY) GROUP BY ip", 'getUserYesterday '.__LINE__); if ($return) return $c; else echo $c; } /** * shows yesterday reads */ function getReadsYesterday( $return = false ) { global $wpdb; $c = $this->mysqlQuery('var', "SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE date = DATE_SUB('".date_i18n('Y-m-d')."', INTERVAL 1 DAY)", 'getReadsYesterday '.__LINE__); if ($return) return $c; else echo $c; } /** * shows last week visitors (last 7 days) */ function getUserLastWeek( $return = false ) { global $wpdb; $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE date >= DATE_SUB('".date_i18n('Y-m-d')."', INTERVAL 7 DAY) GROUP BY date, ip;", 'getUserLastWeek '.__LINE__); if ($return) return $c; else echo $c; } /** * shows last week reads (last 7 days) */ function getReadsLastWeek( $return = false ) { global $wpdb; $c = $this->mysqlQuery('var', "SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE date >= DATE_SUB('".date_i18n('Y-m-d')."', INTERVAL 7 DAY)", 'getReadsLastWeek '.__LINE__); if ($return) return $c; else echo $c; } /** * shows this month visitors */ function getUserThisMonth( $return = false ) { global $wpdb; $first = date_i18n('Y-m-', current_time('timestamp')).'01'; $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE date >= '$first' GROUP BY date, ip;", 'getUserThisMonth '.__LINE__); if ($return) return $c; else echo $c; } /** * shows this month reads */ function getReadsThisMonth( $return = false ) { global $wpdb; $first = date_i18n('Y-m-', current_time('timestamp')).'01'; $c = $this->mysqlQuery('var', "SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE date >= '$first';", 'getReadsThisMonth '.__LINE__); if ($return) return $c; else echo $c; } /** * shows visitors per month */ function getUserPerMonth( $frontend = false, $return = false ) { global $wpdb; $m = $this->mysqlQuery('rows', "SELECT LEFT(date,7) month FROM $wpdb->cpd_counter GROUP BY year(date), month(date) ORDER BY date DESC", 'getUserPerMonths '.__LINE__); if (!$m) return; $r = '<ul class="cpd_front_list">'; $d = array(); $i = 1; foreach ( $m as $row ) { $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE LEFT(date,7) = '$row->month' GROUP BY date, ip", 'getUserPerMonth '.__LINE__); $r .= '<li>'.$row->month.' <b>'.$c.'</b></li>'."\n"; $d[] = '[-'.$i++.','.$c.']'; } // add collection $coll = get_option('count_per_day_collected'); if ($coll) { $coll = array_reverse($coll, true); foreach ($coll as $m => $c) { $m2 = str_split($m, 4); $r .= '<li>'.$m2[0].'-'.$m2[1].' <b>'.$c['users'].'</b></li>'."\n"; $d[] = '[-'.$i++.','.$c['users'].']'; } } $r .= '</ul>'; if (!$frontend) $r = $this->includeChartJS( 'cpd-flot-userpermonth', $d, $r ); if ($return) return $r; else echo $r; } /** * shows reads per month */ function getReadsPerMonth( $frontend = false, $return = false ) { global $wpdb; $res = $this->mysqlQuery('rows', "SELECT COUNT(*) count, LEFT(date,7) month FROM $wpdb->cpd_counter GROUP BY year(date), month(date) ORDER BY date DESC", 'getReadsPerMonths '.__LINE__); if (!$res) return; $r = '<ul class="cpd_front_list">'; $d = array(); $i = 1; foreach ( $res as $row ) { $r .= '<li>'.$row->month.' <b>'.$row->count.'</b></li>'."\n"; $d[] = '[-'.$i++.','.$row->count.']'; } // add collection $coll = get_option('count_per_day_collected'); if ($coll) { $coll = array_reverse($coll, true); foreach ($coll as $m => $c) { $m2 = str_split($m, 4); $r .= '<li>'.$m2[0].'-'.$m2[1].' <b>'.$c['reads'].'</b></li>'."\n"; $d[] = '[-'.$i++.','.$c['reads'].']'; } } $r .= '</ul>'; if (!$frontend) $r = $this->includeChartJS( 'cpd-flot-readspermonth', $d, $r ); if ($return) return $r; else echo $r; } /** * shows visitors per post * @param integer $limit number of posts, -1 = all, 0 = get option from db, x = number * @param boolean $frontend limit function on frontend */ function getUserPerPost( $limit = 0, $frontend = false, $return = false ) { global $wpdb; if ( $limit == 0 ) $limit = $this->options['dashboard_posts']; $sql = " SELECT COUNT(*) count, page FROM $wpdb->cpd_counter WHERE page GROUP BY page"; $r = $this->getUserPer_SQL( $sql, 'getUserPerPost '.__LINE__, $frontend, $limit ); if ($return) return $r; else echo $r; } /** * shows counter start, first day or given value */ function getFirstCount( $return = false ) { global $wp_locale; if (!empty($this->options['startdate'])) $c = $this->options['startdate']; else $c = $this->updateFirstCount(); $c = mysql2date(get_option('date_format'), $c ); if ($return) return $c; else echo $c; } /** * shows averaged visitors per day * @param integer $days days to calc */ function getUserPerDay( $days = 0, $return = false ) { global $wpdb; $datemax = date_i18n('Y-m-d'); if ( $days > 0 ) // last $days days without today $datemin = date_i18n('Y-m-d', current_time('timestamp') - ($days + 1) * 86400); else { $res = $this->mysqlQuery('rows', 'SELECT MIN(date) min, MAX(date) max FROM '.$wpdb->cpd_counter, 'getUserPerDay '.__LINE__); foreach ($res as $row) $days = ((strtotime($row->max) - strtotime($row->min)) / 86400 + 1); $datemin = 0; } $c = $this->mysqlQuery('count', "SELECT 1 FROM $wpdb->cpd_counter WHERE date > '$datemin' AND date < '$datemax' GROUP BY ip, date", 'getUserPerDay '.__LINE__); $count = $c / $days; $s = '<abbr title="last '.$days.' days without today">'; if ( $count < 5 ) $s .= number_format($count, 2); else $s .= number_format($count, 0); $s .= '</abbr>'; if ($return) return $s; else echo $s; } /** * shows most visited pages in last days * @param integer $days days to calc (last days) * @param integer $limit count of posts (last posts) * @param boolean $postsonly don't show categories and taxonomies */ function getMostVisitedPosts( $days = 0, $limit = 0, $frontend = false, $postsonly = false, $return = false, $posttypes = '' ) { global $wpdb; if ( $days == 0 ) $days = $this->options['dashboard_last_days']; if ( $limit == 0 ) $limit = $this->options['dashboard_last_posts']; $date = date_i18n('Y-m-d', current_time('timestamp') - 86400 * $days); if ($posttypes) { $types = str_replace(' ', '', $posttypes); $types = str_replace(',', "','", $types); $postsonly = 1; } else $types = false; if ($postsonly) $sql = $wpdb->prepare(" SELECT COUNT(c.id) count, c.page post_id, p.post_title post FROM $wpdb->cpd_counter c LEFT JOIN $wpdb->posts p ON p.id = c.page WHERE c.date >= %s AND c.page > 0 ".( ($types) ? "AND p.post_type IN ('$types')" : '' )." GROUP BY c.page ORDER BY count DESC LIMIT %d", $date, $limit); else $sql = $wpdb->prepare(" SELECT COUNT(c.id) count, c.page post_id, p.post_title post, t.name tag_cat_name, t.slug tag_cat_slug, x.taxonomy tax FROM $wpdb->cpd_counter c LEFT JOIN $wpdb->posts p ON p.id = c.page LEFT JOIN $wpdb->terms t ON t.term_id = 0 - c.page LEFT JOIN $wpdb->term_taxonomy x ON x.term_id = t.term_id WHERE c.date >= %s GROUP BY c.page ORDER BY count DESC LIMIT %d", $date, $limit); $r = '<small>'.sprintf(__('The %s most visited posts in last %s days:', 'cpd'), $limit, $days).'</small>'; $r .= $this->getUserPer_SQL( $sql, 'getMostVisitedPosts', $frontend ); if ($return) return $r; else echo $r; } /** * gets Post_IDs of most visited pages in last days with category filter * @param integer $days days to calc (last days) * @param integer $limit count of posts (last posts) * @param array/integer $cats IDs of category to filter * @param boolean $return_array returns an array with Post-ID and title, otherwise comma separated list of Post-IDs * @return string/array list of Post-IDs */ function getMostVisitedPostIDs( $days = 365, $limit = 10, $cats = false, $return_array = false ) { global $wpdb; $date = date_i18n('Y-m-d', current_time('timestamp') - 86400 * $days); if ( is_array($cats) ) { if ( is_object($cats[0]) ) { $catIDs = array(); foreach( $cats as $cat ) $catIDs[] = $cat->term_id; } else $catIDs = (array) $cats; $cats = implode(',', $catIDs); } $cat_filter = ($cats) ? 'AND x.term_id IN ('.$cats.')' : ''; $q1 = ($return_array) ? ', p.post_title' : ''; $q2 = ($return_array) ? ' LEFT JOIN '.$wpdb->posts.' p ON p.ID = c.page ' : ''; $sql = " SELECT COUNT(c.id) count, c.page post_id $q1 FROM $wpdb->cpd_counter c $q2 LEFT JOIN $wpdb->term_relationships r ON r.object_id = c.page LEFT JOIN $wpdb->term_taxonomy x ON x.term_taxonomy_id = r.term_taxonomy_id WHERE c.date >= '$date' $cat_filter GROUP BY c.page ORDER BY count DESC LIMIT $limit"; $res = $this->mysqlQuery('rows', $sql, 'getMostVisitedPostIDs '.__LINE__); $ids = array(); if ($res) foreach ( $res as $row ) { if ($return_array) $ids[] = array('id' => $row->post_id, 'title' => $row->post_title, 'count' => $row->count); else $ids[] = $row->post_id; } if ($return_array) return $ids; else return implode(',', $ids); } /** * shows visited pages at given day * @param integer $date day in mySql date format yyyy-mm-dd * @param integer $limit count of posts (last posts) * @param boolean $show_form show form for date selection * @param boolean $show_notes show button to add notes in form */ function getVisitedPostsOnDay( $date = 0, $limit = 0, $show_form = true, $show_notes = true, $frontend = false, $return = false ) { global $wpdb, $cpd_path, $userdata; if (!empty($_POST['daytoshow'])) $date = $_POST['daytoshow']; else if (!empty($_GET['daytoshow'])) $date = $_GET['daytoshow']; else if ( $date == 0 ) $date = date_i18n('Y-m-d'); $date = wp_strip_all_tags($date); if ( $limit == 0 ) $limit = $this->options['dashboard_last_posts']; // get note $notes = get_option('count_per_day_notes'); if ( isset($notes) && is_array($notes) ) foreach ( $notes as $n ) if ( $n[0] == $date ) $note[] = $n[1]; $sql = $wpdb->prepare(" SELECT COUNT(c.id) count, c.page post_id, p.post_title post, t.name tag_cat_name, t.slug tag_cat_slug, x.taxonomy tax FROM $wpdb->cpd_counter c LEFT JOIN $wpdb->posts p ON p.id = c.page LEFT JOIN $wpdb->terms t ON t.term_id = 0 - c.page LEFT JOIN $wpdb->term_taxonomy x ON x.term_id = t.term_id WHERE c.date = %s GROUP BY c.page ORDER BY count DESC LIMIT %d", $date, $limit ); if ($show_form) { echo '<form action="" method="post"> <input name="daytoshow" value="'.$date.'" size="11" /> <input type="submit" name="showday" value="'.__('Show').'" class="button" />'; if ( $show_notes ) echo ' <a href="?page=cpd_notes&KeepThis=true&TB_iframe=true" title="Count per Day - '.__('Notes', 'cpd').'" class="button thickbox">'.__('Notes', 'cpd').'</a> '; echo '</form>'; } if (isset($note)) echo '<p style="background:#eee; padding:2px;">'.implode(', ', $note).'</p>'; $r = $this->getUserPer_SQL( $sql, 'getVisitedPostsOnDay', $frontend, $limit ); if ($return) return $r; else echo $r; } /** * shows most visited pages in last days * @param integer $days days to calc (last days) * @param integer $limit count of visitors (last posts) */ function getLastVisitors( $days = 0, $limit = 0 ) { global $wpdb; if ( $days == 0 ) $days = $this->options['dashboard_last_days']; if ( $limit == 0 ) $limit = $this->options['dashboard_last_posts']; $date = date_i18n('Y-m-d', current_time('timestamp') - 86400 * $days); $sql = $wpdb->prepare(" SELECT COUNT(id) posts, ip AS longip, $this->ntoa(ip) AS ip, date, country, client FROM $wpdb->cpd_counter c WHERE c.date >= %s GROUP BY ip, date, client ORDER BY posts DESC, date DESC LIMIT %d", $date, $limit); return $this->mysqlQuery('rows', $sql, 'getLastVisitors '.__LINE__); } /** * shows little browser statistics */ function getClients( $return = false ) { global $wpdb; $c_string = $this->options['clients']; $clients = explode(',', $c_string); $res = $this->mysqlQuery('var', "SELECT COUNT(*) FROM ".$wpdb->cpd_counter, 'getClients_all '.__LINE__); if (!$res) return; $all = max(1, (int) $res); $rest = 100; foreach ($clients as $c) { $c = trim($c); $sql = "SELECT COUNT(*) FROM $wpdb->cpd_counter WHERE client LIKE '%%".$c."%%'"; if ( strtolower($c) == 'safari' ) // don't count chrome and egde too while counting safari $sql .= " AND client NOT LIKE '%%chrome%%' AND client NOT LIKE '%%edge%%'"; if ( strtolower($c) == 'chrome' ) // don't count edge too while counting chrome $sql .= " AND client NOT LIKE '%%edge%%'"; $count = $this->mysqlQuery('var', $sql, 'getClients_'.$c.'_ '.__LINE__); $percent = number_format(100 * $count / $all, 0); $rest -= $percent; $cl_percent[] = $percent; $cl_name[] = $c; } if ( $rest > 0 ) { $cl_percent[] = $rest; $cl_name[] = __('Other', 'cpd'); } array_multisort($cl_percent, SORT_NUMERIC, SORT_DESC, $cl_name); $r = '<ul id="cpd_clients" class="cpd_front_list">'; for ($i = 0; $i < count($cl_percent); $i++) { $r .= '<li class="cpd-client-logo cpd-client-'.strtolower($cl_name[$i]).'">'.$cl_name[$i].' <b>'.$cl_percent[$i].' %</b></li>'; } $r .= '</ul>'; $res = $this->mysqlQuery('var', "SELECT MIN(date) FROM ".$wpdb->cpd_counter, 'getClients_date '.__LINE__); $r .= '<small>'.__('Counter starts on', 'cpd').': '.mysql2date(get_option('date_format'), $res ).'</small>'; if ($return) return $r; else echo $r; } /** * shows top referrers */ function getReferers( $limit = 0, $return = false, $days = 0 ) { global $wpdb; if ( $limit == 0 ) $limit = $this->options['dashboard_referers']; if ( $days == 0 ) $days = $this->options['referers_last_days']; // local url filter $dayfiltre = "AND date > DATE_SUB('".date_i18n('Y-m-d')."', INTERVAL $days DAY)"; $localref = ($this->options['localref']) ? '' : " AND referer NOT LIKE '".get_bloginfo('url')."%%' "; $res = $this->mysqlQuery('rows', "SELECT COUNT(*) count, referer FROM $wpdb->cpd_counter WHERE referer > '' $dayfiltre $localref GROUP BY referer ORDER BY count DESC LIMIT $limit", 'getReferers '.__LINE__); $r = '<small>'.sprintf(__('The %s referrers in last %s days:', 'cpd'), $limit, $days).'</small>'; $r .= '<ul id="cpd_referrers" class="cpd_front_list">'; if ($res) foreach ( $res as $row ) { $ref = str_replace('&', '&', esc_url($row->referer)); if (empty($ref)) $r .= '<li>- bad referrer - <b>'.$row->count.'</b></li>'; else $r .= '<li><a href="'.$ref.'">'.str_replace(array('http://', 'https://'), '', $ref).'</a> <b>'.$row->count.'</b></li>'; } $r .= '</ul>'; if ($return) return $r; else echo $r; } /** * shows day with most reads */ function getDayWithMostReads( $formated = false, $return = false ) { global $wpdb; $sql = " SELECT date, COUNT(id) count FROM $wpdb->cpd_counter GROUP BY date ORDER BY count DESC LIMIT 1"; $res = $this->mysqlQuery('rows', $sql, 'getDayWithMostReads '.__LINE__ ); if (!$res) return; $r = $this->updateCollectedDayMostReads( $res[0] ); if ($formated) $r = mysql2date(get_option('date_format'), $r[0]).'<br/>'.$r[1].' '.__('Reads', 'cpd'); if ($return) return $r; else echo $r; } /** * shows day with most visitors */ function getDayWithMostUsers( $formated = false, $return = false ) { global $wpdb; $sql = " SELECT t.date, count(*) count FROM ( SELECT count(*) count, date, page FROM $wpdb->cpd_counter GROUP BY date, ip ) AS t GROUP BY t.date ORDER BY count DESC LIMIT 1"; $res = $this->mysqlQuery('rows', $sql, 'getDayWithMostVisitors '.__LINE__ ); if (!$res) return; $r = $this->updateCollectedDayMostUsers( $res[0] ); if ($formated) $r = mysql2date(get_option('date_format'), $r[0]).'<br/>'.$r[1].' '.__('Visitors', 'cpd'); if ($return) return $r; else echo $r; } /** * creates counter lists * @param string $sql SQL Statement * @param string $name function name for debug * @param boolean $frontend limit function on frontend */ function getUserPer_SQL( $sql, $name = '', $frontend = false, $limit = 0 ) { global $wpdb, $userdata; $m = $this->mysqlQuery('rows', $sql, $name.__LINE__); if (!$m) return; if ( strpos($name, 'getUserPerPost') !== false ) { // get collection $p = get_option('count_per_day_posts'); if (empty($p)) $p = array(); // add normal data foreach ( $m as $r ) { $pid = 'p'.$r->page; if ( isset($p[$pid]) ) $p[$pid] += (int) $r->count; else if ( $r->count ) $p[$pid] = (int) $r->count; } // max $limit $keys = array_keys($p); array_multisort($p, SORT_NUMERIC, SORT_DESC, $keys); $p = array_slice($p, 0, $limit); // new sql query $keys = array_keys($p); $list = ''; foreach ($keys as $k) $list .= str_replace('p', '', $k).','; $list = substr($list, 0, -1); $if = ''; foreach ($p as $id=>$count) $if .= " WHEN ".str_replace('p', '', $id)." THEN $count"; $sql = " SELECT temp_outer.* FROM ( SELECT CASE p.id $if ELSE 0 END count, p.id post_id, p.post_title post, '' tag_cat_name, '' tag_cat_slug, '' tax FROM $wpdb->posts p WHERE p.id IN ($list) GROUP BY p.id UNION SELECT CASE -t.term_id $if ELSE 0 END count, t.term_id post_id, '' post, t.name tag_cat_name, t.slug tag_cat_slug, x.taxonomy tax FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy x ON x.term_id = t.term_id WHERE -t.term_id IN ($list) GROUP BY t.term_id ) temp_outer ORDER BY count DESC"; $m = $this->mysqlQuery('rows', $sql, $name.' '.__LINE__); if (!$m) return; } $r = '<ul class="cpd_front_list">'; foreach ( $m as $row ) { $r .= '<li>'; // link only for editors in backend if ( current_user_can('edit_others_posts') && !$frontend ) { if ( $row->post_id > 0 ) $r .= '<a href="post.php?action=edit&post='.$row->post_id.'"><img src="'.$this->img('cpd_pen.png').'" alt="[e]" title="'.__('Edit Post').'" style="width:9px;height:12px;" /></a> ' .'<a href="?page=cpd_userperspan&cpage='.$row->post_id.'&KeepThis=true&TB_iframe=true" class="thickbox" title="Count per Day"><img src="'.$this->img('cpd_calendar.png').'" alt="[v]" style="width:12px;height:12px;" /></a> '; else $r .= '<img src="'.$this->img('cpd_trans.png').'" alt="" style="width:25px;height:12px;" />'; } $r .= '<a href="'.get_bloginfo('url'); if ( !empty($row->tax) && $row->tax == 'category' ) // category $r .= '?cat='.abs($row->post_id).'">- '.__($row->tag_cat_name).' ('.__('Category').') -'; else if ( !empty($row->tax) ) // tag $r .= '?tag='.$row->tag_cat_slug.'">- '.__($row->tag_cat_name).' ('.__('Tag').') -'; else if ( $row->post_id == 0 ) // homepage $r .= '">- '.__('Front page').' -'; else // post/page $r .= '?p='.$row->post_id.'">'.($row->post ? __($row->post) : '---'); $r .= '</a>'; $r .= ' <b>'.$row->count.'</b></li>'."\n"; } $r .= '</ul>'; return $r; } /** * shows searchstrings */ function getSearches( $limit = 0, $days = 0, $return = false ) { $search = (array) get_option('count_per_day_search'); if (empty($search)) return; if ( $limit == 0 ) $limit = $this->options['dashboard_referers']; if ( $days == 0 ) $days = $this->options['referers_last_days']; // most searched $c = array(); foreach ( $search as $day => $strings ) { if (is_array($strings)) foreach ( $strings as $s ) { $s = strtolower($s); if (isset($c[$s])) $c[$s]++; else $c[$s] = 1; } } arsort($c); $c = array_slice($c, 0, $limit); $r = '<small>'.sprintf(__('The %s most searched strings:', 'cpd'), $limit).'</small>'; $r .= '<ul class="cpd_front_list">'; foreach ( $c as $string => $count ) $r .= '<li>'.$string.' <b>'.$count.'</b></li>'."\n"; $r .= '</ul>'; // last days krsort($search); $search = array_slice($search, 0, $days); $r .= '<small>'.sprintf(__('The search strings of the last %s days:', 'cpd'), $days).'</small>'; $r .= '<ul class="cpd_front_list">'; foreach ( $search as $day => $s ) if (is_array($s)) $r .= '<li><div style="font-weight:bold">'.mysql2date(get_option('date_format'), $day).'</div> '.implode(', ', $s).'</li>'."\n"; $r .= '</ul>'; if ($return) return $r; else echo $r; } /** * creates the little widget on dashboard */ function dashboardWidget() { echo '<a href="?page=cpd_metaboxes"><b>'; $this->getUserAll(); echo '</b></a> '.__('Total visitors', 'cpd').'<b> - '; $this->getUserPerDay($this->options['dashboard_last_days']); echo '</b> '.__('Visitors per day', 'cpd'); } /** * gets country flags and page views * @param integer $limit count of countries * @param boolean $frontend limit function on frontend * @param boolean $visitors show visitors insteed of reads */ function getCountries( $limit = 0, $frontend = false, $visitors = false, $return = false ) { global $wpdb, $cpd_path, $c, $cpd_geoip; $c = ''; // with GeoIP addon only if ( $cpd_geoip ) { $geoip = new GeoIP(); if ( $limit == 0 ) $limit = max( 0, $this->options['countries'] ); // map link if (!$frontend && file_exists($cpd_path.'map/map.php') ) { $c .= '<div style="margin: 5px 0 10px 0;"><a href="?page=cpd_map&map='; if ( $visitors ) $c .= 'visitors'; else $c .= 'reads'; $c .= '&KeepThis=true&TB_iframe=true" title="Count per Day - '.__('Map', 'cpd').'" class="thickbox button">'.__('Map', 'cpd').'</a></div>'; } $temp = $this->addCollectionToCountries( $visitors, $limit ); // make list $c .= '<ul class="cpd_front_list">'; foreach ($temp as $country => $value) { // get country names if ($country != '-') $id = $geoip->GEOIP_COUNTRY_CODE_TO_NUMBER[strtoupper($country)]; else $id = 0; if ( empty($id) ) { $name = '???'; $country = 'unknown'; } else $name = $geoip->GEOIP_COUNTRY_NAMES[$id]; $c .= '<li><div class="cpd-flag cpd-flag-'.$country.'" title="'.$country.'"></div> '.$name.' <b>'.$value.'</b></li>'."\n"; } $c .= '</ul>'; } if ($return) return $c; else echo $c; } /** * gets a world map * @param string $what visitors|reads|online * @param int $width size * @param int $height size */ function getMap( $what = 'visitors', $width = 500, $height = 430 ) { global $cpd_geoip, $cpd_geoip_dir, $cpd_data; if ( !$cpd_geoip || !in_array($what, array('visitors','reads','online')) ) return; $cpd_data = array('-' => 0); if ( $what == 'online' ) { require_once(WP_PLUGIN_DIR.'/count-per-day/geoip.php'); $oc = get_option('count_per_day_online', array()); $gi = geoip_open($cpd_geoip_dir.'GeoIP.dat', GEOIP_STANDARD); $vo = array(); foreach ($oc as $ip => $x) { // if ( strpos($ip,'.') !== false && strpos($ip,':') === false) if( filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ) // IPv4 -> IPv6 $ip = '::'.$ip; $country = strtoupper(geoip_country_code_by_addr_v6($gi, $ip)); $cpd_data[$country] = (isset($cpd_data[$country])) ? $cpd_data[$country] + 1 : 1; } } else { $temp = $this->addCollectionToCountries( ($what == 'visitors') ); foreach ($temp as $country => $value) if ($country != '-') $cpd_data[strtoupper($country)] = $value; } ?> <div id="mapdiv" class="cpdmap-frontend" style="width:<?php echo $width ?>px;height:<?php echo $height ?>px;"></div> <?php wp_enqueue_script( 'cpd_ammap', $this->dir.'/map/ammap.js', false ); wp_enqueue_script( 'cpd_worldLow', $this->dir.'/map/worldLow.js', false ); add_action('wp_footer', array(&$this,'addMapScript'), 100); } function addMapScript() { global $cpd_dir, $cpd_data; var_dump($cpd_data); ?> <script type="text/javascript"> AmCharts.ready(function() { var map = new AmCharts.AmMap(); map.pathToImages = "<?php echo WP_PLUGIN_URL ?>/count-per-day/map/images/"; map.addTitle("Your Visitors all over the World", 14); map.mouseWheelZoomEnabled = true; var c = "#38E"; map.dataProvider = { mapVar: AmCharts.maps.worldLow, getAreasFromMap:true, areas: [ {id:"AE",value:0,color:c},{id:"AF",value:0,color:c},{id:"AL",value:0,color:c},{id:"AM",value:0,color:c},{id:"AO",value:0,color:c},{id:"AR",value:0,color:c},{id:"AT",value:0,color:c},{id:"AU",value:0,color:c},{id:"AZ",value:0,color:c},{id:"BA",value:0,color:c},{id:"BD",value:0,color:c},{id:"BE",value:0,color:c},{id:"BF",value:0,color:c},{id:"BG",value:0,color:c},{id:"BI",value:0,color:c},{id:"BJ",value:0,color:c},{id:"BN",value:0,color:c},{id:"BO",value:0,color:c},{id:"BR",value:0,color:c},{id:"BS",value:0,color:c},{id:"BT",value:0,color:c},{id:"BW",value:0,color:c},{id:"BY",value:0,color:c},{id:"BZ",value:0,color:c},{id:"CA",value:0,color:c},{id:"CD",value:0,color:c},{id:"CF",value:0,color:c},{id:"CG",value:0,color:c},{id:"CH",value:0,color:c},{id:"CI",value:0,color:c},{id:"CL",value:0,color:c},{id:"CM",value:0,color:c},{id:"CN",value:0,color:c},{id:"CO",value:0,color:c},{id:"CR",value:0,color:c},{id:"CU",value:0,color:c},{id:"CY",value:0,color:c},{id:"CZ",value:0,color:c},{id:"DE",value:0,color:c},{id:"DJ",value:0,color:c},{id:"DK",value:0,color:c},{id:"DO",value:0,color:c},{id:"DZ",value:0,color:c},{id:"EC",value:0,color:c},{id:"EE",value:0,color:c},{id:"EG",value:0,color:c},{id:"EH",value:0,color:c},{id:"ER",value:0,color:c},{id:"ES",value:0,color:c},{id:"ET",value:0,color:c},{id:"FK",value:0,color:c},{id:"FI",value:0,color:c},{id:"FJ",value:0,color:c},{id:"FR",value:0,color:c},{id:"GA",value:0,color:c},{id:"GB",value:0,color:c},{id:"GE",value:0,color:c},{id:"GF",value:0,color:c},{id:"GH",value:0,color:c},{id:"GL",value:0,color:c},{id:"GM",value:0,color:c},{id:"GN",value:0,color:c},{id:"GQ",value:0,color:c},{id:"GR",value:0,color:c},{id:"GT",value:0,color:c},{id:"GW",value:0,color:c},{id:"GY",value:0,color:c},{id:"HN",value:0,color:c},{id:"HR",value:0,color:c},{id:"HT",value:0,color:c},{id:"HU",value:0,color:c},{id:"ID",value:0,color:c},{id:"IE",value:0,color:c},{id:"IL",value:0,color:c},{id:"IN",value:0,color:c},{id:"IQ",value:0,color:c},{id:"IR",value:0,color:c},{id:"IS",value:0,color:c},{id:"IT",value:0,color:c},{id:"JM",value:0,color:c},{id:"JO",value:0,color:c},{id:"JP",value:0,color:c},{id:"KE",value:0,color:c},{id:"KG",value:0,color:c},{id:"KH",value:0,color:c},{id:"KP",value:0,color:c},{id:"KR",value:0,color:c},{id:"XK",value:0,color:c},{id:"KW",value:0,color:c},{id:"KZ",value:0,color:c},{id:"LA",value:0,color:c},{id:"LB",value:0,color:c},{id:"LK",value:0,color:c},{id:"LR",value:0,color:c},{id:"LS",value:0,color:c},{id:"LT",value:0,color:c},{id:"LU",value:0,color:c},{id:"LV",value:0,color:c},{id:"LY",value:0,color:c},{id:"MA",value:0,color:c},{id:"MD",value:0,color:c},{id:"ME",value:0,color:c},{id:"MG",value:0,color:c},{id:"MK",value:0,color:c},{id:"ML",value:0,color:c},{id:"MM",value:0,color:c},{id:"MN",value:0,color:c},{id:"MR",value:0,color:c},{id:"MW",value:0,color:c},{id:"MX",value:0,color:c},{id:"MY",value:0,color:c},{id:"MZ",value:0,color:c},{id:"NA",value:0,color:c},{id:"NC",value:0,color:c},{id:"NE",value:0,color:c},{id:"NG",value:0,color:c},{id:"NI",value:0,color:c},{id:"NL",value:0,color:c},{id:"NO",value:0,color:c},{id:"NP",value:0,color:c},{id:"NZ",value:0,color:c},{id:"OM",value:0,color:c},{id:"PA",value:0,color:c},{id:"PE",value:0,color:c},{id:"PG",value:0,color:c},{id:"PH",value:0,color:c},{id:"PL",value:0,color:c},{id:"PK",value:0,color:c},{id:"PR",value:0,color:c},{id:"PS",value:0,color:c},{id:"PT",value:0,color:c},{id:"PY",value:0,color:c},{id:"QA",value:0,color:c},{id:"RO",value:0,color:c},{id:"RS",value:0,color:c},{id:"RU",value:0,color:c},{id:"RW",value:0,color:c},{id:"SA",value:0,color:c},{id:"SB",value:0,color:c},{id:"SD",value:0,color:c},{id:"SE",value:0,color:c},{id:"SI",value:0,color:c},{id:"SJ",value:0,color:c},{id:"SK",value:0,color:c},{id:"SL",value:0,color:c},{id:"SN",value:0,color:c},{id:"SO",value:0,color:c},{id:"SR",value:0,color:c},{id:"SS",value:0,color:c},{id:"SV",value:0,color:c},{id:"SY",value:0,color:c},{id:"SZ",value:0,color:c},{id:"TD",value:0,color:c},{id:"TF",value:0,color:c},{id:"TG",value:0,color:c},{id:"TH",value:0,color:c},{id:"TJ",value:0,color:c},{id:"TL",value:0,color:c},{id:"TM",value:0,color:c},{id:"TN",value:0,color:c},{id:"TR",value:0,color:c},{id:"TT",value:0,color:c},{id:"TW",value:0,color:c},{id:"TZ",value:0,color:c},{id:"UA",value:0,color:c},{id:"UG",value:0,color:c},{id:"US",value:0,color:c},{id:"UY",value:0,color:c},{id:"UZ",value:0,color:c},{id:"VE",value:0,color:c},{id:"VN",value:0,color:c},{id:"VU",value:0,color:c},{id:"YE",value:0,color:c},{id:"ZA",value:0,color:c},{id:"ZM",value:0,color:c},{id:"ZW",value:0,color:c}, <?php $r = __('Reads','cpd'); foreach ( $cpd_data as $k => $v ) echo "{id:'$k',value:$v,balloonText:'[[title]]<br><b>[[value]]</b> $r<br>[[percent]]%'}," ?> ]}; map.areasSettings = { color: "#FFFFFF", outlineColor: "#CCCCCC", outlineThickness: 0.2, rollOverColor: "#FFFF00" }; var legend = new AmCharts.ValueLegend(); legend.minValue = <?php echo min($cpd_data) ?>; legend.left = 10; legend.bottom = 25; legend.width = 150; legend.borderThickness = 0; legend.showAsGradient = true; map.valueLegend = legend; map.write("mapdiv"); }); </script> <?php } } // class end /** * widget class */ class CountPerDay_Widget extends WP_Widget { var $fields = array( 'title', 'order', 'show', 'getreadsall', 'getreadstoday', 'getreadsyesterday', 'getreadslastweek', 'getreadsthismonth', 'getuserall', 'getusertoday', 'getuseryesterday', 'getuserlastweek', 'getuserthismonth', 'getuserperday', 'getuseronline', 'getfirstcount', 'show_name', 'getreadsall_name', 'getreadstoday_name', 'getreadsyesterday_name', 'getreadslastweek_name', 'getreadsthismonth_name', 'getuserall_name', 'getusertoday_name', 'getuseryesterday_name', 'getuserlastweek_name', 'getuserthismonth_name', 'getuserperday_name', 'getuseronline_name', 'getfirstcount_name' ); var $cpd_funcs = array ( 'show', 'getReadsAll', 'getReadsToday', 'getReadsYesterday', 'getReadsLastWeek', 'getReadsThisMonth', 'getUserAll', 'getUserToday', 'getUserYesterday', 'getUserLastWeek', 'getUserThisMonth', 'getUserPerDay', 'getUserOnline', 'getFirstCount' ); var $funcs; var $names; // constructor function __construct() { $this->funcs = array_slice( $this->fields, 2, 14); $this->names = array_slice( $this->fields, 16, 14); parent::__construct('countperday_widget', 'Count per Day', array('description' => __('Statistics', 'cpd')), array('width' => 270) ); } // display widget function widget( $args, $instance ) { global $count_per_day; extract($args, EXTR_SKIP); $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']); echo $before_widget; if ( !empty( $title ) ) echo $before_title.$title.$after_title; echo '<ul class="cpd">'; $order = explode('|', $instance['order']); foreach ( $order as $k ) { if ( $k && $instance[$k] == 1 ) // checked only { if ( ($k == 'show' && is_singular()) || $k != 'show' ) { $f = str_replace( $this->funcs, $this->cpd_funcs, $k ); echo '<li class="cpd-l">'; echo '<span id="cpd_number_'.$k.'" class="cpd-r">'; // parameters only for special functions if ( $f == 'getUserPerDay' ) echo $count_per_day->getUserPerDay($count_per_day->options['dashboard_last_days']); else if ( $f == 'show' ) echo $count_per_day->show('', '', false, false); else echo call_user_func( array(&$count_per_day, $f) ); echo '</span>'.__($instance[$k.'_name']).':</li>'; } } } echo '</ul>'; echo $after_widget; } // update/save function function update( $new_instance, $old_instance ) { $instance = $old_instance; foreach ( $this->fields as $f ) if ( isset($new_instance[strtolower($f)]) ) $instance[strtolower($f)] = strip_tags($new_instance[strtolower($f)]); else $instance[strtolower($f)] = 0; // unchecked checkboxes return $instance; } // admin control form function form( $instance ) { $default = array( 'title' => 'Count per Day', 'order' => implode('|', $this->funcs), 'show' => 0, 'getreadsall' => 0, 'getreadstoday' => 0, 'getreadsyesterday' => 0, 'getreadslastweek' => 0, 'getreadsthismonth' => 0, 'getuserall' => 0, 'getusertoday' => 0, 'getuseryesterday' => 0, 'getuserthismonth' => 0, 'getuserlastweek' => 0, 'getuserperday' => 0, 'getuseronline' => 0, 'getfirstcount' => 0, 'show_name' => __('This post', 'cpd'), 'getreadsall_name' => __('Total reads', 'cpd'), 'getreadstoday_name' => __('Reads today', 'cpd'), 'getreadsyesterday_name' => __('Reads yesterday', 'cpd'), 'getreadslastweek_name' => __('Reads last week', 'cpd'), 'getreadsthismonth_name' => __('Reads per month', 'cpd'), 'getuserall_name' => __('Total visitors', 'cpd'), 'getusertoday_name' => __('Visitors today', 'cpd'), 'getuseryesterday_name' => __('Visitors yesterday', 'cpd'), 'getuserlastweek_name' => __('Visitors last week', 'cpd'), 'getuserthismonth_name' => __('Visitors per month', 'cpd'), 'getuserperday_name' => __('Visitors per day', 'cpd'), 'getuseronline_name' => __('Visitors currently online', 'cpd'), 'getfirstcount_name' => __('Counter starts on', 'cpd') ); if (empty($instance['order'])) $instance = array_merge( (array) $instance, $default ); // title field $field_id = $this->get_field_id('title'); $field_name = $this->get_field_name('title'); echo ' <ul id="cpdwidgetlist'.$field_id.'"> <li class="cpd_widget_item cpd_widget_title"> <label for="'.$field_id.'">'.__('Title').':</label> <input type="text" class="widefat" id="'.$field_id.'" name="'.$field_name.'" value="'.esc_attr( $instance['title'] ).'" /> </li>'; $order = explode('|', $instance['order']); foreach ( $order as $f ) { if ( $f ) { $check_id = $this->get_field_id( $f ); $check_name = $this->get_field_name( $f ); $check_status = ( !empty($instance[$f]) ) ? 'checked="checked"' : ''; $fl = $f.'_name'; $label_id = $this->get_field_id( $fl ); $label_name = $this->get_field_name( $fl ); $label_value = esc_attr( $instance[$fl] ); echo ' <li itemid="'.$f.'" class="cpd_widget_item" title="'.__('drag and drop to sort', 'cpd').'"> <input type="checkbox" class="checkbox" id="'.$check_id.'" name="'.$check_name.'" value="1" '.$check_status.' /> <label for="'.$check_id.'"> '.$default[$fl].'</label> <input type="text" class="widefat" id="'.$label_id.'" name="'.$label_name.'" value="'.$label_value.'" /> </li>'; } } echo "</ul>\n"; // order $of_id = $this->get_field_id('order'); $of_name = $this->get_field_name('order'); echo '<input type="hidden" id="'.$of_id.'" name="'.$of_name.'" value="'.esc_attr( $instance['order'] ).'" />'; ?> <script type="text/javascript"> //<![CDATA[ jQuery(document).ready(function(){ jQuery('#cpdwidgetlist<?php echo $field_id ?>').sortable({ items: 'li:not(.cpd_widget_title)', update: function (event, ui) { var ul = window.document.getElementById('cpdwidgetlist<?php echo $field_id ?>'); var items = ul.getElementsByTagName('li'); var array = new Array(); for (var i = 1, n = items.length; i < n; i++) { var identifier = items[i].getAttribute('itemid'); array.push(identifier); } window.document.getElementById('<?php echo $of_id ?>').value = array.join('|'); } }); }); //]]> </script> <?php } } // widget class /* * Popular Posts Widget * @url http://www.leaseweblabs.com/2014/01/popular-posts-count-per-day-wordpress-plugin/ */ class CountPerDay_PopularPostsWidget extends WP_Widget { function __construct() { parent::__construct( // Base ID of your widget 'countperday_popular_posts_widget', // Widget name will appear in UI 'Count per Day - '.__('Popular Posts', 'cpd'), // Widget description array( 'description' => __('List of Popular Posts', 'cpd') ) ); } // Creating widget front-end // This is where the action happens public function widget( $args, $instance ) { $title = apply_filters( 'widget_title', $instance['title'] ); $days = $instance['days' ] + 0; $limit = $instance['limit'] + 0; $head = $instance['head' ] ? true : false; $count = $instance['count'] ? true : false; // before and after widget arguments are defined by themes echo $args['before_widget']; if ( ! empty( $title ) ) { echo $args['before_title'].$title.$args['after_title']; } // This is where you run the code and display the output global $count_per_day; $html = $count_per_day->getMostVisitedPosts($days, $limit, 1, 1, 1); if (!$head ) $html = preg_replace('/<small>[^<]*<\/small>/','',$html); if (!$count) $html = preg_replace('/<b>[^<]*<\/b>/','',$html); echo $html; echo $args['after_widget']; } // Widget Backend public function form( $instance ) { $title = isset($instance['title']) ? $instance['title'] : __('Popular Posts', 'cpd'); $days = isset($instance['days' ]) ? $instance['days' ] : '7'; $limit = isset($instance['limit']) ? $instance['limit'] : '10'; $head = isset($instance['head' ]) ? $instance['head' ] : false; $count = isset($instance['count']) ? $instance['count'] : false; // Widget admin form ?> <p> <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'cpd' ); ?></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( 'days' ); ?>"><?php _e( 'Days:', 'cpd' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'days' ); ?>" name="<?php echo $this->get_field_name( 'days' ); ?>" type="text" value="<?php echo esc_attr( $days ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'limit' ); ?>"><?php _e( 'Limit:', 'cpd' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'limit' ); ?>" name="<?php echo $this->get_field_name( 'limit' ); ?>" type="text" value="<?php echo esc_attr( $limit ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'head' ); ?>"><?php _e( 'Show header:', 'cpd' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'head' ); ?>" name="<?php echo $this->get_field_name( 'head' ); ?>" type="checkbox" <?php echo $head?'checked="checked"':'' ?> /> </p> <p> <label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Show counters:', 'cpd' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>" type="checkbox" <?php echo $count?'checked="checked"':'' ?> /> </p> <?php } // Updating widget replacing old instances with new public function update( $new_instance, $old_instance ) { $instance = array(); $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; $instance['days' ] = ( ! empty( $new_instance['days' ] ) ) ? strip_tags( $new_instance['days' ] ) : ''; $instance['limit'] = ( ! empty( $new_instance['limit'] ) ) ? strip_tags( $new_instance['limit'] ) : ''; $instance['head' ] = ( ! empty( $new_instance['head' ] ) ) ? strip_tags( $new_instance['head' ] ) : ''; $instance['count'] = ( ! empty( $new_instance['count'] ) ) ? strip_tags( $new_instance['count'] ) : ''; return $instance; } } // CountPerDay_PopularPostsWidget /** * uninstall function, deletes tables and options */ function count_per_day_uninstall() { global $wpdb; $wpdb->query('DROP TABLE IF EXISTS '.$wpdb->cpd_counter); $wpdb->query('DROP TABLE IF EXISTS '.$wpdb->cpd_counter_useronline); $wpdb->query('DROP TABLE IF EXISTS '.$wpdb->cpd_notes); delete_option('count_per_day'); delete_option('count_per_day_summary'); delete_option('count_per_day_collected'); delete_option('count_per_day_online'); delete_option('count_per_day_notes'); delete_option('count_per_day_posts'); delete_option('count_per_day_search'); $wpdb->query("DELETE FROM $wpdb->usermeta WHERE meta_key LIKE '%_cpd_metaboxes%';"); } $count_per_day = new CountPerDay();