You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
statistiques/stats_pipelines.php

242 lines
7.0 KiB
PHP

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

<?php
/**
* Déclarations d'autorisations et utilisations de pipelines
*
* @plugin Statistiques pour SPIP
* @license GNU/GPL
* @package SPIP\Stats\Pipelines
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compter les visites sur les pages HTML
*
* Uniquement si les statistiques sont activées dans la configuration :
* - permet de compter par défaut toutes les pages de type HTML
* - sauf si on explicite, pour une page donnée, l'entête
* header `X-Spip-Visites` à `oui` ou `non`.
* Indiquer `oui` pour forcer le comptage de la page, ou `non` pour au contraire l'éviter
*
* @uses public_stats_dist() si la page doit être comptée.
* @pipeline affichage_entetes_final
* @param array $entetes liste des entêtes de la page
* @return array
**/
function stats_affichage_entetes_final($entetes) {
if (
isset($GLOBALS['meta']['activer_statistiques']) and $GLOBALS['meta']['activer_statistiques'] != 'non'
and !defined('_STATS_INHIB_COMPTER_VISITES_AFFICHAGE_ENTETES_FINAL')
) {
$html = preg_match(',^\s*text/html,', $entetes['Content-Type']);
// decomptage des visites, on peut forcer a oui ou non avec le header X-Spip-Visites
// par defaut on ne compte que les pages en html (ce qui exclue les js,css et flux rss)
$spip_compter_visites = $html ? 'oui' : 'non';
if (isset($entetes['X-Spip-Visites'])) {
$spip_compter_visites = in_array($entetes['X-Spip-Visites'], ['oui', 'non'])
? $entetes['X-Spip-Visites']
: $spip_compter_visites;
unset($entetes['X-Spip-Visites']);
}
// Gestion des statistiques du site public
if ($spip_compter_visites != 'non') {
$stats = charger_fonction('stats', 'public');
$stats();
}
}
return $entetes;
}
/**
* Ajouter un header Referrer-Policy sur les pages des stats
* @param array $entetes
* @return array
*/
function stats_affichage_entetes_final_prive($entetes) {
if (in_array(_request('exec'), ['stats_referers', 'stats_visites', 'stats_repartition', 'stats_lang'])) {
$entetes['Referrer-Policy'] = 'origin-when-cross-origin';
}
return $entetes;
}
/**
* Compléter des pages de l'espace privé
*
* - Ajoute les formulaire de configuration des statistiques dans les configurations avancées
* - Ajoute les formulaire de suppression des statistiques dans la maintenance technique
*
* @pipeline affiche_milieu
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function stats_affiche_milieu($flux) {
// afficher le formulaire de configuration (activer ou desactiver les statistiques).
if ($flux['args']['exec'] == 'configurer_avancees') {
$flux['data'] .= recuperer_fond(
'prive/squelettes/inclure/configurer',
['configurer' => 'configurer_compteur']
);
}
// afficher le formulaire de suppression des visites (configuration > maintenance du site).
if ($flux['args']['exec'] == 'admin_tech') {
$flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_stats_archiver', []);
$flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_effacer_stats', []);
}
return $flux;
}
/**
* Ajoute les boutons d'administration indiquant la popularité et les visites d'un objet
*
* @uses admin_stats()
* @pipeline formulaire_admin
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function stats_formulaire_admin($flux) {
if (
isset($flux['args']['contexte']['objet'])
and $objet = $flux['args']['contexte']['objet']
and isset($flux['args']['contexte']['id_objet'])
and $id_objet = $flux['args']['contexte']['id_objet']
) {
if ($l = admin_stats($objet, $id_objet, defined('_VAR_PREVIEW') ? _VAR_PREVIEW : '')) {
$btn = recuperer_fond('prive/bouton/statistiques', [
'visites' => $l[0],
'popularite' => $l[1],
'statistiques' => $l[2],
]);
$x = '<!--extra-->';
$flux['data'] = str_ireplace($x, $btn . $x, $flux['data']);
}
}
return $flux;
}
/**
* Calcule les visites et popularite d'un objet éditorial
*
* @note
* Actuellement uniquement valable pour les articles.
*
* @param string $objet
* @param int $id_objet
* @param string $var_preview
* Indique si on est en prévisualisation : pas de statistiques dans ce cas.
* @return false|array
* - false : pas de statistiques disponibles
* - array : Tableau les stats `[visites, popularité, url]`
**/
function admin_stats($objet, $id_objet, $var_preview = '') {
if (
$GLOBALS['meta']['activer_statistiques'] != 'non'
and $objet == 'article'
and !$var_preview
and autoriser('voirstats')
) {
$row = sql_fetsel('visites, popularite', 'spip_articles', "id_article=$id_objet AND statut='publie'");
if ($row) {
return [
intval($row['visites']),
ceil($row['popularite']),
str_replace('&amp;', '&', generer_url_ecrire_statistiques($id_objet))
];
}
}
return false;
}
/**
* Génère URL de la page dans l'espace privé permettant de visualiser les statistiques d'un article
*
* @param int $id_article
* @return string URL
**/
function generer_url_ecrire_statistiques($id_article) {
return generer_url_ecrire('stats_visites', "objet=article&id_objet=$id_article");
}
/**
* Ajoute le cron de traitement des statistiques et calcul des popularités
*
* @pipeline taches_generales_cron
* @param array $taches_generales
* Tableau `[nom de la tache => intervalle en secondes]`
* @return array
* Tableau `[nom de la tache => intervalle en secondes]`
**/
function stats_taches_generales_cron($taches_generales) {
// stats : toutes les 5 minutes on peut vider un panier de visites
if (
isset($GLOBALS['meta']['activer_statistiques'])
and $GLOBALS['meta']['activer_statistiques'] == 'oui'
) {
$taches_generales['visites'] = 300;
$taches_generales['popularites'] = 7200; # calcul lourd
}
return $taches_generales;
}
/**
* Lister les metas de statistiques et leurs valeurs par défaut
*
* @pipeline configurer_liste_metas
* @param array $metas
* Couples nom de la méta => valeur par défaut
* @return array
* Couples nom de la méta => valeur par défaut
*/
function stats_configurer_liste_metas($metas) {
$metas['activer_statistiques'] = 'non';
$metas['activer_captures_referers'] = 'non';
$metas['activer_referers'] = 'oui';
return $metas;
}
/**
* Afficher le lien vers la page de statistique sur la vue d'un article dans l'espace privé
*
* @pipeline boite_infos
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function stats_boite_infos($flux) {
if ($GLOBALS['meta']['activer_statistiques'] == 'oui') {
if (
$flux['args']['type'] == 'article'
and $id_article = $flux['args']['id']
and autoriser('voirstats', 'article', $id_article)
) {
$visites = sql_getfetsel('visites', 'spip_articles', 'id_article=' . intval($id_article));
if ($visites > 0) {
$icone_horizontale = chercher_filtre('icone_horizontale');
$flux['data'] .= $icone_horizontale(
generer_url_ecrire('stats_visites', "objet=article&id_objet=$id_article"),
_T('statistiques:icone_evolution_visites', ['visites' => $visites]),
'statistique-24.png'
);
}
}
}
return $flux;
}