3 if (!defined('_ECRIRE_INC_VERSION')) return;
6 // Afficher les referers d'un article (ou du site)
9 // http://doc.spip.org/@inc_referenceurs_dist
10 function inc_referenceurs_dist ($id_article, $select, $table, $where, $groupby, $limit, $serveur='') {
12 $nbvisites = $lescriteres = array();
14 $result = sql_select("maj, referer_md5, referer, $select AS vis", $table, $where, $groupby, "maj DESC", $limit,'',$serveur);
15 while ($row = sql_fetch($result,$serveur)) {
16 $referer = interdire_scripts($row['referer']);
17 $buff = stats_show_keywords($referer, $referer);
20 $numero = $buff["hostname"];
21 $visites = $row['vis'];
22 $referermd5 = $row['referer_md5'];
23 $lesreferermd5[$numero] = $referermd5;
24 $lesliens[$numero] = $referer;
25 $lesurls[$numero] = $buff["host"];
26 if (!isset($nbvisites[$numero]))
27 $nbvisites[$numero] = $visites;
29 $nbvisites[$numero] +
= $visites;
30 if (!isset($lesreferers[$numero]))
31 $lesreferers[$numero] = array();
32 if (!isset($lesliensracine[$numero]))
33 $lesliensracine[$numero]=0;
35 if (isset($buff["keywords"])
36 AND $c = $buff["keywords"]) {
37 if (!isset($lescriteres[$numero][$c])) {
38 $lescriteres[$numero][$c] = true;
39 $tmp= " « $c »";
44 $tmp .= "?".$buff['query'];
45 if (strlen($tmp) > 18)
46 $tmp = "/".substr($tmp, 0, 15)."...";
47 else if (strlen($tmp) > 0)
51 $lesreferers[$numero][] = "<a href=\"".attribut_html($referer)."\">".quote_amp(urldecode($tmp))."</a>" . (($visites > 1)?
" ($visites)":""). ($id_article ?
'' : referes($referermd5));
52 } else $lesliensracine[$numero] +
= $visites;
56 if (!count($nbvisites)) return array();
58 return referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls);
61 function referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls)
63 global $spip_lang_right, $source_vignettes;
64 $vign = ((strlen($source_vignettes) > 0) &&
65 $GLOBALS['meta']["activer_captures_referers"]!='non');
67 foreach($nbvisites as $numero => $visites) {
69 $referermd5 = $lesreferermd5[$numero];
73 $ret = "\n<a href=\"http://".$lesurls[$numero]."\"><img src=\"$source_vignettes".rawurlencode($lesurls[$numero])."\"\nstyle=\"float: $spip_lang_right; margin-bottom: 3px; margin-left: 3px;\" alt='' /></a>";
75 if ($visites > 5) $bouton .= "<span class='visites visites3'>$visites "._T('info_visites')."</span> ";
76 else if ($visites > 1) $bouton .= "<span class='visites visites2'>$visites "._T('info_visites')."</span> ";
77 else $bouton .= "<span class='visites visites1'>$visites "._T('info_visite')."</span> ";
79 if ($numero == "(email)") {
80 $ret .= $bouton . "<b>".$numero."</b>";
82 $n = count($lesreferers[$numero]);
83 if (($n > 1) ||
($n > 0 && substr(supprimer_tags($lesreferers[$numero][0]),0,1) != '/')) {
84 $rac = $lesliensracine[$numero];
85 $bouton .= "<a href=\"http://".attribut_html($lesurls[$numero])."\" style='font-weight: bold;'>".$numero."</a>"
86 . (!$rac ?
'': (" <span class='spip_x-small'>(" . $rac .")</span>"));
87 $ret .= bouton_block_depliable($bouton,false)
88 . debut_block_depliable(false)
90 . join ("</li><li>",$lesreferers[$numero])
95 $lien = $n ?
$lesreferers[$numero][0] : '';
96 if (preg_match(",^(<a [^>]+>)([^ ]*)( \([0-9]+\))?,i", $lien, $regs)) {
97 $lien = quote_amp($regs[1]).$numero.$regs[2];
98 if (!strpos($lien, '</a>')) $lien .= '</a>';
100 $lien = "<a href=\"http://".attribut_html($numero)."\">".$numero."</a>";
101 $ret .= "<b>".quote_amp($lien)."</b>"
102 . ($id_article ?
'' : referes($referermd5));
110 // Les deux fonctions suivantes sont adaptees du code des "Visiteurs",
111 // par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
113 // http://doc.spip.org/@stats_load_engines
114 function stats_load_engines() {
115 $arr_engines = Array();
116 lire_fichier(find_in_path('engines-list.txt'), $moteurs);
117 foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) {
118 $ligne = trim($ligne);
119 if (preg_match(',^\[([^][]*)\]$,S', $ligne, $regs)) {
122 } else if (preg_match(',=$,', $ligne, $regs))
125 $arr_engines[] = array($moteur,$query,$ligne);
130 // http://doc.spip.org/@stats_show_keywords
131 function stats_show_keywords($kw_referer, $kw_referer_host) {
132 static $arr_engines = '';
135 if (!is_array($arr_engines)) {
136 // Charger les moteurs de recherche
137 $arr_engines = stats_load_engines();
139 // initialiser la recherche interne
140 $url_site = $GLOBALS['meta']['adresse_site'];
141 $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site));
144 if ($url = @parse_url
( $kw_referer )) {
145 $query = isset($url['query'])?
$url['query']:"";
146 $host = strtolower($url['host']);
147 $path = $url['path'];
148 } else $query = $host = $path ='';
150 // construire un array des variables directement depuis la query-string
151 parse_str($query, $Tquery);
156 if (!empty($url_site)) {
157 if (strpos('-'.$kw_referer, $url_site)!==false) {
158 if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs))
159 $keywords = urldecode($regs[2]);
163 return array('host' => '');
165 for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++
)
167 if ( $found = preg_match(','.$arr_engines[$cnt][2].',', $host)
168 OR $found = preg_match(','.$arr_engines[$cnt][2].',', $path))
170 $kw_referer_host = $arr_engines[$cnt][0];
172 if (strpos($arr_engines[$cnt][1],'=')!==false) {
174 // Fonctionnement simple: la variable existe dans l'array
175 $v = str_replace('=', '', $arr_engines[$cnt][1]);
176 $keywords = isset($Tquery[$v]) ?
$Tquery[$v]: "";
178 // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
179 if (! strlen($keywords) > 0) {
180 if (preg_match(",".$arr_engines[$cnt][1]."([^\&]*),", $query, $vals)) {
181 $keywords = urldecode($vals[2]);
188 if (( ($kw_referer_host == "Google")
189 ||
($kw_referer_host == "AOL" && strpos($query,'enc=iso')===false)
190 ||
($kw_referer_host == "MSN")
192 include_spip('inc/charsets');
193 if (!isset($ie) OR !$cset = $ie) $cset = 'utf-8';
194 $keywords = importer_charset($keywords,$cset);
196 $buffer["hostname"] = $kw_referer_host;
201 $buffer["host"] = $host;
202 if (!isset($buffer["hostname"]) OR !$buffer["hostname"])
203 $buffer["hostname"] = $host;
205 $buffer["path"] = substr($path, 1, strlen($path));
206 $buffer["query"] = $query;
210 if (strlen($keywords) > 150) {
211 $keywords = spip_substr($keywords, 0, 148);
212 // supprimer l'eventuelle entite finale mal coupee
213 $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
215 $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
224 // Recherche des articles pointes par le referer
226 // http://doc.spip.org/@referes
227 function referes($referermd5, $serveur='') {
228 $retarts = sql_allfetsel('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).", INTERVAL 2 DAY))", '', "titre",'','',$serveur);
230 foreach ($retarts as $k => $rowart) {
231 $titre = typo($rowart['titre']);
232 $url = generer_url_entite($rowart['id_article'], 'article');
233 $retarts[$k] = "<a href='$url'><i>$titre</i></a>";
236 if (count($retarts) > 1)
237 return '<br />→ '.join(',<br />→ ',$retarts);
238 if (count($retarts) == 1)
239 return '<br />→ '. array_shift($retarts);