From 639b4844714dd15c67bf6ca5cde85621f2dfbb98 Mon Sep 17 00:00:00 2001 From: ARNO* <arno@rezo.net> Date: Thu, 29 Aug 2002 18:11:04 +0000 Subject: [PATCH] Retour du bousin stats (version corrigee). Plus un hack dans inc-calcul-squel pour avoir un critere "mode=image" dans les documents --- ecrire/inc_presentation.php3 | 3 +- ecrire/inc_statistiques.php3 | 95 +++++++++++++++++++++---------- ecrire/statistiques_articles.php3 | 10 ++-- inc-calcul-squel.php3 | 4 ++ 4 files changed, 77 insertions(+), 35 deletions(-) diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3 index 8500f4db69..de6e03b6ee 100644 --- a/ecrire/inc_presentation.php3 +++ b/ecrire/inc_presentation.php3 @@ -413,7 +413,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a $date = $row['date']; $statut = $row['statut']; $visites = $row['visites']; - $referers = $row['referers']; + $popularite = $row['popularite']; $descriptif = $row['descriptif']; if ($descriptif) $descriptif = ' title="'.attribut_html(typo($descriptif)).'"'; @@ -463,6 +463,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a $s = affdate($date); if ($connect_statut == "0minirezo" AND $activer_statistiques != "non" AND $afficher_visites AND $visites > 0) { $s .= "<br><font size=\"1\"><a href='statistiques_visites.php3?id_article=$id_article'>$visites visites</a></font>"; + if ($popularite > 0) $s .= "<br><font size=\"1\"><a href='statistiques_visites.php3?id_article=$id_article'>popularité : $popularite%</a></font>"; } $vals[] = $s; diff --git a/ecrire/inc_statistiques.php3 b/ecrire/inc_statistiques.php3 index 81369ec963..b556f1969d 100644 --- a/ecrire/inc_statistiques.php3 +++ b/ecrire/inc_statistiques.php3 @@ -245,51 +245,88 @@ function supprimer_referers($type = "") { $visites_min = $row['visites']; } - $query = "DELETE FROM $table WHERE date < DATE_SUB(NOW(),INTERVAL 7 DAY) OR visites <= $visites_min"; + $query = "DELETE FROM $table WHERE (date < DATE_SUB(NOW(),INTERVAL 7 DAY) AND visites <= $visites_min) OR (date < DATE_SUB(NOW(),INTERVAL 30 DAY)"; $result = spip_query($query); } -function optimiser_referers() { +function optimiser_referers($type = "") { $popularite_update = ""; + $diff = 7; + $coeff_referer = 2; - // Calcul des gains en popularite - $query = "SELECT id_article, COUNT(*) AS referers, SUM(visites) AS visites ". - "FROM spip_referers_articles GROUP BY id_article"; + + // Visites ponderees par age des derniers jours + $query = "SELECT id_article, visites, (TO_DAYS(now())-TO_DAYS(date)) AS age FROM spip_visites_articles WHERE date > DATE_SUB(NOW(), INTERVAL 30 DAY)"; $result = spip_query($query); + while ($row = mysql_fetch_array($result)) { $id_article = $row['id_article']; - $referers = $row['referers']; $visites = $row['visites']; - - $popularite = intval(10 * sqrt(sqrt($referers + 1)) * $visites); - $popularite_update[$popularite][] = $id_article; - if ($max < $popularite) $max = $popularite; + $age = $row['age']; + + if ($age > $age_max) $age_max = $age; + + $valeurs[$id_article]['valeur'] = $valeurs[$id_article]['valeur'] + ($visites/($age+$diff))*$diff; + $valeurs[$id_article]['visites'] = $valeurs[$id_article]['visites'] + $visites ; + + $tous_articles[$id_article] = $id_article; } + + // Visites ponderees par age dans l'absolu + $col_age = "(LEAST((TO_DAYS(now())-TO_DAYS(date)),(DAYOFMONTH(now())-DAYOFMONTH(date))+30.4368*(MONTH(now())-MONTH(date))+365.2422*(YEAR(now())-YEAR(date))))"; + $query = "SELECT id_article, visites, $col_age AS age FROM spip_articles WHERE statut = 'publie'"; + $result = spip_query($query); - // Mise a jour des valeurs de referers et popularite - if (is_array($popularite_update)) { - // Normalisation avant (limiter l'influence des visites recentes) - if ($max < 100) $max = 100; - - while (list($popularite, $articles) = each($popularite_update)) { - $query = "UPDATE spip_articles SET popularite = popularite + $popularite * 100 / $max ". - "WHERE id_article IN (".join(', ', $articles).")"; - $result = spip_query($query); - } - - // Normalisation apres - $query = "SELECT MAX(popularite) AS max FROM spip_articles"; + while ($row = mysql_fetch_array($result)) { + $id_article = $row['id_article']; + $visites = $row['visites'] - $valeurs[$id_article]['visites']; + $age = intval($row['age']) + $diff; + $periode = $age - $age_max; + + if ($periode < 1) $periode = 1; + if ($age < 1) $age = 1; + + $valeur = $visites / ($age * $periode) * $diff; + $valeurs[$id_article]['valeur'] = $valeurs[$id_article]['valeur'] + $valeur; + + $tous_articles[$id_article] = $id_article; + } + + if ($tous_articles) { + $tous_articles = join(",", $tous_articles); + + // Visites surponderees des referers + $query = "SELECT id_article, SUM(visites) AS externes, MAX((TO_DAYS(now())-TO_DAYS(date))) AS age ". + "FROM spip_referers_articles WHERE date > DATE_SUB(NOW(), INTERVAL 15 DAY) GROUP BY id_article"; $result = spip_query($query); - if ($row = mysql_fetch_array($result)) { - $max = $row['max']; - if ($max > 100) { - $query = "UPDATE spip_articles SET popularite = popularite * 100 / $max"; + + while ($row = mysql_fetch_array($result)) { + $id_article = $row['id_article']; + $age = $row['age']; + if ($age < 1) $age = 1; + $externes = ($row['externes']) * $coeff_referer; + $visites = $valeurs[$id_article]['valeur']; + $nouvelle_valeur = $externes + $visites; + if ($nouvelle_valeur > $max_valeur) $max_valeur = $nouvelle_valeur; + $valeurs[$id_article]['valeur'] = $nouvelle_valeur; + } + + while (list($id_article) = each ($valeurs) AND $max_valeur > 0) { + $valeur = $valeurs[$id_article]['valeur']; + $popularite = round(sqrt((($valeur) / $max_valeur)) * 100); + $popularite_update[$popularite][] = $id_article; + } + + if (is_array($popularite_update)) { + while (list($popularite, $articles) = each($popularite_update)) { + $articles = join(",",$articles); + $query = "UPDATE spip_articles SET popularite = $popularite ". + "WHERE id_article IN ($articles)"; $result = spip_query($query); } - } + } } - supprimer_referers(); supprimer_referers("article"); } diff --git a/ecrire/statistiques_articles.php3 b/ecrire/statistiques_articles.php3 index c2e0a77441..550f60cc42 100644 --- a/ecrire/statistiques_articles.php3 +++ b/ecrire/statistiques_articles.php3 @@ -45,7 +45,7 @@ if ($activer_statistiques_ref == "oui"){ if ($critere == "referers"){ echo propre("Les «accès directs sur la page» sont le nombre de visiteurs arrivés directement {à l'intérieur} du site depuis un lien extérieur, sans passer par la page d'accueil. Plus une page de votre site est référencée sur des sites à fort traffic, plus le nombre d'arrivées directes sur cette page sera important.")."<p>"; afficher_articles("Les articles récents (3 mois) les plus référencés", -"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ". +"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ". "FROM spip_articles WHERE visites > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY referers DESC LIMIT 0,100", true); } else if ($critere == "popularite"){ @@ -54,18 +54,18 @@ else if ($critere == "popularite"){ "Un article devient donc «populaire» lorsqu'il fait l'objet d'un référencement ". "sur d'autres sites et lorsqu'il est dernièrement très visité.")."<p>"; afficher_articles("Les articles récents (3 mois) les plus populaires", -"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ". +"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ". "FROM spip_articles WHERE popularite > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY popularite DESC LIMIT 0,100", true); afficher_articles("Les articles les plus populaires depuis le début", -"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ". +"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ". "FROM spip_articles WHERE popularite > 0 ORDER BY popularite DESC LIMIT 0,100", true); } else{ afficher_articles("Les articles récents (3 mois) les plus visités", -"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ". +"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ". "FROM spip_articles WHERE visites > 0 AND date>DATE_SUB('$date',INTERVAL 90 DAY) ORDER BY visites DESC LIMIT 0,100", true); afficher_articles("Les articles les plus visités depuis le début", -"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, referers, id_rubrique, statut ". +"SELECT id_article, surtitre, titre, soustitre, descriptif, chapo, date, visites, popularite, id_rubrique, statut ". "FROM spip_articles WHERE visites > 0 ORDER BY visites DESC LIMIT 0,100", true); } diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3 index bc8affc27a..6e12397e5e 100644 --- a/inc-calcul-squel.php3 +++ b/inc-calcul-squel.php3 @@ -367,6 +367,10 @@ function parser_boucle($texte, $id_parent) { if ($type == 'documents' AND $col == 'extension') { $col_table = 'types_d'; } + // HACK : selection des documents selon mode 'image' (a creer en dur dans la base) + else if ($type == 'documents' AND $col == 'mode' AND $val == 'image') { + $val = 'vignette'; + } // Cas particulier : lier les articles syndiques au site correspondant else if ($type == 'syndic_articles') $col_table = 'source'; -- GitLab