Cómo separar comentarios y trackbacks

Autor: Armonth | El miércoles 23 de agosto del 2006 @ 21:45.

A petición de dos personas por email, explico cómo separar los comentarios de los trackbacks en WordPress lo cual es algo muy sencillo de hacer pero hay gente que no se entiende con los manuales en inglés que existen. Como curiosidad decir que yo no seguí ninguno de estos: Solamente tuve que copiar y pegar código de la plantilla por defecto e ir retocando hasta que funcionase.

Nos centramos en cómo hacer que salgan, el código para mostrarlos con X o Y contenido ya lo dejamos para que cada uno haga a su gusto y en su lugar se sustituye por una variable ficticia llamada %Contenido%, esto lo rellenáis con las etiquetas para plantillas que tiene WordPress a vuestro gusto. Por último voy a explicar que hace cada cosa, para los muy novatos en PHP.

1º los trackbacks

Antes de nada, una línea que haga una llamada a la base de datos MySQL para recoger los comentarios de la entrada:

<?php
  $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND comment_approved = '1' AND comment_type!= '' ORDER BY comment_date");
?>

Que en cristiano viene a ser "Pisha, meteme en $comments todos los comentarios que estén aprobados, sean trackbacks/pingbacks y pertenezcan a esta entrada... y ya que estamos en ello abuso un poco y también me los ordenas por fecha". Luego la parte relativa a mostrar los trackbacks:

<?php if ($comments) {
  <ul>
  <?php foreach ($comments as $comment) { ?>
    <li id="track-<?php comment_ID() ?>">%Contenido%</li>
 <?php } /* end for each comment */ ?>
 </ul>

<?php } / end for if comments / ?>

En la primera línea viene a decir "si hay comentarios, mostrar el siguiente código", por el código HTML de dentro se puede ver que los trackbacks se mostraran en forma de lista no numerada. Todo contenido dentro de foreach se repetirá una vez por cada comentario, es por eso que debemos mantener <ul> y </ul> fuera del mismo ya que si no la página no validara, generara código innecesario y en caso de ser una lista numerada (<ol>) no numerará nada.

Con esto ya tenemos la presentación, ahora solo falta añadir una clausula más:

<?php if ('closed' == $post-> ping_status) { ?>
  <p>Trackbacks cerrados</p>
<?php } ?>

Simple: después de mostrar los trackbacks si resulta que la entrada tiene los trackbacks cerrados, informara de ello, también se podría añadir en la propia lista pero no lo recomiendo ya que entonces el aviso no saldrá si tienes los trackbacks cerrados y requerirá trabajo extra. Con esto ya tenemos los trackbacks, solamente apuntar una última cosa más: si intentamos mostrar una lista de comentarios o trackbacks fuera del comments.php en algunas ocasiones no funcionara (no mostrara datos), no sé por que pero a veces me lo hace, a veces no (depende de la versión de WordPress y no recuerdo cual me la hacía), entonces debemos cambiar:

foreach ($comments as $comment) { ?>

Por:

global $comment; foreach ($comments as $comment) { ?>

2º los comentarios

Los comentarios son algo más puñeteros, lo primero es definir la apertura:

<?php 
  if ( ($comments) or ('open' == $post-> comment_status) ) { 
?>

Luego nos hacemos un contador de comentarios el cual usaremos a la mínima ocasión, dado que estamos separando comentarios de trackbacks, no podemos utilizar la función que viene por defecto con WordPress y nos tenemos que crear una propia:

<?php 
  $ccount = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$id' AND comment_approved = '1' AND comment_type = ''"); 
?>

Luego mostramos el número de comentarios a la gente, ya que estamos hacemos uno que devuelva 'Sin comentarios' cuando no haya, 1 comentario cuando sólo haya uno y X comentarios cuando haya más de 1:

<h3 id="comentarios">
  <?php if ($ccount == '0') { ?>Sin comentarios</h3>
  <?php } elseif ($ccount == '1') { ?>Un comentario</h3>
  <?php } else { ?><?php echo $ccount ?> Comentarios</h3>
  <?php } ?>

Aunque lo mejor es que estas líneas la pongais todo junto sin saltos de línea, total no creo que vayais a tocar esta parte. Ahora toca mostrar algo cuando no haya comentarios y los comentarios estén abiertos:

<ol id="comment-list">
 <?php if ($ccount == '0' AND 'open' == $post-> comment_status) : ?>
   <li id="no-comments">No hay comentarios</li>
 <?php endif; ?>

Lo suyo es aplicar en el CSS al ID no-comments un list-style: none;. Lo siguiente es mostrar los comentarios en caso de que los haya, está parte es prácticamente igual que en los trackbacks, primero la orden para recoger todos los comentarios aprobados de está entrada y ordenarlos por fecha:

<?php 
  $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND comment_approved = '1' AND comment_type = '' ORDER BY comment_date"); 
?>

Y luego mostrarlos:

<?php if ($comments) { ?>
  <?php foreach ($comments as $comment) { ?>
    <li class="<?php echo $oddcomment; ?>" id="comment-<?php comment_ID() ?>">
    %Contenido%

       <?php if ($comment->comment_approved = '0') : ?>
         <p class="moderado">Su comentario está pendiente de moderación.</p>
       <?php endif; ?>
    </li>

Lo único añadido es que despues del contenido le hemos puesto un párrafo para advertir de la moderación, ahora toca:

<?php if ('alt' == $oddcomment) $oddcomment = '';
  else $oddcomment = 'alt';
?>

<?php } } /* end for each comment */ ?>
<?php } ?>
</ol>

El $oddcomment es para que los comentarios y de forma alternativa tengan un class="alt" así por ejemplo puedes poner un comentario con fondo blanco y el siguiente con fondo verde (como tenemos aquí en SigT), las tres últimas líneas son para el cierre de los if y etiquetas que nos hemos dejado abiertas.

¡Lista la presentación de los comentarios! ahora sólo falta mostrar algo cuando los comentarios estén cerrados y el formulario:

<?php if ('closed' == $post-> comment_status) { ?>
  <h4>Comentarios cerrados</h4>
<?php } ?>

El formulario es muy complejo, lo mejor es copiar y pegar el original:

<?php if ('open' == $post-> comment_status) { ?>
  %Copia aquí el formulario
<?php } ?>

Y eso es todo. Os dejo un código de ejemplo con todo listo y el formulario para comentar. Advertir que este código es de ejemplo, lo mejor es ir aplicando todo poco a poco en nuestra instalación y adaptar en caso de que algo falle. Pensad que mi versión de WordPress no tiene porque ser la vuestra y que aunque ahora funciona en un futuro, a medida que nuevas versiones de WordPress salgan, no tiene porque ser así.

Comentarios