Au mai scris şi alţii şi, cred, de referinţă rămîne “manualul” lui Alex Negrea. Per total, Alex le zice foarte bine. Problema mea e că eu, unul, folosesc propria structură de afişare a comentariilor (un cod preluat de la Brian Gardner şi modificat ulterior), în speţă pentru că e mai simplă, ceea ce înseamnă mult mai multă uşurinţă la capitolul modificări pentru cineva care nu se pricepe la PHP. Pe de altă parte, structura mea de cod este simplă şi pentru că mă ajută pe mine să-mi bat capul cît mai puţin.
Activarea răspunsurilor la comentarii
Fireşte, nu e perfectă, nici măcar partea de CSS nu e perfectă după ce am adaptat codul pentru versiunea 2.7 (a se vedea aici cam cît e de stilizat, eu n-am îndrăznit să muncesc atîta). Pînă una-alta, s-o luăm cu începutul.

Înainte de a te apuca de modificat codul, intră în Settings > Discussion şi bifează “Enable threaded (nested) comments“. Preferabil ar fi să bifezi 3 în loc de 5 (default). Şi asta din cauză că ai toate şansele ca, atunci cînd vei modifica CSS-ul, să strici aspectul template-ului.
Adăugarea primelor bucăţi de cod
Prima modificare în fişierele temei apare chiar în header.php. Practic, se adaugă o bucată de cod:
[php]< ?php if (is_singular()) wp_enqueue_script('comment-reply'); ?>[/php]
precum în imaginea de mai jos:

De reţinut, bucata de cod de mai sus trebuie pusă obligatoriu deasupra bucăţii de cod din rîndul 20 din imagine:
[php]< ?php wp_head(); ?>[/php]
Crearea functions.php
Pasul următor este scrierea funcţiilor necesare pentru afişarea comentariilor după noul “standard”. Noul “standard” vine şi ca urmare a introducerii de noi funcţii, în cazul de faţă < ?php wp_list_comments(); ?>. Nu stau să detaliez cu ce se mănîncă funcţia asta, a făcut-o deja Alex (vezi link-ul de sus). Totuşi, reţine că trebuie să salvezi fişierul comments.php înainte de a te apuca să-l modifici. Cel mai indicat ar fi să îl redenumeşti în legacy.comments.php. De ce? Detaliez mai jos.
Însă ceea ce pot să fac este să dau un copy/paste cu ceea ce ar trebui să conţină functions.php, respectiv funcţia pe care o folosesc eu pentru afişarea comentariilor. Altfel spus, e vorba strict despre afişarea comentariilor fără folosirea DIV-urilor, prin urmare fără mari bătai de cap din cauza stilizărilor.
O primă observaţie: dacă template-ul tău foloseşte widget-uri, implicit foloseşte şi functions.php. Ceea ce înseamnă că headerele < ?php sînt deja folosite, deci nu trebuie să le mai scrii încă o dată. Prin urmare, iată codul functions.php:
[php]
add_filter(‘comments_template’, ‘legacy_comments’);
function legacy_comments($file) {
if ( !function_exists(‘wp_list_comments’) )
$file = TEMPLATEPATH . ‘/legacy.comments.php’;
return $file;
}
function custom_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
< ?php if ($args['avatar_size'] != 0) echo get_avatar( $comment, $args['avatar_size'] ); ?>
< ?php comment_author_link() ?> a scris la data de < ?php comment_date('j.n.Y') ?>, ora < ?php comment_time() ?> < ?php edit_comment_link('(Edit)','',''); ?>
< ?php if ($comment->comment_approved == ’0′) : ?> ‘, ‘reply_text’ => ‘Raspunde’, ‘depth’ => $depth, ‘max_depth’ => $args['max_depth'] )); ?>
Comentariul tau asteapta moderarea.
< ?php endif; ?>
< ?php comment_text() ?>
< ?php echo comment_reply_link(array('before' => ‘
< ?php // Do not close LI. WP will do it for you.
}
[/php]
Ce înseamnă asta? Ei bine, prima parte este un filtru, cea de-a doua este funcţia propriu-zisă. Ce face filtrul? Caută existenţa funcţiei definite mai jos, iar în cazul în care nu o găseşte, foloseşte legacy.comments.php. Asta doar dacă se întîmplă să nu funcţioneze ceva sau vrei să faci update la template deşi încă nu te-ai hotărît cînd vei face şi la WordPress. Filtrul nu e necesar decît în cazul în care vrei să mai dai tema şi altora.
În ceea ce priveşte noul comments.php, aici e un pic mai delicat, mai ales că e nevoie de mai multe înlocuiri. Mai exact, începînd cu prima parte şi continuînd cu alte cîteva bucăţi de cod. Altfel spus, prima parte este cea care defineşte fişierul.
[php]
/**
* @package WordPress
* @subpackage Default_Theme
*/
// Do not delete these lines
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
die ('Please do not load this page directly. Thanks!');
if ( post_password_required() ) { ?>
< ?php
return;
}
?>
[/php]
Asta este partea pe care nu trebuie să o editezi, dar pe care trebuie să o înlocuieşti dacă vrei un nou comments.php funcţional. Urmează partea în care se defineşte afişarea comentariilor în pagină. Parte care va arată (în cazul în care template-ul foloseşte un DIV exclusiv pentru comentarii) aşa:
[php]
< ?php if ( have_comments() ) : ?>
Trackbacks
-
< ?php wp_list_comments('type=pings'); ?>
< ?php endif; ?>
< ?php comments_number('Niciun comentariu', 'Un raspuns', '% comentarii' );?>
-
< ?php /* Changes every other comment to a different class */
if ('alt' == $oddcomment) $oddcomment = '';
else $oddcomment = 'alt';
if ( $comment->comment_author_email == get_the_author_email() ) echo ‘staffcomment’;
else echo $oddcomment; ?>
?>
< ?php wp_list_comments('avatar_size=40&callback=custom_comment'); ?>
< ?php else : // this is displayed if there are no comments so far ?>
< ?php if ('open' == $post->comment_status) : ?>
Nici un comentariu
< ?php else : // comments are closed ?>
< ?php endif; ?>
< ?php endif; ?>
[/php]
Bineînţeles, dacă template-ul tău foloseşte alt tip de heading, h4 poate fi înlocuit. Ce se întîmplă în codul de mai sus? Pe scurt, o traducere ar suna cam aşa:
Dacă există comentarii, atunci creează DIV-ul “comentarii”, dacă există, afişează headingul pentru trackbacks şi lista de trackback-uri, afişează headingul cu numărul de comentarii, afişează lista de comentarii în funcţie de stilizarea lor CSS (funcţie de clase, “alt”, “staffcomment” dacă este al autorului), afişează avatar în dreapta, închide DIV-ul “comentarii” şi creează DIV pentru navigare, afişează link-uri navigare, închide DIV, iar dacă nu sînt comentarii ori comentariile sînt închise, afişează headingul prin care se anunţă acest lucru.
Sper că s-a înţeles măcar un minimum. Urmează partea a doua a fişierului, cea în care este determinat răspunsul.
[php]
< ?php
/**
* @package WordPress
* @subpackage Default_Theme
*/
// Do not delete these lines
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
die ('Please do not load this page directly. Thanks!');
if ( post_password_required() ) { ?>
< ?php
return;
}
?>
< ?php if ( have_comments() ) : ?>
Trackbacks
-
< ?php wp_list_comments('type=pings'); ?>
< ?php endif; ?>
< ?php comments_number('Niciun comentariu', 'Un raspuns', '% comentarii' );?>
-
< ?php /* Changes every other comment to a different class */
if ('alt' == $oddcomment) $oddcomment = '';
else $oddcomment = 'alt';
if ( $comment->comment_author_email == get_the_author_email() ) echo ‘staffcomment’;
else echo $oddcomment; ?>
?>
< ?php wp_list_comments('avatar_size=40&callback=custom_comment'); ?>
< ?php else : // this is displayed if there are no comments so far ?>
< ?php if ('open' == $post->comment_status) : ?>
Nici un comentariu
< ?php else : // comments are closed ?>
< ?php endif; ?>
< ?php endif; ?>
< ?php if ('open' == $post->comment_status) : ?>
< ?php comment_form_title( 'Lasa un comentariu', 'Raspunde comentatorului %s' ); ?>
< ?php if ( get_option('comment_registration') && !$user_ID ) : ?>
Trebuie sa fii /wp-comments-post.php” method=”post” id=”commentform”>
< ?php if ( $user_ID ) : ?>
Logat cu userul /wp-login.php?action=logout” title=”Logout”>Logout »
< ?php else : ?>
nu va fi publicat
microID pentru descoperirea autorului articolului sau a administratorului blogului, însă mie mi s-a părut că mă complic inutil. Am preferat să folosesc tot codul PHP din WordPress, ăsta fiind şi motivul pentru care n-am scris mai devreme despre cum se fac modificările. A durat ceva pînă m-am prins cum să modific astfel încît să folosească adresa de mail a autorului (nu că ar fi fost foarte greu, dar nici chiar uşor, altfel nu-mi explic de ce alţi programatori de teme WordPress, mai vechi decît mine şi pe care îi urmăresc de ceva vreme, n-au făcut-o înaintea mea).
Nu în ultimul rînd, trebuie avut în vedere că sînt necesare şi nişte bucăţi de cod CSS, doar că nu mai intru în detalii în momentul ăsta. Probabil voi reveni cu altă ocazie. Oricum, există mai sus un link către clasele care trebuie scrise.
PS: Să-mi aducă cineva aminte să anexez şi fişierele PHP dezbătute mai sus. Ah, şi să-mi aducă cineva aminte să-mi modific şi mie template-ul, astfel încît să existe posibilitatea de răspuns la comentariile celorlalţi. Deh, pentru mine n-am făcut-o încă.
3 comentarii
Completare pentru articolul precedent : subiectiv | pur si simplu @ 30.12.2008, 5:53 pm
[...] scris despre cum modifici template-ul de comentarii, dar s-au strecurat vreo două erori. Altfel spus, erorile ţin pluginul pe care îl folosesc [...]
Functie noua la comentariile de pe Spuse.ro | spuse pe blog @ 1.1.2009, 8:56 pm
[...] de la mai multi, nici nu-i mai stiu pe toti, cel mai mult m-am inspirat de la Alex Negrea si subiectiv.ro. Daca ar fi sa o fac din nou nu stiu daca as mai reusi, cred ca da, dar tot cu nervi, am modificat [...]
crow @ 3.1.2009, 12:17 am
Cum ai rezolvat problema compatibilitatii intre paginarea comentariilor si replyul lor ? Eu folosesc doua pluginuri pt reply si pt paginare. Problema e ca se anuleaza una pe cealalta. Ce recomanzi ?