Modificare l'HTML prodotto da wp_list_comments()
Sto sviluppando un tema WordPress per il quale vorrei che il timestamp di ogni commento fosse racchiuso in un elemento <span>
per poterlo stilizzare con regole CSS. Tuttavia, la funzione wp_list_comments()
come la uso nel template comments.php
del mio tema non sembra fornire opzioni per modificare l'HTML prodotto:
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
) );
?>
</ol>
che produce timestamp in questo modo:
<time datetime="2015-12-21T19:09:49+00:00"> 21 dicembre 2015 alle 19:09 </time>
Come posso modificare l'output della funzione per includere un elemento <span>
intorno a ciascun elemento <time>
senza modificare i file core?
Ho provato a cercare nel file functions.php
del mio tema, così come nei file WordPress wp-includes/comment.php
e wp-includes/comment-template.php
. Nessuno di questi gestisce la struttura effettiva dei tag dei timestamp dei commenti generati da wp_list_comments()
, quindi non c'era nulla con cui potessi lavorare.

Ecco alcune opzioni su come possiamo sovrascrivere il layout nativo per ogni commento:
Approccio #1 - Sovrascrivere start_el()
con un walker personalizzato
Definiamo il nostro formato di commento personalizzato wpse:
// Argomenti per wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
];
// Usa il nostro walker personalizzato se disponibile
if( class_exists( 'WPSE_Walker_Comment' ) )
{
$args['format'] = 'wpse';
$args['walker'] = new WPSE_Walker_Comment;
}
wp_list_comments( $args );
con un walker di commenti personalizzato, che gestisce questo nuovo formato (PHP 5.4+):
/**
* Walker di commenti personalizzato
*
* @users Walker_Comment
*/
class WPSE_Walker_Comment extends Walker_Comment
{
public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 )
{
// Il nostro formato di commento personalizzato 'wpse'
if ( 'wpse' === $args['format'] )
{
$depth++;
$GLOBALS['comment_depth'] = $depth;
$GLOBALS['comment'] = $comment;
// Inizia l'output buffering
ob_start();
// Usiamo il template di commento html5 nativo
$this->html5_comment( $comment, $depth, $args );
// Le nostre modifiche (avvolgiamo <time> con <span>)
$output .= str_replace(
[ '<time ', '</time>' ],
['<span><time ', '</time></span>' ],
ob_get_clean()
);
}
else
{
// Fallback per i formati di commento nativi
parent::start_el( $output, $comment, $depth, $args, $id );
}
}
} // fine della classe
Nota come gestiamo il nostro formato di commento personalizzato. Riusiamo anche il metodo start_el()
dalla classe genitore per i formati nativi, chiamando parent::start_el()
.
Nota anche che usiamo l'output buffering in modo simile alla classe genitore.
Approccio #2 - Sovrascrivere html5_comment()
con un walker personalizzato
Possiamo anche sovrascrivere direttamente il metodo nativo Walker_Comment::html5_comment()
, nel modo seguente:
// Argomenti per wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
'walker' => new WPSE_Walker_Comment,
];
wp_list_comments( $args );
dove la nostra classe walker personalizzata è definita in functions.php
come:
if ( !class_exists( 'WPSE_Walker_Comment' ) ) {
/**
* Walker di commenti personalizzato
*
* @users Walker_Comment
*/
class WPSE_Walker_Comment extends Walker_Comment {
public function html5_comment( $comment, $depth, $args ) {
// Inserisci qui le modifiche al metodo Walker_Comment::html5_comment()
}
}
// fine di WPSE_Walker_Comment
} // fine della condizione '!class_exists'
Qui possiamo memorizzare le nostre modifiche al metodo Walker_Comment::html5_comment()
. È piuttosto lungo, quindi non l'ho incluso qui.
Approccio #3 - Callback personalizzato
Qui useremmo l'attributo callback
:
// Argomenti per wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
];
// Usa la nostra callback personalizzata se disponibile
if( function_exists( 'wpse_comment_callback' ) )
{
$args['format'] = 'wpse';
$args['callback'] = 'wpse_comment_callback';
}
wp_list_comments( $args );
dove definiamo wpse_comment_callback()
secondo le nostre esigenze.
/**
* Callback di commento personalizzato
*/
function wpse_comment_callback( $comment, $depth, $args )
{
// Modifica il metodo Walker_Comment::html5_comment() secondo le nostre esigenze
// e inseriscilo qui
}
dove potremmo iniziare simulando il metodo Walker_Comment::html5_comment()
. Ma dobbiamo ricordarci di sostituire tutti i riferimenti a $this
.
Approccio #4 - Sovrascrivere gli argomenti di wp_list_comments()
con un filtro
Possiamo anche usare il filtro wp_list_comments_args
per modificare gli argomenti di wp_list_comments()
con i metodi sopra.
Ci sono altri approcci disponibili, ma spero che tu possa adattare questi alle tue esigenze.
