[RÉSOLU ~ à moitité] Compteur de mots pour les articles

GzygGzyg Member
janvier 2014 modifié dans Entraide
Bonsoir,

J'aimerais savoir comment récupérer et afficher (en front-end) le nombre de mots d'un article ?


Merci


à plus,

Gzyg

Réponses

  • spxtynimce le fait de façon native (compter les mots). Après, il suffit de l'ajouter en manuellement en bas de chaque article.
  • Merci Jerry mais je ne vais pas utiliser un (gros) plugin juste pour ça (je ne me sers pas de l'éditeur je tape tout en html) surtout si c'est pour ensuite faire l'affichage a la mano. ;)

    Je pensais à une petite fonction php comme celle que j'avais trouvée pour mon WordPress.

    Un truc du genre :
    [== PHP ==]
    function wcount(){
        ob_start();
        the_content();
        $content = ob_get_clean();
        return sizeof(explode(" ", $content));
    }
    
    

    ou the_content serait remplacé par artContent puis un echo wcount dans le postinfos...

    :)


    à plus,

    Gzyg
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Dans ces conditions, il vaudrait mieux faire :
    function wcount($content){
        return count(explode(" ",strip_tags( $content)));
    }
    
    (Edit : il faut supprimer les balises html et php avec strip_tags() pour que le décompte soit juste).
    sizeof étant un alias de count, autant utiliser la fonction principale.
    Tu peux placer cette fonction dans le header de ton thème avant le doctype entre les deux balises php du début et après le exit();
    <?php if (!defined('PLX_ROOT')) exit();
    function wcount($content){
        return count(explode(" ", strip_tags( $content)));
    }  ?>
    

    Tu pourras ensuite l'appeler où bon te semble en prenant soin de mettre un ob_start et un ob_get_clean (avant et après) si tu utilises la classe plxShow pour afficher le contenu.
    Par exemple, dans le fichier article :
    <?php include(dirname(__FILE__).'/header.php'); ?>
    
    <section>
    
    	<div class="content">
    
    		<div class="width-sidebar">
    
    			<article role="article" id="post-<?php echo $plxShow->artId(); ?>">
    
    				<header>
    					<h1>
    						<?php $plxShow->artTitle(''); ?>
    					</h1>
    					<p>
    						<?php $plxShow->lang('WRITTEN_BY') ?> <?php $plxShow->artAuthor(); ?> -
    						<?php $plxShow->artDate('#num_day #month #num_year(4)'); ?> -
    						<?php $plxShow->artNbCom(); ?>
    					</p>
    				</header>
    
    				<section>
    					<?php ob_start();
                                                $plxShow->artContent();
                                                $c = ob_get_clean();
                                                echo $c;
                                                echo '<p>Nombre de mots : '.wcount($c).'</p>';
                                             ?>
    				</section>
    
    				<footer>
    					<p>
    						<?php $plxShow->lang('CLASSIFIED_IN') ?> : <?php $plxShow->artCat(); ?> -
    						<?php $plxShow->lang('TAGS') ?> : <?php $plxShow->artTags(); ?>
    					</p>
    				</footer>
    
    			</article>
    
    			<?php $plxShow->artAuthorInfos('<div class="author-infos">#art_authorinfos</div>'); ?>
    
    			<?php include(dirname(__FILE__).'/commentaires.php'); ?>
    
    		</div>
    
    		<?php include(dirname(__FILE__).'/sidebar.php'); ?>
    
    	</div>
    
    </section>
    
    <?php include(dirname(__FILE__).'/footer.php'); ?>
    
    
  • Je teste imédiatement et je te dis ce que ça donne.

    Merci de t'être penché dessus, en tout cas. :)


    à plus,

    Gzyg
  • Re,

    Bon ça fonctionne bien mais (y'a toujours un mais :D ) en fait je souhaite m'en servir comme indicateur de temps de lecture (pour de longs textes) et du coup j'aurais voulu pouvoir l'afficher avant l'article plutôt qu'à la fin... Idéalement sur la home, en dessous du titre avec les autres infos relatives à l'article.


    à plus,

    Gzyg
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Ce n'était qu'un exemple. Tu peux placer le résultat sur n'importe quel fichier vu que tu as inclus la fonction dans le header. Adapter bien sûr ce que tu affiches.
    Par exemple, sur la home :
    <?php include(dirname(__FILE__).'/header.php'); ?>
    
    <section>
    
    	<div class="content">
    
    		<div class="width-sidebar">
    
    			<?php while($plxShow->plxMotor->plxRecord_arts->loop()):
                                ob_start();
                                $plxShow->artContent();
                                $c = ob_get_clean();
                            ?>
    
    			<article role="article" id="post-<?php echo $plxShow->artId(); ?>">
    
    				<header>
    					<h1>
    						<?php $plxShow->artTitle('link'); ?>
    					</h1>
    					<p>
    						<?php $plxShow->lang('WRITTEN_BY'); ?> <?php $plxShow->artAuthor() ?> -
    						<?php $plxShow->artDate('#num_day #month #num_year(4)'); ?> -
    						<?php $plxShow->artNbCom(); ?>
                                                    <?php echo '<br/>Nombre de mots : '.wcount($c);
    					</p>
    				</header>
    
    				<section>
    					<?php $plxShow->artChapo(); ?>
    				</section>
    
    				<footer>
    					<p>
    						<?php $plxShow->lang('CLASSIFIED_IN') ?> : <?php $plxShow->artCat(); ?> -
    						<?php $plxShow->lang('TAGS') ?> : <?php $plxShow->artTags(); ?>
    					</p>
    				</footer>
    
    			</article>
    
    			<?php endwhile; ?>
    
    			<div id="pagination">
    				<?php $plxShow->pagination(); ?>
    			</div>
    
    			<div class="rss">
    				<?php $plxShow->artFeed('rss',$plxShow->catId()); ?>
    			</div>
    
    		</div>
    
    		<?php include(dirname(__FILE__).'/sidebar.php'); ?>
    
    	</div>
    
    </section>
    
    <?php include(dirname(__FILE__).'/footer.php'); ?>
    

    Tu as l'idée. A toi de l'adapter... ]:D
  • Superbe Jerry Wham, merci beaucoup. :cool:

    En fait je bloquais sur l'emplacement de cette partie
    [== PHP ==]
    ob_start();
    $plxShow->artContent();
    $c = ob_get_clean();
    

    Encore merci,


    à plus,

    Gzyg
  • En fait, il y a une fonction native en php (comme quoi, il faut toujours lire et relire la doc :P ) :
    ob_start();
    $plxShow->artContent();
    $c = ob_get_clean();
    
    echo str_word_count($c);
    
  • GzygGzyg Member
    janvier 2014 modifié
    :) J'ai beau la ire et la relire, j'avoue que je ne comprends pas grand-chose à php... :(

    Sinon si tu avais une idée pour l'utiliser également dans une page statique (je bloque sur cet aspect puisque forcément la boucle des articles n'est pas faite pour les pages statiques) ?

    Typiquement sur cette page, pour compléter le tableau (et ensuite le rendre triable avec tablesorter)...

    Je suppose que ce serait plus pratique d'avoir un compteur directement au niveau de l'admin, à l'enregistrement d'un article, de façon à avoir une variable genre art_count à dispatcher comme c'est le cas pour les tags, les catégories, par exemple dans la fonction lastArtList que j'utilise pour ce tableau...


    edit : Par contre cette nouvelle fonction me trouve près d'un tiers de mots en plus !! 8)
    L'autre semblait plus réaliste (à peu près le même nombre qu'avec openoffice, l'éditeur gedit ou la commande wc -w sous linux).


    à plus,

    Gzyg
  • C'est parce que tu utilises de l'utf-8. Essaie ça plutôt (trouvée dans les commentaires de la doc, avec en plus les commentaires en français) :
        /*
         * Explications du masque pour preg_match_all.
         *
         * La fonction str_word_count standard considère qu'un mot est
         * une séquence de caractères qui contient tous les caractères
         * alphabétiques, et qui peut contenir, mais pas commencer
         * par "'" et "-".
         *
         * Avec Unicode et UTF-8, une lettre peut être un caractères
         * ASCII non accentué tel que "e" ou "E", mais aussi un "é" ou
         * un "É", lequel peut se représenter sous la forme de deux
         * caractères : d'abord le "E" non accentué, puis l'accent tout
         * seul. Une lettre "E" ou "É" fait partie de la classe « L »,
         * un accent de la classe « Mn ».
         *
         * Par ailleurs, "-" n'est plus le seul trait d'union possible.
         * Plutôt que de les lister individuellement, j'ai choisi de
         * tester les caractères de la classe « Pd ». Un inconvénient
         * est que cela inclut aussi le tiret cadratin et d'autres,
         * mais cet inconvénient existait déjà avec str_word_count et
         * le tiret ascii, et en outre il ne concerne pas le français
         * (contrairement à l'anglais, il y a toujours des espaces
         * autour de ces tirets).
         *
         * Enfin, "'" n'est pas non plus la seule apostrophe possible.
         * Mais contrairement aux tirets je teste juste l'apostrophe
         * typographique U+2019 à part au lieu de tester la classe « Pf »
         * car cette dernière contient trop de signes de ponctuation
         * à exclure de la définition d'un mot.
         *
         * Un mot commence donc par une lettre \\p{L}, éventuellement
         * accentuée (suivie par un nombre quelconque de \\p{Mn}), et
         * ensuite on peut rencontrer un nombre quelconques d'autres
         * lettres (\\p{L} et \\p{Mn}), de tirets (\\p{Pd}) ou d'apostrophes
         * (' et \\x{2019}). Tout ceci, bien sûr, dans un masque compatible
         * avec UTF-8 (/u à la fin).
         *
         * Pour les références, voir :
         * http://fr2.php.net/manual/fr/regexp.reference.php #regexp.reference.unicode
         * http://fr2.php.net/manual/fr/reference.pcre.pattern.modifiers.php
         */
        define("WORD_COUNT_MASK", "/\\p{L}[\\p{L}\\p{Mn}\\p{Pd}'\\x{2019}]*/u");
    
        function str_word_count_utf8($str)
        {
            return preg_match_all(WORD_COUNT_MASK, $str, $matches);
        } 
    
  • Pour la page statique, ce que tu voudrais, si j'ai su lire entre les lignes, serait d'avoir le nombre de mots à côté du titre de l'article que tu n'as pas encore affiché c'est ça ?

    Si c'est ça, je ne pense pas qu'une simple fonction fasse l'affaire à elle seule. Il faudrait écrire un plugin je pense.
  • GzygGzyg Member
    janvier 2014 modifié
    Pour l'utf8, je vais regarder ça. :)

    Pour la page statique oui, c'est ça, une colonne supplémentaire avec le nombre de mots par article mais effectivement ça n'a pas l'air simple... :/

    À moins qu'une future version de PluXml embarque un compteur natif... ]:D :D
    Ha m***** ! Nowel est déjà passé... :lol:


    à plus,

    Gzyg
  • Question subsidiaire : ce n'est pas le plugin archive que tu utilises par hasard ?
  • GzygGzyg Member
    janvier 2014 modifié
    Non, c'est la fonction $plxShow->lastArtList qui possède beaucoup de belles choses sauf ce fameux compteur... :)

    Avec le plugin Archives (que j'ai essayé) je n'avais ni le nombre de mots (forcément) ni le nombre de commentaires.

    edit ta première fonction est celle qui se rapproche le plus d'un comptage manuel :)
    C'est vrai aussi que j'abuse des balises persos (des span class="ceci ou cela"), ça joue peut-être, sans compter les nombreuses ponctuations tapées directement en code html (les esperluettes, les guillemets, les espaces insécables, les tirets demi-cadratins, etc...).


    à plus,

    Gzyg
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Oui, je viens d'y penser aux balises. Avant de passer ta chaine à la fonction, passe la d'abord par la fonction strip_tags().
    define("WORD_COUNT_MASK", "/\\p{L}[\\p{L}\\p{Mn}\\p{Pd}'\\x{2019}]*/u");
        
        function str_word_count_utf8($str)
        {
            return preg_match_all(WORD_COUNT_MASK, $str, $matches);
        } 
    
        ob_start();
        $plxShow->artContent();
        $c = ob_get_clean();
    
        $str =  strip_tags($c);
        echo str_word_count_utf8($str);
    
    
  • Bien vu, c'est nettement mieux (et surtout plus juste) ! Merci. :)


    à plus,

    Gzyg
Connectez-vous ou Inscrivez-vous pour répondre.