Blog momentaneamente fermo, riprenderò le pubblicazioni quando la mia vita sarà meno frenetica... :D

domenica 5 giugno 2011

Contatore visite per post

Ho impiegato diversi giorni per trovare un modo di contare le letture dei singoli post del blog e condividere questa informazione con i lettori. Purtroppo blogger non mette a disposizione nulla di ufficiale e tutte le risorse trovate in rete fanno riferimento a script di terze parti. Il guaio di queste soluzioni è che il blogger non ha alcun controllo sullo script installato chissà dove (e dei risultati delle statistiche) e spesso i file a cui si fa riferimento spariscono senza preavviso.


In tutti i casi, il codice da inserire nel template di blogger è sempre lo stesso: un elemento script nel punto dove si vuole visualizzare il contatore, il cui attributo src contiene l'indirizzo allo script remoto. Basta andare in Design - Modifica HTML - Espandi i modelli widget nella pagina di gestione del blog e incollare il codice nel punto voluto (per esempio nel footer del post). Nel mio caso:



Un altro problema non da poco degli script php di terze parti è che generalmente non è possibile leggerne il codice sorgente, se non viene esplicitamente rilasciato.

L'algoritmo alla base di un contatore di letture non è comunque niente di complicato: un semplice database di una tabella che per ogni post (identificato per esempio dal suo id univoco: data:post.id) associ il numero di visualizzazioni e che incrementi quest'ultimo ogni volta che la pagina del post viene caricata. Tra i mille disponibili ho trovato questo di Klemen Stirn, molto semplice e trasparente, che usa un database basato su file di testo: ogni post è un file txt che contiene il numero di visualizzazioni. Ho modificato il codice per adattarlo ad alcune mie esigenze: voglio che il conteggio sia visibile nell'anteprima dei post in homepage, senza che questo aumenti il numero di visualizzazioni, mentre l'incremento si deve avere solo quando si carica la pagina del post integrale.



Le mie modifiche consistono semplicemente nell'aggiunta del supporto alle modalità di sola lettura e lettura/scrittura, mediante la variabile w. Il codice da inserire nel template di blogger, infatti, si ripete due volte: la prima in un blocco condizionale <b:if cond='data:blog.pageType != &quot;item&quot;'>, cioè solo quando si ha l'anteprima del post (w=0), la seconda nel blocco <b:else/> successivo, quando cioè si è nella pagina del post integrale (w=1). Notare che l'incremento si ha anche nel caso si visualizzi l'anteprima del post prima della pubblicazione: un piccolo bias indolore, direi.

Ovviamente tutto dipende da dove si decide di inserire il contatore, a me è sembrato elegante affiancarlo a quello dei commenti.
Add to Diigo


5 commenti:

  1. Purtroppo inserendo il codice
    <span id='hit-counter'>
    <a expr:href='data:post.url' rel='follow'>
    <script expr:src='"http://www.inventati.org/accatagliato/vv_counter/counter.php?=" + data:post.id + "&w=0"' type='text/javascript'/>visite</a>, </span>

    blogger da l'errore
    The reference to entity "w" must end with the ';' delimiter.


    Potresti essere piu preciso su tutti i passaggi scrivendo la sintassi intera.

    RispondiElimina
  2. Il messaggio di errore è abbastanza chiaro, blogger cerca di interpretare &w come entità html e ovviamente richiede un ; a chiudere. Prova usando "&w=0"... ti sconsiglio però di usare lo script residente sul mio server, non è in grado di reggere molto traffico.

    RispondiElimina
  3. Ok, mi interpreta l'entità anche nei commenti... volevo dire "prova usando &amp;w=0"...

    RispondiElimina
  4. Grazie per la risposta tempestiva :)
    Ho provato... cosi riesce a "assimilarlo" ma addirittura fa scomparire tutto il post O_o
    Cmq per evitare prove e contro prove, Potresti fornire la sintassi intera in entrambi i casi (&w=0 /&w=1) esattamente come l'hai inserita tu (visto che te l'ha accettata e sul tuo blog fuonziona perfettamente?)
    Dopo dove li hai messi precisamente? in modo più minuzioso? e poco chiaro "la seconda nel blocco successivo"
    Inoltre avevo pensato di caricare lo script su un account di mia proprietà (altervista)
    il problema e che non funge. ho creato un fil php copiando il codice che fornivi tu del contatore. ma sicuramente manca qualcosa. forse la parte che richiama la funzione che non hai citato.
    Se per favore potremmi spiegare meglio o fornire il codice completo pronto da caricare.


    ti post come l'ho inserito io:

    <div class='post-footer-line post-footer-line-2'>

    <!--COUNTER-->
    <b:if cond='data:blog.url != data:blog.homepageUrl'>
    <span id='hit-counter'>
    <a expr:href='data:post.url' rel='follow'>
    <script expr:src='&quot;http://www.inventati.org/accatagliato/vv_counter/counter.php?=&quot; + data:post.id + &amp;w=0&quot;' type='text/javascript'/>visite</a>,</span></b:if>
    <!--FINE COUNTER-->

    <b:if cond='data:post.labels'>
    <span class='post-labels'>
    <b:if cond='data:post.labels'>
    <data:postLabelsLabel/>
    <b:loop values='data:post.labels' var='label'>
    <a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != &quot;true&quot;'>,</b:if>
    </b:loop>
    </b:if>
    <!--PULSANTE FACEBOOK INIZIO-->
    <b:if cond='data:blog.url != data:blog.homepageUrl'>
    <iframe allowTransparency='true' expr:src='&quot;http://www.facebook.com/plugins/like.php?href=&quot; + data:post.url + &quot;&amp;layout=standard&amp;show_faces=false&amp;width=100&amp;action=like&amp;font=arial&amp;colorscheme=light&quot;' frameborder='0' scrolling='no' style='border:none; overflow:hidden; width:400px; height:40px;'/>
    </b:if>
    <!--PULSANTE FACEBOOK FINE-->

    <img height='25' src='http://digilander.libero.it/USER/cartella/traspost.png' width='181'/>
    <!-- Articoli Simili Codice Inizio-->
    <b:if cond='data:blog.pageType == &quot;item&quot;'>
    <div id='related-posts'>
    <b:loop values='data:post.labels' var='label'>
    <b:if cond='data:label.isLast != &quot;true&quot;'>
    </b:if>
    <b:if cond='data:blog.pageType == &quot;item&quot;'>
    <script expr:src='&quot;/feeds/posts/default/-/&quot; + data:label.name + &quot;?alt=json-in-script&amp;callback=related_results_labels&amp;max-results=6&quot;' type='text/javascript'/></b:if></b:loop>
    <script type='text/javascript'>
    var maxresults=6;
    removeRelatedDuplicates(); printRelatedLabels(&quot;<data:post.url/>&quot;);
    </script>
    </div>
    </b:if>
    <!--Articoli Simili Codice Fine-->
    </span>
    </b:if>
    </div>

    RispondiElimina
  5. scusa mi puoi aiutare non riesco ad inserire il codice delle contatore!!! :(
    please...
    Anna di http://unpodibricioleincucina.blogspot.it/

    RispondiElimina