WordPress Little Trick – functions.php e commenti nidificati

scritto da Francesco Gavello [+] il 09 gennaio 2009 | 14 Commenti in: WordPress

matrioska

Functions.php è uno dei file che durante la scrittura di un tema per WordPress viene spesso, e a torto, trascurato.

Sebbene non strettamente necessario, functions.php permette (e da qui il suo nome) di definire delle funzioni personalizzate tramite le quali gestire il comportamento del proprio blog, evitando di mettere mano al core di WordPress con tutti gli evidenti vantaggi in fatto di manutenzione e pulizia del codice.

Vi evita anche di sudare freddo al rilascio di ogni nuova versione di WordPress stesso, dato che tutte le vostre modifiche più profonde vengono di fatto mantenute al sicuro e incluse in un singolo file indipendente dal resto.

I risultati che si possono ottenere con qualche riga di codice in functions.php sono i più vari, e dipendono in gran parte dalla vostra conoscenza di PHP associata ai semplici meccanismi che regolano l’engine del CMS.

Quest’oggi vi vorrei spiegare un semplice metodo che potrete utilizzare per modificare la resa HTML dei commenti nidificati tramite l’aggiunta di una funzione su misura proprio in functions.php.

Come in molti sanno, WordPress dalla versione 2.7 supporta il threading dei commenti, ovvero l’incapsulamento in stile matrioska di tutte le discussioni che prendono piede dal vostro articolo. Per fare ciò il team ha predisposto un nuovo tag, , in grado di occuparsi dell’intera faccenda in maniera perfettamente autonoma.

E quando parlo di “maniera perfettamente autonoma” intendo esattamente questo. Wp_list_comments si prende carico della gestione delle liste nidificate, delle classi associate ad ogni livello di commento, di predisporre link giusti e di recuperare i contenuti stessi. Il tutto in maniera molto più essenziale di quanto avveniva con la gestione standard ed evitando agli utenti meno esperti di doversi destreggiare tra una decina di tag in più.

In effetti alcune variabili di wp_list_comment sono ridefinibili tramite il passaggio di variabili alla funzione stessa, ma come comportarsi per chi ha la necessità di sviluppare un ben preciso HTML per l’output dei propri commenti?

Ed è qui che entra in gioco functions.php :)

Due sono i passi necessari:

  • indicare a WordPress che intendiamo usare una funzione personalizzata per la resa dei commenti
  • scrivere la funzione dedicata contenente il nostro HTML personalizzato

Sembra complicato ma vedrete che riusciremo ad essere perfettamente operativi in una manciata di minuti.

1. Agganciamo la nostra funzione

Il layout che andiamo a ridefinire è quello generato proprio da wp_list_comments. Per fare ciò è sufficiente fornire il parametro “callback=nome_funzione” per indicare a WordPress di ignorare il normale comportamento della funzione e utilizzare invece una nostra versione personalizzata.

Nel nostro file comments.php andiamo dunque a modificare wp_list_comments come di seguito.

<?php wp_list_comments('callback=layout_commenti'); ?>

Potete naturalmente lasciare intatti eventuali parametri già presenti.

2. Nuovo layout per i commenti

Il secondo passo è la stesura della nuova funzione personalizzata che andrà a mostrare i commenti.

Non nego che la scrittura da zero di una simile funzione sia in effetti un lavoraccio ingrato, ma per comodità possiamo prendere come base la funzione originale.

Creiamo dunque se ancora non esiste un file “functions.php” nella root del nostro tema e incolliamo al suo interno il codice seguente (da notare la non chiusura del tag “li”).

<?php

function layout_commenti($comment, $args, $depth) {

	$GLOBALS['comment'] = $comment; ?>

	<li <?php comment_class(); ?> id="comment-< ?php comment_ID() ?>">
		<div id="div-comment-<?php comment_ID(); ?>">

			<div class="comment-author vcard">
				< ?php echo get_avatar($comment,$size='64'); ?>
				< ?php printf(__('<cite class="fn">%s <span class="says">ha detto:</span>'), get_comment_author_link()) ?>
			</div>

			< ?php if ($comment->comment_approved == '0') : ?>
				<em>< ?php _e('Il tuo commento &egrave; in attesa di moderazione.') ?></em>
				<br />
			< ?php endif; ?>

			<div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>">< ?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?></a>< ?php edit_comment_link(__('(Edit)'),'  ','') ?></div>
			
			<div class="testo_commento">
				< ?php comment_text() ?>			
			</div>
      
	      	<div class="reply">
	      	
	      	< ?php comment_reply_link(array_merge( $args, array('add_below' => 'div-comment', 'depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
	      </div>
	     </div>
<?php }

?>

Assicuratevi che il nome funzione (qui “layout_commenti”) coincida con quanto indicato nel callback del punto 1 e salvate.

Voilà.

Già fatto? Già fatto.

Ora sarà possibile agire sulla resa HTML dei vostri commenti nidificati semplicemente modificando la porzione di codice che avete appena creato in functions.php. Volete modificare il terribile “Says” e localizzare il vostro tema al 100% ? Volete racchiudere il testo dei commenti da un div personalizzato? Tutto ciò è solo a qualche click di distanza.

Vi ricordo che per usufruire della funzione di incapsulamento dei commenti è necessario attivare questa caratteristica dal pannello di admin sotto “Impostazioni” >> “Discussione”, flagando “Abilitare i commenti nidificati per n livelli di profondità”. Per una guida dettagliata su come adattare il vostro tema all’utilizzo dei commenti nidificati vi rimando invece all’articolo WordPress 2.7 e commenti nidificati, quello che c’è da sapere

Buona customizzazione! ;)

Trovato questo articolo interessante?

Condividilo sulla tua rete di contatti Twitter, sulla tua bacheca su Facebook o semplicemente premi "+1" per suggerire questo risultato nelle ricerche in Google. Diffondere contenuti che trovi rilevanti aiuta questo blog a crescere. Grazie!

14 Commenti

Update 12/02/2012: Il Regolamento Commenti è cambiato! Leggi ciò che serve sapere!

  1. Tom ha detto:

    E’ la soluzione migliore se si vuole personalizzare il codice dei commenti su WordPress, ho utilizzato questo metodo anche nell’ultima versione del tema Stardust compatibile con la 2.7 :)

    Buon post!

    Rispondi
  2. sagremor78 ha detto:

    Ottima la soluzione proposta.
    Certo, per me che ho ancora pochi commenti, addirittura nidificarli può sembrare assurdo, ma quando sarà lo terrò in considerazione.

    Grazie per la visita. ;-)

    P.S.: come si chiama il plugin che usi per formattare il codice? E’ giorni che lo cerco ma non sono riuscito a trovarlo.

    :-)

    Rispondi
  3. Francesco Gavello ha detto:

    @Tom: Grazie :) In effetti dopo averci preso un po’ la mano, con functions.php puoi fare praticamente ogni cosa.

    Conto di estendere l’argomento nei prossimi post!

    @Sagremor78: Ne ho provati almeno una decina, ma quello che ho trovato più leggero e con i tag migliori per gestire la formattazione è stato SyntaxHighlighter Plus

    Rispondi
    • Francesco Carzedda ha detto:

      Ciao,
      ho sviluppato un tema accessibile per WordPress.
      http://opere.4elementi.info/?p=136
      L’unico modo per ottemperare al criterio 3.3.6 (rilettura e correzione dei dati prima dell’invio) della linee guida Wcag 2.0 mi è sembrato inserire una pagina intermedia tra comments.php e wp-comments-post.php, ma non è riconosciuta come elemento della hierarchy e le funzioni di WordPress non funzionano (sendmail.php).
      Per cui ho dovuto richiamare tutti i valori dal form di comments.php, inserirli in variabili e spedirli con un altro form a wp-comments-post.php.

      Per far funzionare dovrei richiamarne i valori in variabili.
      Ho già il valore di $id
      <input type="hidden" name="comment_post_ID" value="” />, come faccio a richiamare quello di $replytoid in questo modo:
      ?
      Posso ricreare in functions.php la funzione

      function comment_id_fields() {
      global $id;
      $replytoid = isset($_GET['replytocom']) ? (int) $_GET['replytocom'] : 0;
      echo “\n”;
      echo “\n”;
      }

      contenuta in comment-template.php ?
      Se si, come?

      Grazie in anticipo
      Francesco (noioso)

      Rispondi
  4. Daniele ha detto:

    Ottimo post.
    Aggiungerei un’ultima dritta: la localizzazione italiana traduce “Reply” con “Replica”, per il tasto di risposta e personalmente non mi piace molto.
    Consiglio allora di aggiungere all’array di comment_reply_link() anche il valore 'reply_text' => 'Rispondi'.

    In pratica sarebbe così:
    <?php comment_reply_link(array_merge( $args, array('add_below' => 'div-comment', 'depth' => $depth, 'max_depth' => $args['max_depth'], 'reply_text' => 'Rispondi'))) ?>

    Ciao! ;)

    Rispondi
  5. Francesco Gavello ha detto:

    @Daniele: Giustissimo!

    Chi non fa uso di una funzione dedicata e vuole modificare il “Reply” come desidera può in alternativa passare un parametro a wp_list_comments come di seguito:

    < ?php wp_list_comments('reply_text=Rispondi'); ?>

    Rispondi
  6. [...] l’ottimo post di Francesco Gavello WordPress Little Trick – functions.php e commenti nidificati sull’utilità del file functions.php presente nei temi WordPress, ecco altre funzioni utili da [...]

    Rispondi
  7. [...] Functions.php, se ricordi, non è un file indispensabile per la costruzione di un layout. Tuttavia la sua presenza diventa una vera manna dal cielo quando si vogliono spremere fino in fondo le potenzialità del nostro CMS preferito. Ne abbiamo già visto un utilizzo qualche tempo fa, parlando proprio di come assegnare un layout personalizzato ai commenti nidificati. [...]

    Rispondi
  8. [...] contenitore di funzioni richiamabili dalle pagina del nostro tema. Ne aveva parlato ad inizio anno Francesco Gavello affrontando la questione dei commenti nidificati. Lo script di oggi riguarda la visualizzazione [...]

    Rispondi
  9. Gianluca ha detto:

    Ciao,
    ho letto il tuo articolo, molto interessante.

    Io però dovrei sovrascrivere la funzione che stampa il post
    get_the_content()

    E questa è molto diversa da wp_list_comments(), in particolare non accetta tra gli argomenti una funzione in callback.

    Hai qualche dritta?

    Grazie!

    Rispondi
  10. Alessio Filippino ha detto:

    Ciao, grazie tante per l’aiuto,
    non sapevo dove mettre mano e il file function non lo frugo mai troppo volentieri crea grane per chi non è destro col php..
    allora devo solo farti una nota.

    Il codice non funziona a causa degli spazi presenti tra “< ?" mi è bastato eliminare questi spazi per risolvere.. infatti leggevo il codice della function invece di leggere i commenti.

    Cmq grazie tante ancora..
    è grazie a gente come te che cose che all'apparenza sembrano dettagli non si prolungano in modo ingiustificabile.

    Rispondi

Lascia un commento

Anteprima commentatore

Personalizza il tuo avatar!
Vai su gravatar.com e carica quello che preferisci!

I commenti sono modificabili entro 5 minuti dal loro inserimento.
Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Solo i commenti firmati con un nome saranno accettati. Leggi il Regolamento Commenti!