Publicado el Miércoles 23 de Agosto del 2006 @ 21:45 por Armonth.
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 hay. 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.
Lo primero es una línea que haga una llamada a la BBDD para recoger los comentarios de está entrada, por ése mismo motivo si piensas en poner los comentarios en un menú, aseguraos de que solamente salgan en las entradas (añade un <?php if (is_single()) { ?>).
<?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 castellano significa “Coge en la variable $comments todos los comentarios aprobados, que sean trackbacks/pingbacks y pertenezcan a está entrada ordenados 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 numerara 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.
Con esto ya tenemos los trackbacks, solamente apuntar una última cosa: 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) { ?>
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 en la mínima ocasión, dado que en el contador no tenemos en cuenta los trackbacks no podemos usar la función por defecto de WordPress:
<?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 ordenados 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 } ?>
Os dejo un texto de ejemplo con todo aplicado + el formulario para comentar.
Gracias, me hacía falta.
buen aporte!
Perdona, y la diferencia con pingbacks?
A mi no me aparecen los trackbacks en mis artículos (y en el panel de control dice que hay enlaces a dichos artículos). Cómo se activan?
Gracias
Muy bueno si funciona me haces un gran regalo, voy a probar, pero tienes un descuido en el segundo código donde escribes:
“”
¡muchas gracias!
Hola, muy buen tip. Aparte, es necesario un plugin para mostrar la url del trackback para el post que uno esta leyendo?. En ocasiones es bueno “mostrar” la url del trackback en algun campo para que los bloggers la puedan copiar mas rapido.
Saludos.
muy buenas ante todo muchos saludos me gustaria saber para que se utiliza el li si es un comando un variable, un separador, o que cosa es, me gustaria poder tener una explicacion detallada, es muy importante gracias, chao
Armonth!
en la linea 8 del .txt te has olvidado de cerrar el php ?>
puede ser?