Plugins - Statistiques

FrédéricFrédéric Member
novembre 2009 modifié dans Modifications
Bonjours,

Voici un petit plugins qui permets d'afficher le nombre de visites et les pages vues sur votre blog.

091122095047737785.png

A dé-zipper dans le dossier plugins préalablement créé.

L'installation et commenté dans le fichier counter.php (le seul ^^)

A voir par la suite pour afficher le résultat plus proprement avec une fonction global.

Testé sur Pluxml beta 4.2.

Pour le tester: statistiques.zip - 3Ko
«1

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour mouffin

    Ton script présente quelques inconvénients:
    les statistiques sont sauvegardées dans 4 fichiers différents. Ce qui implique 4 lectures + 4 écritures, soit 8 accès à des fichiers. On peut très facilement optimiser tout ça en seulement 1 lecture et 1 écriture.
    En plus XML est là pour nous aider.

    Je te propose de tester le script suivant. Il est codé dans le style "pluxml" et utilise les ressources disponibles de pluxml.

    Pour l'installer

    1) Créer un dossier plugins à la racine du pluxml
    2) Dans le dossier plugins créer un dossier stats
    3) Créer dans ce dossier un fichier stats.php et coller dedans le code ci dessous
    <?php
    /**
     * Classe plxStats 
     *
     * @version 1.0
     * @package PLX
     * @author	Stephane F
     **/
    class plxStats {
    
    	var $filename = null; # nom du fichier contenant les statistiques
    	var $aStats = array(); # données statistiques
    	var $sessionTime = 15; # durée d'une visite en minute vant expiration
    
    	/**
    	 * Constructeur qui initialise certaines variables de classe
    	 * et qui lance les traitements de prise en compte des statistiques
    	 *
    	 * @param	null
    	 * @return	null
    	 * @author	Stephane F
    	 **/	
    	function plxStats() {
    	
    		$this->filename = PLX_ROOT.'plugins/stats/stats.xml'; # emplacement du fichier des stats
    	
    		$this->_getStatiques($filename); # récuperation des stats
    		$this->_cleanVisits(); # suppression des anciens visiteurs 
    		$this->_addVisitor(); # ajoute le nouveau visiteur et gère les compteurs
    		$this->_editStats($filename); # sauvegarde des stats
    	}
    	
    	#------------------
    	# Méthodes privées
    	#------------------
    	
    	/**
    	 * Méthode qui parse le fichier des statistiques et qui alimente
    	 * le tableau aStats
    	 *
    	 * @param	null
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	function _getStatiques() {
    
    		if(!is_readable($this->filename)) return;
    			
    		# Mise en place du parseur XML
    		$data = implode('',file($this->filename));
    		$parser = xml_parser_create(PLX_CHARSET);
    		xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
    		xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
    		xml_parse_into_struct($parser,$data,$values,$iTags);
    		xml_parser_free($parser);
    		# Recuperation des valeurs de nos champs XML
    		$this->aStats['views_today'] = array( // total de pages vues aujourd'hui
    				'date' 		=> (isset($values[ $iTags['views_today'][0] ]['attributes']['date'])?$values[ $iTags['views_today'][0] ]['attributes']['date']:date('Ymd')),
    				'counter'	=> (isset($values[ $iTags['views_today'][0] ]['value'])?intval($values[ $iTags['views_today'][0] ]['value']):0)
    			);
    		$this->aStats['views_total'] = isset($values[ $iTags['views_total'][0] ]['value'])?intval($values[ $iTags['views_total'][0] ]['value']):0; // total de pages vues
    		$this->aStats['visitors'] = isset($values[ $iTags['visitors'][0] ]['value'])?intval($values[ $iTags['visitors'][0] ]['value']):0; // nombre total de visiteurs 
    		
    		# On verifie qu'il existe des tags "online"
    		if(isset($iTags['online'])) {
    			# On compte le nombre de tags "online"
    			$nb = sizeof($iTags['online']);
    			# On boucle sur $nb
    			for($i = 0; $i < $nb; $i++) {
    				$this->aStats['online'][ $values[ $iTags['online'][$i] ]['attributes']['ip'] ] = $values[ $iTags['online'][$i] ]['value'];
    			}
    		}
    	}
    	
    	/**
    	 * Méthode qui sauvegarde les statistiques dans le fichier xml
    	 * le tableau aStats
    	 *
    	 * @param	null
    	 * @return	null
    	 * @author	Stephane F
    	 **/	
    	function _editStats() {
    
    		# Début du fichier XML
    		$xml = "<?xml version='1.0' encoding='".PLX_CHARSET."'?>\n";
    		$xml .= "<document>\n";
    		$xml .= "\t<views_today date=\"".$this->aStats['views_today']['date']."\">".$this->aStats['views_today']['counter']."</views_today>\n";		
    		$xml .= "\t<views_total>".$this->aStats['views_total']."</views_total>\n";
    		$xml .= "\t<visitors>".$this->aStats['visitors']."</visitors>\n";
    		if ($this->aStats['online']) {
    			foreach($this->aStats['online'] as $ip => $time) {
    				$xml .= "\t<online ip=\"".$ip."\">".$time."</online>\n";
    			}
    		}
    		$xml .= "</document>";
    		# Sauvegarde du fichier
    		plxUtils::write($xml, $this->filename);
    	}
    	
    	/**
    	 * Méthode qui supprime les anciens visiteurs si la durée de la visite
    	 * est expirée
    	 *
    	 * @param	null
    	 * @return	null
    	 * @author	Stephane F
    	 **/	
    	function _cleanVisits() {
    	
    		if ($this->aStats['online']) {
    			foreach($this->aStats['online'] as $ip => $time) {
    				if(time() - $time >= $this->sessionTime * 60)
    					unset($this->aStats['online'][$ip]); # suppresion de l'ancien visiteur
    			}
    		}
    		
    	}
    	
    	/**
    	 * Méthode qui ajoute un nouveau visiteur et qui incrémente les différents
    	 * compteurs de statistiques
    	 *
    	 * @param	null
    	 * @return	null
    	 * @author	Stephane F
    	 **/	
    	function _addVisitor() {
    	
    		if (isset($this->aStats['online'][plxUtils::getIp()])) {
    			if (time() - $this->aStats['online'][plxUtils::getIp()] >= $this->sessionTime * 60) {
    				$this->aStats['online'][plxUtils::getIp()] = time(); 
    				$this->aStats['visitors']++; 
    			}
    		}
    		else {
    			$this->aStats['online'][plxUtils::getIp()] = time(); 
    			$this->aStats['visitors']++; 
    		}
    
    		# nombre de visiteurs du jour
    		if ($this->aStats['views_today']['date'] == date('Ymd'))
    			$this->aStats['views_today']['counter']++;
    		else {
    			$this->aStats['views_today']['date'] = date('Ymd');
    			$this->aStats['views_today']['counter']=1;
    		}
    		
    		# nombre total de pages vues
    		$this->aStats['views_total']++; 
    
    	}
    	
    	#-------------------
    	# Méthodes publiques
    	#-------------------
    	
    	/**
    	 * Méthode qui affiche le compteur du nombre total de visiteurs
    	 *
    	 * @param	null
    	 * @return	stdout
    	 * @author	Stephane F
    	 **/	
    	function TotalVisitors() {
    		echo $this->aStats['visitors'];
    	}
    	
    	/**
    	 * Méthode qui affiche le compteur du visiteurs en ligne
    	 *
    	 * @param	null
    	 * @return	stdout
    	 * @author	Stephane F
    	 **/	
    	function OnlineVisitors() {
    		echo sizeof($this->aStats['online']);
    	}
    	
    	/**
    	 * Méthode qui affiche le compteur du nombre de pages vues aujourd'hui
    	 *
    	 * @param	null
    	 * @return	stdout
    	 * @author	Stephane F
    	 **/
    	function TodayViews() {
    		echo $this->aStats['views_today']['counter'];
    	}
    	
    	/**
    	 * Méthode qui affiche le compteur du nombre total de pages vues
    	 *
    	 * @param	null
    	 * @return	stdout
    	 * @author	Stephane F
    	 **/	
    	function TotalViews() {
    		echo $this->aStats['views_total'];
    	}	
    }
    
    #-----------------------------------------------
    # création d'une instance de la classe plxStats
    #-----------------------------------------------
    $plxStats = new plxStats();
    ?>
    
    4) Éditer le fichier header.php du thème

    En dessous de la ligne
    <?php if(!defined('PLX_ROOT')) exit; ?>
    
    Ajouter
    <?php include_once(PLX_ROOT.'plugins/stats/stats.php'); ?>
    
    5) Pour afficher les statistiques coller le code ci-dessous par exemple dans le fichier sidebar.php du thème
    <h2>Statistiques</a></h2>
    	<ul>
    		<li>Total des pages vues: <?php $plxStats->TotalViews() ?></li>
    		<li>Pages vues aujourd'hui:  <?php $plxStats->TodayViews() ?></li>
    		<li>Visiteurs connectés: <?php $plxStats->OnlineVisitors() ?></li>
    		<li>Nombre de visiteurs: <?php $plxStats->TotalVisitors() ?></li>
    	</ul>
    
    Je n'ai pas le temps de tester à fond ce script, donc s'il y a des erreurs ou des aménagements, ne pas hésiter à en parler ici.


    Stéphane

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci Stéphane de t'être penché sur ce plugins.

    Voici l'erreur générée:
    Total des pages vues:
    Fatal error: Call to a member function TotalViews() on a non-object in /Applications/MAMP/htdocs/pluxml/themes/newspro/sidebar.php on line 15
    
    J'ai enlevé chaque ligne qui affiche chaque stats dans la sidebar jusqu'à afficher la dernière et il en retourne à chaque fois un Fatal error: Call to a member function LAVARIABLE() on a non-object in
  • StéphaneStéphane Member, Former PluXml Project Manager
    As-tu bien ajouter la ligne suivante dans le header.php de ton thème
    <?php include_once(PLX_ROOT.'plugins/stats/stats.php'); ?>
    

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Oui tout a fais, tu as eu le temps de tester de ton coté ?
  • StéphaneStéphane Member, Former PluXml Project Manager
    Je n'ai aucun problème d'affichage de mon coté.

    Tu peux stp me zipper ton pluxml modifié que je regarde en me l'envoyant à stephane @ pluxml.org

    Merci

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Ok Stéphane j'ai trouvé mon erreur, je n'avais pas créé de dossier stats, ce qui fais que stats.php étais directement dans plugins/ ^^

    Du coup ca marche super bien et le code et bien plus propre c'est sur.

    Encore merci.

    Juste une question, dans un autre topic j'avais demandé si la gestion des plugins à étais étudié, elle l'est ?
  • StéphaneStéphane Member, Former PluXml Project Manager
    Oui c'est en étude.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Bonsoir,

    J'ai une Pluxml blog beta 4 - ça va marcher aussi ?
    D'avance merci
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour zorn

    ça devrait fonctionner oui.

    Stéphane

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci Stéphane.

    Super, je vais essayer :)
  • Bonsoir,

    J'ai cherché dans mon header.php et je trouve pas de PLX_ROOT. Une idée ? Ci dessous le fichier en question. Merci
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    	<title><?php $plxShow->pageTitle(); ?></title>
    	<meta http-equiv="Content-Type" content="text/html; charset=<?php $plxShow->charset(); ?>" />
    	<link rel="stylesheet" type="text/css" href="<?php $plxShow->template(); ?>/style.css" media="screen" />
    	<link rel="alternate" type="application/atom+xml" title="Atom articles" href="./feed.php?atom" />
    	<link rel="alternate" type="application/rss+xml" title="Rss articles" href="./feed.php?rss" />
    	<link rel="alternate" type="application/atom+xml" title="Atom commentaires" href="./feed.php?atom/commentaires" />
    	<link rel="alternate" type="application/rss+xml" title="Rss commentaires" href="./feed.php?rss/commentaires" />
    </head>
    <body>
    <div id="top">
    	<div id="menu">
    		<ul><?php $plxShow->staticList('Home page / Accueil'); ?></ul>
    		<div class="clearer"></div>
    	</div>
    	<div id="header">
    		<div class="logo">
    			<h1><?php $plxShow->mainTitle('link'); ?></h1>
    			<p><?php $plxShow->subTitle(); ?></p>
    		</div>
    	</div>
    </div>
    
  • novembre 2009 modifié
    Rajoute :
    <?php if(!defined('PLX_ROOT')) exit;
    include_once(PLX_ROOT.'/plugins/stats/stats.php'); ?>
    
    Au dessus de :
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
    Tu aura donc ton PLX_ROOT en haut de ton header.
    C'est juste une fonction qui interdit l'appelle directe du fichier (via le navigateur par exemple).
  • StéphaneStéphane Member, Former PluXml Project Manager
    Tout est dit.
    Merci Loup-des-Neiges pour l'explication

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci.
    Cela marche à condition de bien mettre la page stats.php dans le répertoire plugins/stats
    Or dans le post #2, c'est écrit : "2) Créer dans ce dossier un fichier stats.php et coller dedans le code ci dessous"
    Si c'était rectifiable en "2) Créer dans ce dossier un sous dossier stats puis un fichier stats.php et coller dedans le code ci dessous"
    D'où confusion...
    A+
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour zorn

    Effectivement c'est une erreur de ma part dans la procédure. J'ai oublié de mentionner l'étape de création du dossier stats.

    J'ai corrigé la procédure d'installation dans le post #2

    Merci

    Stephane

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Stéphane a écrit:
    ...
    5) Pour afficher les statistiques coller le code ci-dessous par exemple dans le fichier sidebar.php du thème
    <h2>Statistiques</a></h2>
    	<ul>
    		<li>Total des pages vues: <?php $plxStats->TotalViews() ?></li>
    		<li>Pages vues aujourd'hui:  <?php $plxStats->TodayViews() ?></li>
    		<li>Visiteurs connectés: <?php $plxStats->OnlineVisitors() ?></li>
    		<li>Nombre de visiteurs: <?php $plxStats->TotalVisitors() ?></li>
    	</ul>
    
    Bonsoir,

    Question, est ce que je peux coller ce code dans une page normale ou sinon dans une page statique ? J'ai fait quelques essais mais je n'ai pas trouvé comment faire pour que ça marche...
    D'avance merci
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour zorn

    Pour une page normal, non (le php n'est pas interprété dans les pages normales).
    Pour une page statique essaye en rajoutant au début de ta page statique, la ligne suivante
    <?php global $plxStats; ?>
    
    (à vérifier si ça marche - pas sur...)

    Stéphane

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • zornzorn Member
    décembre 2009 modifié
    :)
    Super, ça marche, merci !

    J'ai rajouté mon site dans mon profil : vous pouvez aller jeter un oeil :rolleyes:
  • J'ai un petit problème moi pour séparer les milliers par des espaces. Voici le code en question :
    <?php echo number_format($plxStats->TotalViews(), 0, '.', ' '); ?>
    
    qui rajoute un 0 !
  • Bonjour à tous,
    bravo pour ce petit plugin que j'utilise également .

    J'affiche le nombre de visiteurs en ligne en bas de page, dans le footer, ' x visiteurs en ligne'.
    Je voulais donc que le mot 'visiteur' puisse être mis au singulier dans le cas d'un seul visiteur ;o)

    J'ai donc un peu modifié la fonction OnlineVisitors() ainsi:
    function OnlineVisitors() {
          global $nbtemp;
            echo sizeof($this->aStats['online']);
            if (sizeof($this->aStats['online']) <= 1){$nbtemp = "";} else {$nbtemp = "s";}
        }
    
    A l'endroit où j'affiche les visiteurs en ligne, le mot 'visiteur' est ainsi affiché:
    echo " visiteur".$nbtemp;
    
    Ca fonctionne bien, le 's' s'ajoute à partir de deux visiteurs, cool, non ? ;o).

    Cordialement,
    Ludo
  • @ Ludo_17 : ça m'intéresse, peux tu préciser où il faut ajouter ton code STP ?
    Pour ma part j'ai suivi le tuto et ajouté dans mon footer
    <?php echo "Visiteur".$nbtemp; ?> <?php echo " connecté".$nbtemp; ?> : <?php $plxStats->OnlineVisitors() ?>
    
    mais je préférais avoir l'accord au pluriel
  • Ludo_17Ludo_17 Member
    janvier 2010 modifié
    antistress a écrit:
    @ Ludo_17 : ça m'intéresse, peux tu préciser où il faut ajouter ton code STP ?
    La fonction OnlineVisitors() se trouve dans le fichier stats.php du plugin de Stephane.

    Pour la partie footer, je pense que tu peux concaténer tout ça en écrivant (non testé):
    <?php echo "Visiteur".$nbtemp." connecté".$nbtemp." : ".$plxStats->OnlineVisitors() ?>
    
    Cordialement,
    Ludo

    ps: voilà ce que ça donne sur mon petit blog en construction ;)

    (edit: heureusement qu'on peut modifier les messages... pour corriger les erreurs de bb et les fautes ! :)
  • J'ai jeté un oeil au blog : c'est joli.
    J'ai apprécié les onglets dans l'article sur le simulateur de vol : comment tu as fait ça ?
    Sinon, bravo à toute l'équipe de PluXML - on fait vraiment des beaux sites avec. Faut juste le faire savoir.
  • zorn a écrit:
    J'ai jeté un oeil au blog : c'est joli.
    J'ai apprécié les onglets dans l'article sur le simulateur de vol : comment tu as fait ça ?
    Merci ;). Les onglets : En utilisant un script que j'ai légèrement modifié pour mon site sous guppy et que j'ai mis à disposition ici. Si cela t'intéresse, le script tabberguppy est utilisable tel quel (deux fichiers, un js et un css) pour pluxml, il y a juste besoin de modifier header.php dans le thème utilisé pour intégrer ces fichiers dans l'entête de la page et pour en modifier la balise body.

    La description est sous le lien ci-dessus et si tu télécharges le fichier, tu trouveras un mode d'emploi que j'espère avoir fais le plus clair possible. Sinon, le principe est de scinder un article en plusieurs 'pages' en plaçant le contenu de chacune dans un bloc div. Les onglets sont générés dynamiquement en js. Le bloc div montré est celui de la page choisie. La page fait donc toujours la même taille physiquement mais sa présentation est découpée en pages.

    Cordialement,
    Ludo
  • Ah, Guppy... J'ai du y renoncer cause hébergement à l'époque chez Free...
    Depuis, je m'héberge tout seul (Synology) et c'est beaucoup mieux.
    J'ai un PluXML blog beta 4, j'ai téléchargé et je vais tester - mais pas tout de suite
    Merci et A+
  • Petit soucis avec le compteur:

    Il a tendance à repartir à zéro tout seul apparemment et assez régulièrement. Il semble que ce soit lorsqu'il y a plusieurs visiteurs simultanément en ligne.

    Il avait pourtant dépassé les 140 je crois mais j'étais à peu près le seul à le visiter.

    Est-ce un 'bug' ou est-ce dû à mon hébergeur (on ne sait jamais... avec Free)

    Cordialement,
    Ludo
  • J'ai temporairement remplacé le plugin stats par un compteur fonctionnant différemment et utilisant un fichier texte.
    Comme je suppose qu'il s'agit d'un défaut d'écriture vidant le fichier ou le mettant à zéro, j'aimerais ainsi vérifier que cela ne se produit pas aussi avec celui-ci.
    Je remonterai le résultat ici dans quelques temps (histoire de lever le doute de l'hébergeur).
    Cordialement,
    Ludo
  • antistressantistress Member
    janvier 2010 modifié
    merci ludo_17 et désolé de n'avoir pu tester avant : mon hebergeur était HS
    J'ai donc ceci dans mon footer :
    <?php echo " visiteur".$nbtemp." connecté".$nbtemp." ".$plxStats->OnlineVisitors() ?>
    
    pour autant cela me donne : 3 visiteur connecté (pas de pluriel) :-/
  • antistress a écrit:
    merci ludo_17 et désolé de n'avoir pu tester avant : mon hebergeur était HS
    J'ai donc ceci dans mon footer :
    <?php echo " visiteur".$nbtemp." connecté".$nbtemp." ".$plxStats->OnlineVisitors() ?>
    
    pour autant cela me donne : 3 visiteur connecté (pas de pluriel) :-/
    D'accord, je crois que j'ai commis une erreur en voulant concaténer $plxStats...
    Voici le code que j'ai personnellement ajouté dans le footer :
    <?php
            $plxStats->TotalVisitors();      	// nombre de visiteurs total
            echo " visiteurs | ";
            $plxStats->OnlineVisitors();	//nombre de visiteurs en ligne
           echo " visiteur".$nbtemp;		// j'ajoute un 's' si la valeur du compteur est supérieure à 1
            echo " en ligne   ";
             ?>
    
    Si la fonction OnlineVisitors() du fichier plugins/stats/stats.php a bien été modifiée comme indiqué précédemment, ça doit fonctionner.
    Dans le code ci-dessus, les deux première lignes correspondent à l'affichage du nombre total de visiteur et peuvent être supprimées.

    J'ai rencontré un autre soucis: Le compteur du total des visiteurs s'est remis à zéro plusieurs fois en quelques jours. Du coup, je teste un autre compteur (plus simple avec un fichier texte) car j'ai un doute sur mon hébergeur.

    J'espère que ça fonctionnera pour toi,
    Cordialement,
    Ludo
  • Merci beaucoup, ça marche impec :-)
Connectez-vous ou Inscrivez-vous pour répondre.