Revision [7931]

This is an old revision of AdvancedReferrersHandler made by DarTar on 2005-05-06 13:03:34.

 

Advanced Referrers Handler


See also:
Documentation: AdvancedReferrersHandlerInfo.
This is the development page for an advanced referrers handler.
 



The referrer lists generated by WikkaWiki on high-traffic servers become easily unmanageable, due to their ever growing size. Of course you can limit the volume of the referrers by changing the referrer_purge_time in the ConfigurationOptions. To increase the legibility of the referrer list without purging the DB, I've modified the referrer handlers to allow searching and filtering the list.

Preview


Here's an example of how the new interface looks like:

Referrers for HomePage


List of external pages linking to HomePage (last 7 days)
HomePageURLsDomains
GlobalURLsDomains
BlacklistDomains
Search referrers string:
with than: hits
for the last days

Results: 2

3http://testme/wikka-1.1.6.0/wikka.php?wakka=HomePage [Blacklist]
1http://testme/wikka-1.1.6.0-dev/wikka.php?wakka=HomePage [Blacklist]


The code


First you will need to modify the LoadReferrers() function in wikka.php:

original
  1.     function LoadReferrers($tag = "")
  2.     {
  3.         return $this->LoadAll("select referrer, count(referrer) as num from ".$this->config["table_prefix"]."referrers ".($tag = trim($tag) ? "where page_tag = '".mysql_real_escape_string($tag)."'" : "")." group by referrer order by num desc");
  4.     }


modified

  1.     function LoadReferrers($tag = '', $query)
  2.     {
  3.         return $this->LoadAll("SELECT referrer, COUNT(referrer) AS num FROM ".$this->config["table_prefix"]."referrers WHERE ".(($tag = trim($tag))? "page_tag = '".mysql_real_escape_string($tag)."'" : "1").$query);
  4.     }


Then, you'll have to replace the referrers.php and referrers_sites.php files (in the ./handlers/page/ folder) with the following:

referrers.php
  1. <div id="page">
  2. <?php
  3. /**
  4.  * Display, filter and search the referrer list for the current page
  5.  *
  6.  * Usage: append /referrers to the URL of the page
  7.  *
  8.  * This handler allows users to display, filter and search the referrer list for
  9.  * the current page and for the whole site. Current search criteria include strings,
  10.  * number of hits, reference period.
  11.  *
  12.  * @package         Handlers
  13.  * @subpackage        
  14.  * @name              referrers
  15.  *
  16.  * @author            {@link http://wikka.jsnx.com/DarTar Dario Taraborelli} - code cleanup, search/filter functionality added.  
  17.  * @version           0.2
  18.  * @since             Wikka 1.1.6.X
  19.  *                      
  20.  * @input       string  $q  optional: string used to filter the referrers;
  21.  *              default: '';
  22.  *              the default can be overridden by providing a POST parameter 'q'
  23.  * @input       integer $qo optional: determines the kind of search to be performed for string $q:
  24.  *              1: search for all referrers containing a given string
  25.  *              0: search for all referrers not containing a given string
  26.  *              default: 1;
  27.  *              the default can be overridden by providing a POST parameter 'qo'
  28.  * @input       integer  $h  optional: number of hits used to filter the referrers;
  29.  *              default: 1;
  30.  *              the default can be overridden by providing a POST parameter 'h'
  31.  * @input       integer $ho optional: determines the kind of filter to be applied to $h:
  32.  *              1: search for referrers with more than $h hits;
  33.  *              0: search for referrers with less than $h hits;
  34.  *              default: 1;
  35.  *              the default can be overridden by providing a POST parameter 'ho'
  36.  * @input       integer  $days  optional: number of days used to filter the referrers;
  37.  *              default: 1;
  38.  *              the default can be overridden by providing a POST parameter 'h'
  39.  * @input       integer $global optional: switches between local/global referrers:
  40.  *              1: display referrers for the whole site;
  41.  *              0: display referrers for the current page;
  42.  *              default: 0;
  43.  *              the default can be overridden by providing a GET/POST parameter 'global'
  44.  */
  45.  
  46. //constants
  47. define('RECORD_LIMIT_STEP', '1');
  48. define('SEARCH_DEFAULT_OPTION', '1');
  49. define('HITS_DEFAULT', '0');
  50. define('HITS_DEFAULT_OPTION', '1');
  51. define('DAYS_DEFAULT', '7');
  52. define('MAX_DAYS', $this->GetConfigValue('referrers_purge_time'));
  53.  
  54. //parameters
  55. $q = ''; #search string
  56. $qo = ''; #search string option
  57. $h = ''; #hits number
  58. $ho = ''; #hits option
  59. $days = ''; #days number
  60. $global = ''; #global/local referrers
  61.  
  62. //internal variables
  63. $option = '';
  64. $hits_option = '';
  65. $query = '';
  66. $n ='';
  67.  
  68. //get and validate URL parameters
  69. $q = (isset($_POST['q']) && (strlen($_POST['q']) > 0))? $_POST['q'] : '';
  70. $qo = (isset($_POST['qo']) && preg_match('/[01]/', $_POST['qo']))? $_POST['qo'] : SEARCH_DEFAULT_OPTION;
  71. $h = (isset($_POST['h']) && preg_match('/[0-9]+/', $_POST['h']))? $_POST['h'] : HITS_DEFAULT;
  72. $ho = (isset($_POST['ho']) && preg_match('/[01]/', $_POST['ho']))? $_POST['ho'] : HITS_DEFAULT_OPTION;
  73. $days = (isset($_POST['days']) && is_numeric($_POST['days']) && ($_POST['days'] <= MAX_DAYS) && ($_POST['days'] > 0))? $_POST['days'] : DAYS_DEFAULT;
  74. $global = (isset($_POST['global']) && preg_match('/[01]/', $_POST['global']))? $_POST['global'] : ((isset($_GET['global']))? $_GET['global'] : '');
  75.  
  76. // build query from chunks
  77. $option = ($qo == '1')? 'LIKE' : 'NOT LIKE'; #set search string operator
  78. $hits_option = ($ho == '1')? '>' : '<'; #set hits operator
  79. $query .= (strlen($q) > 0)? ' AND referrer '.$option.' "%'.$q.'%"' : ''; #filter by string if needed
  80. $query .= ($days !== MAX_DAYS)? ' AND TO_DAYS(NOW()) - TO_DAYS(time) <= '.mysql_real_escape_string($days) : ''; #filter by time if needed
  81. $query .= ' GROUP BY referrer '; #required
  82. $query .= ($h > 0)? ' HAVING num '.$hits_option.' '.mysql_real_escape_string($h) : ''; #filter by hits
  83. $query .= ' ORDER BY num desc'; # set order
  84.  
  85. // build menu chunks
  86. $lr = "<a href=\"".$this->href("referrers")."\">URLs</a>";
  87. $ld = "<a href=\"".$this->href("referrers_sites")."\">Domains</a>";
  88. $gr = "<a href=\"".$this->Href("referrers", "", "global=1")."\">URLs</a>";
  89. $gd = "<a href=\"".$this->Href("referrers_sites", "", "global=1")."\">Domains</a>";
  90. $bd = "<a href=\"".$this->href("review_blacklist")."\">Domains</a>";
  91.  
  92. $IsAdmin = $this->IsAdmin();
  93. if ($global == 1)
  94. {
  95.     $title = "Sites linking to this wiki ".($days ? " (last ".($days == 1 ? "24 hours" : $days." days").")" : "");
  96.     $referrers = $this->LoadReferrers('', $query);
  97. }
  98. else
  99. {
  100.     $title = "List of external pages linking to ".$this->Link($this->tag).($days ? " (last ".($days == 1 ? "24 hours" : $days." days").")" : "");
  101.     $referrers = $this->LoadReferrers($this->tag, $query);
  102. }
  103.  
  104. $menu = "<table style=\"border:1px solid #666; padding: 2pt; margin: 5pt\">";
  105. $menu .= "<tr><td>".$this->tag."</td><td>".$lr."</td><td>".$ld."</td></tr>";
  106. $menu .= "<tr><td>Global</td><td>".$gr."</td><td>".$gd."</td></tr>";
  107. $menu .= "<tr><td>Blacklist</td><td></td><td>".$bd."</td></tr>";
  108. $menu .= "</table>";
  109.  
  110. print ($global == 1)? $this->Format('=== Global referrers ===') : $this->Format('=== Referrers for '.$this->tag.'===') ;
  111. print ("<br />".$title."<br />\n");
  112. print ($menu."\n");
  113. //print("<em>Note to spammers: This page is not indexed by search engines, so don't waste your time.</em><br />");
  114. //print 'Query: '.$query.'<br />'; #debug
  115. //print 'Global: '.$global; #debug
  116.  
  117. // build form
  118. $form = $this->FormOpen('referrers','','post');
  119. $form .= '<table style="border: 1px solid #666; padding: 2pt; margin: 5pt">';
  120. $form .= '<tr><td><strong>Search referrers </strong></td>';
  121. $form .= '<td><select name="qo" title="Select search option">';
  122. $form .= '<option value="1" '.(($qo == '1')? 'selected = "selected"' : '').'>containing</option>';
  123. $form .= '<option value="0" '.(($qo == '0')? 'selected = "selected"' : '').'>not containing</option>';
  124. $form .=  '</select> ';
  125. $form .= 'string: <input type ="text" name="q" title="Enter a search string" size="10" maxlength="50" value="'.$q.'"/></td><tr>';
  126. $form .= '<tr><td></td><td>with ';
  127. $form .= '<select name="ho" title="Select filter option">';
  128. $form .= '<option value="1" '.(($ho == '1')? 'selected = "selected"' : '').'>more</option>';
  129. $form .= '<option value="0" '.(($ho == '0')? 'selected = "selected"' : '').'>less</option>';
  130. $form .=  '</select> ';
  131. $form .= ' than: <input type ="text" name="h" title="Enter number of hits" size="10" maxlength="5" value="'.$h.'"/> hits</td></tr>';
  132. $form .= '<tr><td></td><td>for the last <select name="days" title="Select time interval">';
  133. // build drop-down menu
  134. for ($n = 1; $n < (MAX_DAYS + RECORD_LIMIT_STEP); $n += RECORD_LIMIT_STEP) {
  135.     $selected = ($n == $days)? 'selected="selected"' : '';  
  136.     $form .= '<option value="'.$n.'" '.$selected.'>'.$n.'</option>';
  137. }
  138. $form .=  '</select> days</td></tr>';
  139. $form .= '<tr><td></td><td><input type="submit" value="Submit" title="Click to query the referrer list" accesskey="a" /></td></tr>';
  140. $form .= '</table>';
  141. $form .= '<input type="hidden" name="global" value="'.$global.'" />';
  142. $form .= $this->FormClose();
  143. print $form.'<br />';
  144. echo $this->Format('== Results: '.count($referrers).'== --- ');
  145.  
  146. if ($this->GetUser()) {
  147.     if ($referrers)
  148.     {
  149.         print("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
  150.         foreach ($referrers as $referrer)
  151.         {
  152.             print("<tr>");
  153.             print("<td width=\"30\" align=\"right\" valign=\"top\" style=\"padding-right: 10px\">".$referrer["num"]."</td>");
  154.             print("<td valign=\"top\"><a href=\"".$this->htmlspecialchars_ent($referrer["referrer"])."\">".$this->htmlspecialchars_ent($referrer["referrer"])."</a> ".($IsAdmin ? "[<a href=\"".$this->href("delete_referrer", "", "spam_link=").$this->htmlspecialchars_ent($referrer["referrer"])."&redirect=".$this->GetMethod()."\">Blacklist</a>]" : "")."</td>");
  155.             print("</tr>\n");
  156.         }
  157.         print("</table>\n");
  158.     }
  159. } else {
  160.     print("<em>You need to login to see referring sites</em><br />\n");
  161. }
  162.  
  163. print ("<br />".$menu."\n");
  164.  
  165. ?>
  166. </div>



referrers_sites.php

(forthcoming: will possibly be merged with referrers.php)



CategoryDevelopment
There are 8 comments on this page. [Show comments]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki