2 // TODO: make things cleaner. This file is an awful HTML/PHP soup.
\r
5 require_once( dirname(__FILE__).'/includes/load-yourls.php' );
\r
6 require_once( dirname(__FILE__).'/includes/functions-infos.php' );
\r
7 yourls_maybe_require_auth();
\r
9 if ( !isset( $_GET['id'] ) )
\r
10 yourls_redirect( YOURLS_SITE, 307 );
\r
13 if ( isset( $_GET['all'] ) && $_GET['all'] == 1 && yourls_allow_duplicate_longurls() )
\r
16 // Get basic infos for this shortened URL
\r
17 $keyword = yourls_sanitize_string( $_GET['id'] );
\r
18 $longurl = yourls_get_keyword_longurl( $keyword );
\r
19 $clicks = yourls_get_keyword_clicks( $keyword );
\r
20 $timestamp = yourls_get_keyword_timestamp( $keyword );
\r
22 if ( $longurl === false )
\r
23 yourls_redirect( YOURLS_SITE, 307 );
\r
25 if( yourls_do_log_redirect() ) {
\r
27 // Duplicate keywords, if applicable
\r
28 $keyword_list = yourls_get_duplicate_keywords( $longurl );
\r
30 // Fetch all information from the table log
\r
31 $table = YOURLS_DB_TABLE_LOG;
\r
34 $keywords = join( "', '", $keyword_list );
\r
35 // Fetch information for all keywords pointing to $longurl
\r
36 $hits = $ydb->get_results( "SELECT `keyword`, `click_time`, `referrer`, `user_agent`, `country_code` FROM `$table` WHERE `keyword` IN ( '$keywords' );" );
\r
38 // Fetch information for current keyword only
\r
39 $hits = $ydb->get_results( "SELECT `click_time`, `referrer`, `user_agent`, `country_code` FROM `$table` WHERE `keyword` = '$keyword';" );
\r
42 $referrers = array();
\r
43 $direct = $notdirect = 0;
\r
44 $countries = array();
\r
46 $list_of_days = array();
\r
47 $list_of_months = array();
\r
48 $list_of_years = array();
\r
49 $last_24h = array();
\r
51 // Loop through all results and build list of referrers, countries and hits per day
\r
52 foreach( (array)$hits as $hit ) {
\r
53 extract( (array)$hit );
\r
55 if ( isset( $country_code ) && $country_code ) {
\r
56 if( !array_key_exists( $country_code, $countries ) )
\r
57 $countries[$country_code] = 0;
\r
58 $countries[$country_code]++;
\r
61 if( isset( $referrer ) ) {
\r
62 if ( $referrer == 'direct' ) {
\r
66 $host = yourls_get_domain( $referrer );
\r
67 if( !array_key_exists( $host, $referrers ) )
\r
68 $referrers[$host] = array( );
\r
69 if( !array_key_exists( $referrer, $referrers[$host] ) )
\r
70 $referrers[$host][$referrer] = 0;
\r
71 $referrers[$host][$referrer]++;
\r
75 if( isset( $click_time ) ) {
\r
76 $now = intval( date('U') );
\r
78 preg_match('/(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/', $click_time, $matches);
\r
79 list( $temp, $year, $month, $day, $hour, $min, $sec ) = $matches;
\r
82 // Build array of $dates[$year][$month][$day] = number of clicks
\r
83 if( !array_key_exists( $year, $dates ) )
\r
84 $dates[$year] = array();
\r
85 if( !array_key_exists( $month, $dates[$year] ) )
\r
86 $dates[$year][$month] = array();
\r
87 if( !array_key_exists( $day, $dates[$year][$month] ) )
\r
88 $dates[$year][$month][$day] = 0;
\r
89 $dates[$year][$month][$day]++;
\r
91 // Build array of last 24 hours $last_24h[$hour] = number of click
\r
92 $then = strtotime( $click_time);
\r
93 if( ( $now >= $then ) && ( ( $now - $then ) < ( 24 * 60 * 60 ) ) ) {
\r
94 $year = sprintf( "%02d", substr( $year, -1, 2 ) ); // 2009 -> 09
\r
95 $diff = $now - strtotime( $click_time);
\r
96 if( !array_key_exists( "$year-$month-$day-$hour", $last_24h ) )
\r
97 $last_24h["$year-$month-$day-$hour"] = 0;
\r
98 $last_24h["$year-$month-$day-$hour"]++;
\r
104 // Sort dates, chronologically from [2007][12][24] to [2009][02][19]
\r
106 foreach( $dates as $year=>$months ) {
\r
107 ksort( $dates[$year] );
\r
108 foreach( $months as $month=>$day ) {
\r
109 ksort( $dates[$year][$month] );
\r
113 // Get $list_of_days, $list_of_months, $list_of_years
\r
115 extract( yourls_build_list_of_days( $dates ) );
\r
117 // If the $last_24h doesn't have all the hours, insert missing hours with value 0
\r
118 for ($i = 23; $i >= 0; $i--) {
\r
119 $h = date('y-m-d-H', $now - ($i * 60 * 60) );
\r
120 if( !array_key_exists( $h, $last_24h ) ) {
\r
124 ksort( $last_24h );
\r
127 // Sort countries, most frequent first
\r
129 arsort( $countries );
\r
131 // Sort referrers. $referrer_sort is a array of most frequent domains
\r
132 arsort( $referrers );
\r
133 $referrer_sort = array();
\r
134 $number_of_sites = count( array_keys( $referrers ) );
\r
135 foreach( $referrers as $site => $urls ) {
\r
136 if( count($urls) > 1 || $number_of_sites == 1 )
\r
137 $referrer_sort[$site] = array_sum( $urls );
\r
139 arsort($referrer_sort);
\r
144 echo "referrers: "; print_r( $referrers );
\r
145 echo "referrer sort: "; print_r( $referrer_sort );
\r
146 echo "direct: $direct\n";
\r
147 echo "notdirect: $notdirect\n";
\r
148 echo "dates: "; print_r( $dates );
\r
149 echo "list of days: "; print_r( $list_of_days );
\r
150 echo "list_of_months: "; print_r( $list_of_months );
\r
151 echo "list_of_years: "; print_r( $list_of_years );
\r
152 echo "last_24h: "; print_r( $last_24h );
\r
153 //echo "countries: "; print_r( $countries );
\r
160 yourls_html_head( 'infos' );
\r
164 <a href="<?php echo YOURLS_SITE; ?>/admin/index.php" title="YOURLS"><span>YOURLS</span>: <span>Y</span>our <span>O</span>wn <span>URL</span> <span>S</span>hortener<br/>
\r
165 <img src="<?php echo YOURLS_SITE; ?>/images/yourls-logo.png" alt="YOURLS" title="YOURLS" style="border: 0px;" /></a>
\r
167 <?php if ( yourls_is_private() ) { ?>
\r
168 <p>Your are logged in as: <strong><?php echo YOURLS_USER; ?></strong>.</p>
\r
171 <h2 id="informations">Information</h2>
\r
173 <h3>Short URL: <img src="<?php echo YOURLS_SITE; ?>/images/favicon.gif"/>
\r
174 <?php if( $aggregate ) {
\r
176 foreach( $keyword_list as $k ) {
\r
179 yourls_html_link( yourls_link($k) );
\r
181 yourls_html_link( yourls_link($k), "/$k" );
\r
183 if ( $i < count( $keyword_list ) )
\r
187 yourls_html_link( yourls_link($keyword) );
\r
188 if( count( $keyword_list ) > 1 )
\r
189 echo ' <a href="'. yourls_link($keyword).'+all" title="Aggregate stats for duplicate short URLs"><img src="' . YOURLS_SITE . '/images/chart_bar_add.png" border="0" /></a>';
\r
191 <h3 id="longurl">Long URL: <img class="fix_images" src="<?php echo yourls_get_domain( $longurl, true );?>/favicon.ico"/> <?php yourls_html_link( $longurl, '', 'longurl' ); ?></h3>
\r
194 <div class="wrap_unfloat">
\r
195 <ul id="headers" class="toggle_display stat_tab">
\r
196 <?php if( yourls_do_log_redirect() ) { ?>
\r
197 <li class="selected"><a href="#stat_tab_stats"><h2>Traffic statistics</h2></a></li>
\r
198 <li><a href="#stat_tab_location"><h2>Traffic location</h2></a></li>
\r
199 <li><a href="#stat_tab_sources"><h2>Traffic sources</h2></a></li>
\r
201 <li><a href="#stat_tab_share"><h2>Share</h2></a></li>
\r
206 <?php if( yourls_do_log_redirect() ) { ?>
\r
207 <div id="stat_tab_stats" class="tab">
\r
208 <h2>Traffic statistics</h2>
\r
210 <?php if ( $list_of_days ) { ?>
\r
214 '24' => 'Last 24 hours',
\r
215 '7' => 'Last 7 days',
\r
216 '30' => 'Last 30 days',
\r
220 // Which graph to generate ?
\r
221 $do_all = $do_30 = $do_7 = $do_24 = false;
\r
222 $hits_all = array_sum( $list_of_days );
\r
223 $hits_30 = array_sum( array_slice( $list_of_days, -30 ) );
\r
224 $hits_7 = array_sum( array_slice( $list_of_days, -7 ) );
\r
225 $hits_24 = array_sum( $last_24h );
\r
226 if( $hits_all > 0 )
\r
227 $do_all = true; // graph for all days range
\r
228 if( $hits_30 > 0 && count( array_slice( $list_of_days, -30 ) ) == 30 )
\r
229 $do_30 = true; // graph for last 30 days
\r
230 if( $hits_7 > 0 && count( array_slice( $list_of_days, -7 ) ) == 7 )
\r
231 $do_7 = true; // graph for last 7 days
\r
233 $do_24 = true; // graph for last 24 hours
\r
235 // Which graph to display ?
\r
236 $display_all = $display_30 = $display_7 = $display_24 = false;
\r
238 $display_24 = true;
\r
239 } elseif ( $do_7 ) {
\r
241 } elseif ( $do_30 ) {
\r
242 $display_30 = true;
\r
243 } elseif ( $do_all ) {
\r
244 $display_all = true;
\r
248 <table border="0" cellspacing="2">
\r
251 <ul id="stats_lines" class="toggle_display stat_line">
\r
253 if( $do_24 == true )
\r
254 echo "<li><a href='#stat_line_24'>Last 24 hours</a>";
\r
255 if( $do_7 == true )
\r
256 echo "<li><a href='#stat_line_7'>Last 7 days</a>";
\r
257 if( $do_30 == true )
\r
258 echo "<li><a href='#stat_line_30'>Last 30 days</a>";
\r
259 if( $do_all == true )
\r
260 echo "<li><a href='#stat_line_all'>All time</a>";
\r
264 // Generate, and display if applicable, each needed graph
\r
265 foreach( $graphs as $graph => $title ) {
\r
266 if( ${'do_'.$graph} == true ) {
\r
267 $display = ( ${'display_'.$graph} === true ? 'display:block' : 'display:none' );
\r
268 echo "<div id='stat_line_$graph' class='stats_line line' style='$display'>";
\r
269 $labels_1 = $labels_2 = array();
\r
272 // each key of $last_24h is of type "yy-mm-dd-hh"
\r
273 $first_key = current( array_keys( $last_24h ) );
\r
274 $last_key = end( array_keys( $last_24h ) );
\r
275 // Get "dd/mm" of first and last key
\r
276 $first_label = preg_replace( '/\d\d-(\d\d)-(\d\d)-\d\d/', '$2/$1', $first_key );
\r
277 $last_label = preg_replace( '/\d\d-(\d\d)-(\d\d)-\d\d/', '$2/$1', $last_key );
\r
278 $labels_2 = array( $first_label, $last_label);
\r
279 // Get hh of each key
\r
280 foreach( $last_24h as $k=>$v ) {
\r
281 $labels_1[] = end( explode( '-', $k ) ); // 'hh'
\r
284 echo "<h3>Number of hits : $title</h3>";
\r
285 yourls_stats_line( $last_24h, $labels_1, $labels_2 );
\r
290 // each key of $list_of_days is of type "yyyy-mm-dd"
\r
291 $slice = array_slice( $list_of_days, intval( $graph ) * -1 );
\r
292 foreach( $slice as $k=>$v ) {
\r
294 $labels_1[] = preg_replace( '/\d\d\d\d-\d\d-(\d\d)/', '$1', $k );
\r
296 $first_key = current( array_keys( $slice ) );
\r
297 $last_key = end( array_keys( $slice ) );
\r
298 // Get "dd/mm" of first and last key
\r
299 $first_label = preg_replace( '/\d\d\d\d-(\d\d)-(\d\d)/', '$2/$1', $first_key );
\r
300 $last_label = preg_replace( '/\d\d\d\d-(\d\d)-(\d\d)/', '$2/$1', $last_key );
\r
301 $labels_2 = array( $first_label, $last_label);
\r
303 echo "<h3>Number of hits : $title</h3>";
\r
304 yourls_stats_line( $slice, $labels_1, $labels_2 );
\r
310 foreach( $list_of_days as $k=>$v ) {
\r
311 $labels_1[] = preg_replace( '/\d\d(\d\d)-(\d\d)-\d\d/', '$1-$2', $k );
\r
313 // take out duplicates
\r
314 $labels_1 = array_unique( $labels_1 );
\r
315 // now get "mm" only so we have all different month
\r
316 foreach( $labels_1 as $k=>$v ) {
\r
317 $labels_1[$k] = preg_replace( '/\d\d-(\d\d)/', '$1', $v );
\r
320 echo "<h3>Number of hits : $title</h3>";
\r
321 $labels_1 = yourls_array_granularity( $labels_1, 30, false );
\r
322 $labels_2 = yourls_array_granularity( $list_of_years, 30, false );
\r
323 yourls_stats_line( $list_of_days, $labels_1, $labels_2 );
\r
332 <h3>Historical click count</h3>
\r
334 $ago = round( (date('U') - strtotime($timestamp)) / (24* 60 * 60 ) );
\r
338 $daysago = '(about '.$ago .' '.yourls_plural( ' day', $ago ).' ago)';
\r
341 <p>Short URL created on <?php echo date("F j, Y @ g:i a", strtotime($timestamp)); ?> <?php echo $daysago; ?></p>
\r
342 <div class="wrap_unfloat">
\r
343 <ul class="no_bullet toggle_display stat_line" id="historical_clicks">
\r
345 foreach( $graphs as $graph => $title ) {
\r
346 if ( ${'do_'.$graph} ) {
\r
347 $link = "<a href='#stat_line_$graph'>$title</a>";
\r
352 if( ${'do_'.$graph} ) {
\r
356 $stat = round( ( ${'hits_'.$graph} / intval( $graph ) ) * 100 ) / 100 . ' per day';
\r
359 $stat = round( ( ${'hits_'.$graph} / 24 ) * 100 ) / 100 . ' per hour';
\r
363 $stat = round( ( ${'hits_'.$graph} / $ago ) * 100 ) / 100 . ' per day';
\r
366 $hits = yourls_plural( 'hit', ${'hits_'.$graph} );
\r
367 echo "<li><span class='historical_link'>$link</span> <span class='historical_count'>${'hits_'.$graph} $hits</span> $stat</li>\n";
\r
374 <?php $best = yourls_stats_get_best_day( $list_of_days ); ?>
\r
375 <p><strong><?php echo $best['max'];?></strong> <?php echo yourls_plural( 'hit', $best['max'] ); ?> on <?php echo date("F j, Y", strtotime($best['day'])); ?>.
\r
376 <a href="" class='details' id="more_clicks">Click for more details</a></p>
\r
377 <ul id="details_clicks" style="display:none">
\r
379 foreach( $dates as $year=>$months ) {
\r
380 if( count( $list_of_years ) > 1 ) {
\r
381 $li = "<a href='' class='details' id='more_year$year'>Year $year</a>";
\r
384 $li = "Year $year";
\r
385 $display = 'block';
\r
388 echo "<ul style='display:$display' id='details_year$year'>";
\r
389 foreach( $months as $month=>$days ) {
\r
390 $monthname = date("F", mktime(0, 0, 0, $month,1));
\r
391 if( count( $list_of_months ) > 1 ) {
\r
392 $li = "<a href='' class='details' id='more_month$year$month'>$monthname</a>";
\r
395 $li = "$monthname";
\r
396 $display = 'block';
\r
399 echo "<ul style='display:$display' id='details_month$year$month'>";
\r
400 foreach( $days as $day=>$hits ) {
\r
401 $class = ( $hits == $best['max'] ? 'class="bestday"' : '' );
\r
402 echo "<li $class>$day: $hits". yourls_plural( ' hit', $hits) ."</li>\n";
\r
419 echo "<p>No traffic yet. Get some clicks first!</p>";
\r
424 <div id="stat_tab_location" class="tab">
\r
425 <h2>Traffic location</h2>
\r
427 <?php if ( $countries ) { ?>
\r
429 <table border="0" cellspacing="2">
\r
432 <h3>Top 5 countries</h3>
\r
433 <?php yourls_stats_pie( $countries, 5 ); ?>
\r
434 <p><a href="" class='details' id="more_countries">Click for more details</a></p>
\r
435 <ul id="details_countries" style="display:none" class="no_bullet">
\r
437 foreach( $countries as $code=>$count ) {
\r
438 echo "<li><img src='".yourls_geo_get_flag( $code )."' /> $code (".yourls_geo_countrycode_to_countryname( $code ).") : $count ".yourls_plural('hit', $count)."</li>\n";
\r
445 <h3>Overall traffic</h3>
\r
446 <?php yourls_stats_countries_map( $countries ); ?>
\r
452 echo "<p>No country data.</p>";
\r
457 <div id="stat_tab_sources" class="tab">
\r
458 <h2>Traffic Sources</h2>
\r
460 <?php if ( $referrers ) { ?>
\r
462 <table border="0" cellspacing="2">
\r
465 <h3>Referrer shares</h3>
\r
467 if ( $number_of_sites > 1 )
\r
468 $referrer_sort['Others'] = count( $referrers );
\r
469 yourls_stats_pie( $referrer_sort, 5, '440x220', '902020,FF6060' );
\r
470 unset( $referrer_sort['Others'] );
\r
473 <ul class="no_bullet">
\r
476 foreach( $referrer_sort as $site => $count ) {
\r
478 echo "<li class='sites_list'><img src='http://$site/favicon.ico' class='fix_images'/> $site: <strong>$count</strong> <a href='' class='details' id='more_url$i'>(details)</a></li>\n";
\r
479 echo "<ul id='details_url$i' style='display:none'>";
\r
480 foreach( $referrers[$site] as $url => $count ) {
\r
481 echo "<li>"; yourls_html_link($url); echo ": <strong>$count</strong></li>\n";
\r
484 unset( $referrers[$site] );
\r
486 // Any referrer left? Group in "various"
\r
487 if ( $referrers ) {
\r
488 echo "<li id='sites_various'>Various: <strong>". count( $referrers ). "</strong> <a href='' class='details' id='more_various'>(details)</a></li>\n";
\r
489 echo "<ul id='details_various' style='display:none'>";
\r
490 foreach( $referrers as $url ) {
\r
491 echo "<li>"; yourls_html_link(key($url)); echo ": 1</li>\n";
\r
502 <h3>Direct vs Referrer Traffic</h3>
\r
504 yourls_stats_pie( array('Direct'=>$direct, 'Referrers'=> $notdirect), 5, '440x220', '902020,FF6060' );
\r
506 <p>Direct traffic: <strong><?php echo $direct; ?></strong> <?php echo yourls_plural( 'hit', $direct ); ?> </p>
\r
507 <p>Referrer traffic: <strong><?php echo $notdirect; ?></strong> <?php echo yourls_plural( 'hit', $notdirect ); ?> </p>
\r
514 echo "<p>No referrer data.</p>";
\r
519 <?php } // endif do log redirect ?>
\r
522 <div id="stat_tab_share" class="tab">
\r
525 <?php yourls_share_box( $longurl, yourls_link($keyword), '', '', '<h3>Short link</h3>', '<h3>Quick Share</h3>'); ?>
\r
532 <?php yourls_html_footer(); ?>
\r