Revision [7932]
This is an old revision of AdvancedReferrersHandler made by DarTar on 2005-05-06 13:13:01.
Advanced Referrers Handler
See also:
Documentation: AdvancedReferrersHandlerInfo.Referrer lists generated by WikkaWiki on high-traffic servers are likely to become unmanageable, due to their ever growing size. Of course you can limit the volume of the referrers by changing the referrers_purge_time in the ConfigurationOptions, so referrers older then n days are purged from the database. To allow a better management of the referrer list without purging the DB, I've modified the referrer handlers to allow searching and filtering.
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)
HomePage | URLs | Domains |
Global | URLs | Domains |
Blacklist | Domains |
Results: 2
3 | http://testme/wikka-1.1.6.0/wikka.php?wakka=HomePage [Blacklist] |
1 | http://testme/wikka-1.1.6.0-dev/wikka.php?wakka=HomePage [Blacklist] |
Features
Current version: 0.2
- search referrers/domains by string
- filter referrers/domains by number of hits
- filter referrers/domains by time interval
Todo:
- merge referrers.php and referrers_sites.php
The code
First you will need to modify the LoadReferrers() function in wikka.php:
original
- function LoadReferrers($tag = "")
- {
- 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");
- }
modified
- function LoadReferrers($tag = '', $query)
- {
- 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);
- }
Then, you'll have to replace the referrers.php and referrers_sites.php files (in the ./handlers/page/ folder) with the following:
referrers.php
- <div id="page">
- <?php
- /**
- * Display, filter and search the referrer list for the current page
- *
- * Usage: append /referrers to the URL of the page
- *
- * This handler allows users to display, filter and search the referrer list for
- * the current page and for the whole site. Current search criteria include strings,
- * number of hits, reference period.
- *
- * @package Handlers
- * @subpackage
- * @name referrers
- *
- * @author {@link http://wikka.jsnx.com/DarTar Dario Taraborelli} - code cleanup, search/filter functionality added.
- * @version 0.2
- * @since Wikka 1.1.6.X
- *
- * @input string $q optional: string used to filter the referrers;
- * default: '';
- * the default can be overridden by providing a POST parameter 'q'
- * @input integer $qo optional: determines the kind of search to be performed for string $q:
- * 1: search for all referrers containing a given string
- * 0: search for all referrers not containing a given string
- * default: 1;
- * the default can be overridden by providing a POST parameter 'qo'
- * @input integer $h optional: number of hits used to filter the referrers;
- * default: 1;
- * the default can be overridden by providing a POST parameter 'h'
- * @input integer $ho optional: determines the kind of filter to be applied to $h:
- * 1: search for referrers with more than $h hits;
- * 0: search for referrers with less than $h hits;
- * default: 1;
- * the default can be overridden by providing a POST parameter 'ho'
- * @input integer $days optional: number of days used to filter the referrers;
- * default: 1;
- * the default can be overridden by providing a POST parameter 'h'
- * @input integer $global optional: switches between local/global referrers:
- * 1: display referrers for the whole site;
- * 0: display referrers for the current page;
- * default: 0;
- * the default can be overridden by providing a GET/POST parameter 'global'
- */
- //constants
- //parameters
- $q = ''; #search string
- $qo = ''; #search string option
- $h = ''; #hits number
- $ho = ''; #hits option
- $days = ''; #days number
- $global = ''; #global/local referrers
- //internal variables
- $option = '';
- $hits_option = '';
- $query = '';
- $n ='';
- //get and validate URL parameters
- $qo = (isset($_POST['qo']) && preg_match('/[01]/', $_POST['qo']))? $_POST['qo'] : SEARCH_DEFAULT_OPTION;
- $ho = (isset($_POST['ho']) && preg_match('/[01]/', $_POST['ho']))? $_POST['ho'] : HITS_DEFAULT_OPTION;
- $days = (isset($_POST['days']) && is_numeric($_POST['days']) && ($_POST['days'] <= MAX_DAYS) && ($_POST['days'] > 0))? $_POST['days'] : DAYS_DEFAULT;
- $global = (isset($_POST['global']) && preg_match('/[01]/', $_POST['global']))? $_POST['global'] : ((isset($_GET['global']))? $_GET['global'] : '');
- // build query from chunks
- $option = ($qo == '1')? 'LIKE' : 'NOT LIKE'; #set search string operator
- $hits_option = ($ho == '1')? '>' : '<'; #set hits operator
- $query .= (strlen($q) > 0)? ' AND referrer '.$option.' "%'.$q.'%"' : ''; #filter by string if needed
- $query .= ($days !== MAX_DAYS)? ' AND TO_DAYS(NOW()) - TO_DAYS(time) <= '.mysql_real_escape_string($days) : ''; #filter by time if needed
- $query .= ' GROUP BY referrer '; #required
- $query .= ($h > 0)? ' HAVING num '.$hits_option.' '.mysql_real_escape_string($h) : ''; #filter by hits
- $query .= ' ORDER BY num desc'; # set order
- // build menu chunks
- $lr = "<a href=\"".$this->href("referrers")."\">URLs</a>";
- $ld = "<a href=\"".$this->href("referrers_sites")."\">Domains</a>";
- $gr = "<a href=\"".$this->Href("referrers", "", "global=1")."\">URLs</a>";
- $gd = "<a href=\"".$this->Href("referrers_sites", "", "global=1")."\">Domains</a>";
- $bd = "<a href=\"".$this->href("review_blacklist")."\">Domains</a>";
- $IsAdmin = $this->IsAdmin();
- if ($global == 1)
- {
- $title = "Sites linking to this wiki ".($days ? " (last ".($days == 1 ? "24 hours" : $days." days").")" : "");
- $referrers = $this->LoadReferrers('', $query);
- }
- else
- {
- $title = "List of external pages linking to ".$this->Link($this->tag).($days ? " (last ".($days == 1 ? "24 hours" : $days." days").")" : "");
- $referrers = $this->LoadReferrers($this->tag, $query);
- }
- $menu = "<table style=\"border:1px solid #666; padding: 2pt; margin: 5pt\">";
- $menu .= "<tr><td>".$this->tag."</td><td>".$lr."</td><td>".$ld."</td></tr>";
- $menu .= "<tr><td>Global</td><td>".$gr."</td><td>".$gd."</td></tr>";
- $menu .= "<tr><td>Blacklist</td><td></td><td>".$bd."</td></tr>";
- $menu .= "</table>";
- print ($global == 1)? $this->Format('=== Global referrers ===') : $this->Format('=== Referrers for '.$this->tag.'===') ;
- print ("<br />".$title."<br />\n");
- print ($menu."\n");
- //print("<em>Note to spammers: This page is not indexed by search engines, so don't waste your time.</em><br />");
- //print 'Query: '.$query.'<br />'; #debug
- //print 'Global: '.$global; #debug
- // build form
- $form = $this->FormOpen('referrers','','post');
- $form .= '<table style="border: 1px solid #666; padding: 2pt; margin: 5pt">';
- $form .= '<tr><td><strong>Search referrers </strong></td>';
- $form .= '<td><select name="qo" title="Select search option">';
- $form .= '<option value="1" '.(($qo == '1')? 'selected = "selected"' : '').'>containing</option>';
- $form .= '<option value="0" '.(($qo == '0')? 'selected = "selected"' : '').'>not containing</option>';
- $form .= '</select> ';
- $form .= 'string: <input type ="text" name="q" title="Enter a search string" size="10" maxlength="50" value="'.$q.'"/></td><tr>';
- $form .= '<tr><td></td><td>with ';
- $form .= '<select name="ho" title="Select filter option">';
- $form .= '<option value="1" '.(($ho == '1')? 'selected = "selected"' : '').'>more</option>';
- $form .= '<option value="0" '.(($ho == '0')? 'selected = "selected"' : '').'>less</option>';
- $form .= '</select> ';
- $form .= ' than: <input type ="text" name="h" title="Enter number of hits" size="10" maxlength="5" value="'.$h.'"/> hits</td></tr>';
- $form .= '<tr><td></td><td>for the last <select name="days" title="Select time interval">';
- // build drop-down menu
- for ($n = 1; $n < (MAX_DAYS + RECORD_LIMIT_STEP); $n += RECORD_LIMIT_STEP) {
- $selected = ($n == $days)? 'selected="selected"' : '';
- $form .= '<option value="'.$n.'" '.$selected.'>'.$n.'</option>';
- }
- $form .= '</select> days</td></tr>';
- $form .= '<tr><td></td><td><input type="submit" value="Submit" title="Click to query the referrer list" accesskey="a" /></td></tr>';
- $form .= '</table>';
- $form .= '<input type="hidden" name="global" value="'.$global.'" />';
- $form .= $this->FormClose();
- print $form.'<br />';
- if ($this->GetUser()) {
- if ($referrers)
- {
- print("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
- foreach ($referrers as $referrer)
- {
- print("<tr>");
- print("<td width=\"30\" align=\"right\" valign=\"top\" style=\"padding-right: 10px\">".$referrer["num"]."</td>");
- 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>");
- print("</tr>\n");
- }
- print("</table>\n");
- }
- } else {
- print("<em>You need to login to see referring sites</em><br />\n");
- }
- print ("<br />".$menu."\n");
- ?>
- </div>
referrers_sites.php
(forthcoming: will possibly be merged with referrers.php)
CategoryDevelopment