Imagen FeedVerdadera Seduccion - Coach, PNL y Sargeo | Deporte con la Wii Fit

Publicado por Fernando Tellado | 9 Junio 2008

Diseccionando el archivo ‘comments.php’

NetTuts ha creado un estupendo tutorial completo sobre todas y cada una de las partes del fichero 'comments.php', la parte de tu blog que mas utilizan tus lectores, y en realidad la única donde pueden interactuar, ser colaborativos.

Nosotros ya hemos publicado algún hack y guía sobre cuestiones de este fichero pero nada tan completo como esto, así que lo traducimos y explicamos (a nuestra manera, como siempre) para que también el lector de habla hispana tenga a su merced este conocimiento.

En este artículo iremos diseccionando cada parte del archivo 'comments.php' del tema por defecto de WordPress (Kubrick), explicando lo que significa cada sección del mismo y dando indicaciones de como personalizar el archivo y, en consecuencia, lo que verán tus lectores del blog.

Vamos al grano …

1. El Back-end de PHP

PHP:
  1. <?php if(!emptyempty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) : ?> 
  2. <?php endif; ?> 
  3.        
  4. <?php if(!emptyempty($post->post_password)) : ?> 
  5. <?php if($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) : ?> 
  6. <?php endif; ?> 
  7. <?php endif; ?> 
  8.    
  9. <?php if($comments) : ?> 
  10. <?php foreach($comments as $comment) : ?> 
  11. <?php if ($comment->comment_approved == '0') : ?> 
  12. <?php endif; ?> 
  13. <?php endforeach; ?> 
  14. <?php else : ?> 
  15. <?php endif; ?> 
  16.    
  17. <?php if(comments_open()) : ?> 
  18. <?php if(get_option('comment_registration') && !$user_ID) : ?> 
  19. <?php else : ?> 
  20. <?php if($user_ID) : ?> 
  21. <?php else : ?> 
  22. <?php endif; ?> 
  23. <?php endif; ?> 
  24. <?php else : ?> 
  25. <?php endif; ?>

Este es el código PHP original que hace funcionar el fichero 'comments.php', quizás algo intimidatorio para el novato. Pero no te preocupes, después de este tutorial lo vas a conocer como si lo hubieses creado tu mismo y podrás retocarlo sin miedo a romper nada. Por supuesto, recomendamos que los cambios se hagan en una instalación local y no en tu propio blog, tus lectores no tienen porqué sufrir nuestros experimentos.

2. Código General

Evitando el acceso directo a comments.php

PHP:
  1. <?php if(!emptyempty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) : ?> 
  2. <?php endif; ?>

Esta línea de código evita que los usuarios vean comments.php por accidente. Esta página se supone que debe estar incluida en una página de post, no por separado. Debes considerar esta parte como una medida de seguridad. Dentro de la declaración puedes insertar cualquier mensaje que quieras que se muestre al lector que esté viendo el fichero comments.php, preferiblemente un aviso de error.

PHP:
  1. <?php if(!emptyempty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) : ?> 
  2. <?php die('No puedes acceder directamente a esta página'); ?> 
  3. <?php endif; ?>

¿Se requiere contraseña?

PHP:
  1. <?php if(!emptyempty($post->post_password)) : ?> 
  2. <?php if($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) : ?> 
  3. <?php endif; ?> 
  4. <?php endif; ?>

Esta declaración (en realidad son 2 pero tiene mas sentido contemplarlo como una sola) comprueba si se requiere contraseña para ver el post. Obviamente, si no tienes una contraseña para ver el post, no podrás ver los comentarios.

La primera parte comprueba si se ha establecido una contraseña. La segunda declaración 'if' comprueba si hay una cookie con una contraseña y muestra el mensaje adecuado si no la encuentra. Puedes personalizar el mensaje de error poniendo lo que quieras dentro de la segunda declaración 'if'.

3. Mostrando los Comentarios

PHP:
  1. <?php if($comments): ?> 
  2. <?php foreach ($comments as $comment) : ?> 
  3. <?php if ($comment->comment_approved == '0') : ?> 
  4. <?php endif; ?> 
  5. <?php endforeach; ?> 
  6. <?php else : ?> 
  7. <?php endif; ?>

La primera declaración condicional (if($comments)) comprueba si hay comentarios, y luego sigue a través de ellos con una declaración foreach (para cada uno). Dentro de la declaración foreach puedes observar la siguiente declaración condicional: if($comment->comment_approved == '0'). Esto comprueba si el comentario ha sido aprobado, y muestra un mensaje si aún no está aprobado.

Un ejemplo de esto sería el siguiente código:

PHP:
  1. <?php if($comments) : ?> 
  2. <ol> 
  3. <?php foreach($comments as $comment) : ?> 
  4. <li> 
  5. <?php if($comment->comment_approved == '0') : ?> 
  6. <p>Tu comentario está pendiente de aprobación</p> 
  7. <?php endif; ?> 
  8. <p>Tu comentario</p> 
  9. </li> 
  10. <?php endforeach; ?> 
  11. </ol> 
  12. <?php else : ?> 
  13. <p>No hay comentarios</p> 
  14. <?php endif; ?>

Etiquetas principales de la plantilla de comentarios

Para hacer un código funcional necesitas conocer y usar las etiquetas de plantilla que tiene WordPress.

Etiqueta de Plantilla Descripción
<?php comment_ID(); ?> el ID de un comentario
<?php comment_author(); ?> el autor de un comentario
<?php comment_author_link(); ?> el autor de un comentario, con enlace a su web si lo especificó
<?php comment_type(); ?> el tipo de comentario; pingback, trackback o comentario
<?php comment_text(); ?> el texto del comentario
<?php comment_date(); ?> la fecha en que se publicóposted
<?php comment_time(); ?> la hora a la que se publicó

El Resultado Final

PHP:
  1. <?php if($comments) : ?> 
  2. <ol> 
  3. <?php foreach($comments as $comment) : ?> 
  4. <li id="comment-<?php comment_ID(); ?>"
  5. <?php if ($comment->comment_approved == '0') : ?> 
  6. <p>Tu comentario está pendiente de aprobación</p> 
  7. <?php endif; ?> 
  8. <?php comment_text(); ?> 
  9. <cite><?php comment_type(); ?> por <?php comment_author_link(); ?> el <?php comment_date(); ?> a las <?php comment_time(); ?></cite> 
  10. </li> 
  11. <?php endforeach; ?> 
  12. </ol> 
  13. <?php else : ?> 
  14. <p>Todavía no hay comentarios</p> 
  15. <?php endif; ?>

Insertando esto dentro de 'comments.php' te dará una lista ordenada con los comentarios y la información requerida o, por el contrario, mostrará un mensaje declarando que no hay comentarios.

4. El Formulario de Comentarios

¿Todavía estás ahí?, ¡Perfecto!. Ya casi lo tenemos. Solo tenemos que procesar esto del formulario de comentarios … Vale, puede que no sea del todo cierto que ya casi lo tengamos. El formulario de comentarios es realmente una de la partes mas difíciles de todo el fichero 'comments.php'.

Todavía te vas a encontrar con un buen montón de declaraciones condicionales (si se necesita registrarse, si ya estás registrado, etc). Esta parte es donde la mayoría de los principiantes tienen mas probelamas, y es que colocar mal los elementos del formulario puede hacer que no funcione en absoluto, dando algún tipo de error PHP.

Para que tengas un punto de vista completo de las declaraciones condicionales necesarias en el formulario de comentarios, primero explicaré las declaraciones, y luego incluiré el HTML para explicar donde debería ir cada una de las declaraciones.

Un Vistazo a las Declaraciones Condicionales

PHP:
  1. <?php if(comments_open()) : ?> 
  2. <?php if(get_option('comment_registration') && !$user_ID) : ?> 
  3. <?php else : ?> 
  4. <?php if($user_ID) : ?> 
  5. <?php else : ?> 
  6. <?php endif; ?> 
  7. <?php endif; ?> 
  8. <?php else : ?> 
  9. <?php endif; ?>

La primera declaración condicional que te encuentras es <?php if(comments_open()) : ?> . Esto básicamente comprueba si los comentarios están abiertos. Obviamente, si están cerrados no podrás publicar un comentario y el formulario no es necesario. Puedes poner el mensaje que quieras que se visualice si los comentarios están cerrados entre el último <?php else : ?> y<?php endif; ?>.

La segunda declaración condicional (<?php if(get_option('comment_registration') && !$user_ID) : ?>) comprueba si tienes qu estar registrado para publicar un comentario y si ya estás registrado (y conectado). Si la declaración condicional está disponible el script mostrará un enlace a donde los usuarios pueden registrarse. Si no se requiere registro o si ya estás conectado, el script continúa con la parte else (del inglés: "el resto" o "lo otro").

La declaración condicional final comprueba si estás conectado o no (usuario registrado y conectado). Si ya estás conectado no hace falta que rellenes tu nombre, email y web de nuevo, tomará esos datos de tu información de registro en el blog.

Insertando el Formulario

Felicidades, ya hemos pasado el mal trago de las declaraciones condicionales del fichero 'comments.php'. Ahora lo que nos queda es añadir el formulario.

Seguro que lo primero que has pensado es "¿donde demonios empieza el formulario?". Bueno, solo tienes que aplicar el sentido común. La segunda declaración condicional comprueba si hay que estar registrado o no, en consecuencia no habrá que mostrar un formulario después de esta declaración. Así que es fácil deducir que el formulario deberá estar situado dentro de esta declaración condicional.

PHP:
  1. <?php if(comments_open()) : ?> 
  2. <?php if(get_option('comment_registration') && !$user_ID) : ?> 
  3. <p>Debes <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">registrarte</a> para publicar un comentario.</p><?php else : ?> 
  4. <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"
  5. <?php if($user_ID) : ?> 
  6. <?php else : ?> 
  7. <?php endif; ?> 
  8. </form> 
  9. <?php endif; ?> 
  10. <?php else : ?> 
  11. <p>Los comentarios están cerrados.</p> 
  12. <?php endif; ?>

También hemos puesto el enlace a la página de registro, como aparece en el fichero 'comments.php' original. Como he comentado antes, la última declaración condicional comprueba si estás conectado o no. Obviamente, los campos de nombre, email y web solo se muestran si no estás conectado. Vamos a ello …

PHP:
  1. <?php if(comments_open()) : ?> 
  2. <?php if(get_option('comment_registration') && !$user_ID) : ?> 
  3. <p>Debes <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">registrarte</a> para publicar un comentariio.</p><?php else : ?> 
  4. <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"
  5. <?php if($user_ID) : ?> 
  6. <p>Conectado como <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Salir ahora">Salir &raquo;</a></p> 
  7. <?php else : ?> 
  8. <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?/>" size="22" tabindex="1" /> 
  9. <label for="author"><small>Nombre <?php if($req) echo "(requerido)"; ?></small></label></p> 
  10. <p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?/>" size="22" tabindex="2" /> 
  11. <label for="email"><small>Mail (no será visible) <?php if($req) echo "(requerido)"; ?></small></label></p> 
  12. <p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?/>" size="22" tabindex="3" /> 
  13. <label for="url"><small>Web</small></label></p> 
  14. <?php endif; ?> 
  15. </form> 
  16. <?php endif; ?> 
  17. <?php else : ?> 
  18. <p>Los comentarios están cerrados.</p> 
  19. <?php endif; ?>

¡Perfecto! Ya casi lo tenemos. Ahora solo necesitamos añadir unas cuantas líneas de código, como el área de texto o el botón de enviar. Estos van después de la última declaración condicional, ya que es irrelevante para estos elementos si estás registrado o no, se tienen que mostrar siempre.

PHP:
  1. <?php if(comments_open()) : ?> 
  2. <?php if(get_option('comment_registration') && !$user_ID) : ?> 
  3. <p>Debes <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">registrarte</a> para publicar un comentario.</p><?php else : ?> 
  4. <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform"
  5. <?php if($user_ID) : ?> 
  6. <p>Conectado como <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Salir ahora">Salir &raquo;</a></p> 
  7. <?php else : ?> 
  8. <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?/>" size="22" tabindex="1" /> 
  9. <label for="author"><small>Nombre <?php if($req) echo "(requerido)"; ?></small></label></p> 
  10. <p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?/>" size="22" tabindex="2" /> 
  11. <label for="email"><small>Mail (no será visible) <?php if($req) echo "(requerido)"; ?></small></label></p> 
  12. <p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?/>" size="22" tabindex="3" /> 
  13. <label for="url"><small>Web</small></label></p> 
  14. <?php endif; ?> 
  15. <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p> 
  16. <p><input name="submit" type="submit" id="submit" tabindex="5" value="Enviar Comentario" /> 
  17. <input type="hidden" name="comment_post_ID" value="<?php echo $id; ?/>" /></p> 
  18. <?php do_action('comment_form', $post->ID); ?> 
  19. </form> 
  20. <?php endif; ?> 
  21. <?php else : ?> 
  22. <p>Los comentarios están cerrados.</p> 
  23. <?php endif; ?>

Este código es auto-explicativo. Un campo de texto para el comentario, un botón de enviar, un campo oculto con el ID de comentario y el campo PHP (<?php do_action('comment_form', $post->ID); ?>) que WordPress necesita para hacer que funcione el comentario.

¡Voila! ¡Eso es todo amigos wordpreseros! Ya tenemos un fichero 'comments.php' completo.

5. Unos cuantos Trucos

Por supuesto, lo que tienes es un fichero 'comments.php' básico, pero hay toneladas de cosas que puedes añadir. Vamos a ver algunas.

Gravatars

Desde WordPress 2.5 hay una etiqueta de plantilla para insertar gravatars. Coloca un gravatar relativo al email del visitante. El código para hacer que tu plantilla muestre los gravatars es muy sencillo.

PHP:
  1. <?php echo get_avatar($author_email, $size, $default_avatar ); ?>

Puedes remplazar $author_email con la función get_comment_author_email();, $size es el tamaño del avatar y $default_avatar es un enlace a la imagen de avatar por defecto (mostrada cuando el que comenta no tiene gravatar).

Inserta este código dentro del loop de foreach que muestra los comentarios. Lo que se verá es una imagen con las clases avatar y avatar-$size (donde $size es el tamaño que especifiques).

Numerar Comentarios

Normalmente, la gente tiene un encabezado que muestra algo como "Hay 3 comentarios a esta entrada". Esto es muy fácil de añadir con las etiquetas de plantilla.

PHP:
  1. <?php comments_number($zero_comments, $one_comment, $more_comments); ?>

Es bastante obvio lo que hace: $zero_comments es el texto a mostrar cuando no hay comentarios, $one_comment para cuando hay un comentario y $more_comments cuando hay varios comentarios. Un ejemplo real de esto sería algo así:

PHP:
  1. <?php comments_number('No hay comentarios', 'Un comentario', '% comentarios'); ?>

He utilizado % para cuando hay varios comentarios, ya que la función comments_number remplaza el % con el número de comentarios (2, 3, …)

Enlace a los Comentarios

Para mostrar un enlace a la parte de los comentarios (con el número de comentarios que hay) solo tienes que usar este código:

PHP:
  1. <?php comments_popup_link($zero_comments, $one_comment, $more_comments, $css_class, $comments_closed); ?>

Los primeros 3 parámetros de esta función son los mismos que en la anterior función comments_number. $css_class es, obviamente, la clase CSS que te da la tag <a> (como se declaran los enlaces) y $comments_closed es el texto que debe mostrarse cuando los comentarios estén cerrados. Aplicando esto a una plantilla podría ser algo así:

PHP:
  1. <?php comments_popup_link('No hay comentarios', 'Un comentario', '% comentarios', 'comments-link', 'Los comentarios están cerrados'); ?>

Esto te daría un enlace con la clase comments-link.

Editando Comentarios

Seguro que hay veces en que querrías editar inmediatamente un comentario. Afortunadamente, con la función edit_comment_link puedes ir directamente a la página de edición del comentario sin tener que navegar por todo el panel. Se pondría así:

PHP:
  1. <?php edit_comment_link($link_text, $before_link, $after_link); ?>

Tienes que poner esto dentro del loop de comentarios foreach. Los parámetros son claros: $link_text es el texto para el enlace de edición, $before_link y $after_link respectivamente, son el texto o el código a mostrar antes o después del enlace.

Con esto puedes editar muy fácilmente un comentario; puedes simplemente añadir un pequeño enlace 'Editar' a tu información meta de comentario (solo visible por el admin).

Alternando Colores en los Comentarios

Es posible que quieras tener filas de distintos colores para tus comentarios, para que la separación entre los mismos sea clara. Hacer esto es relativamente fácil. En primer lugar añade este código al principio de la página:

PHP:
  1. function alternate_rows($i){<br />    if($i % 2) {<br />        echo ' class="alt"';<br />    } else {<br />        echo '';<br />    } 
  2. }

Luego añade lo siguiente dentro del loop foreach (de nuevo). Puedes, por ejemplo, remplazar <li id="comment-<?php comment_ID(); ?>"> con esto:

PHP:
  1. <?php $i++; ?> 
  2. <li <?php alternate_rows($i); ?> id="comment-<?php comment_ID(); ?>">

Esto le dará al resto de comentarios la clase alt, posibilitando el hecho de cambiar su aspecto mediante CSS.

Alternar los colores hará mas fácil de leer los comentarios de tu blog.

Mostrar las Etiquetas Permitidas

Para mostrar el código que los visitantes pueden usar en sus comentarios simplemente añade esta línea:

PHP:
  1. Tags permitidas: <?php echo allowed_tags(); ?>

Con esa función se muestra una lista de las etiquetas permitidas para insertar en los comentarios.


Bueno, pues eso es todo (o casi) con el fichero 'comments.php'. Espero que hayas aprendido algo y verlo pronto en tu blog. Si se te ocurre alguna función mas lo puedes contar en los "comentarios".

También te puede interesar:

14 comentarios | Escribe un comentario

  1. Comprendiendo el fichero comments.php | aNieto2K - 9/06/2008 a las 8:47

    [...] voy a entrar más en detalle, por que los chicos de AyudaWordpress lo han hecho ya y es imposible mejorar la traducción que han hecho sobre este gran artículo de NETTUTS. [...]

  2. TANDRO (11 comentarios) - 9/06/2008 a las 14:25

    Muy bueno. :)

  3. Angelfire (9 comentarios) - 9/06/2008 a las 22:53

    Muy muy bueno en realidad, en realidad fue una diseccion :)

  4. Pitonizza (30 comentarios) - 10/06/2008 a las 7:46

    Desde que cambié de template, desapareció el cajoncito para suscribirse a los comentarios, a pesar de tener el plugin activo.

    Otro problema molesto que tengo es que a pesar de estar logeada, debo volver a introducir mis datos como nombre, email, website.

    ¿Será que copypasteo la plantilla de la otra template y la “mezclo” con la actual para conservar las medidas del campo de comentarios? No se me ocurre qué más hacer.

  5. Fernando Tellado (879 comentarios) - 10/06/2008 a las 7:55

    Pitonizza, en algunas plantillas hay que incluir el código del plugin, que es este:

    < ?php show_subscription_checkbox(); ?> (sobra un espacio entre el primer < y ? ) ;)
    Colócalo donde quieras que aparezca, normalmente debajo del botón de Enviar comentario.

  6. Pitonizza (30 comentarios) - 10/06/2008 a las 8:10

    ¡Funcionó de maravilla! ¡Gracias Fernando, cuánta amabilidad! Para el otro problemita seguramente es algún trocito de código que desapareció en la edición pues a pesar de la amenaza “if you delete this the sky will fall on your head“, algo debí borrar.

  7. juani (4 comentarios) - 12/06/2008 a las 3:19

    Muy didáctica la explicación. muy buen post.
    Alguien sabe si se puede agregar un campo al comemment, por ejemplo: Título del comentario (como tienen en alzado.org)

  8. Fernando Tellado (879 comentarios) - 12/06/2008 a las 9:17

    Si que se puede, claro, es añadir un campo mas al formulario de comentarios.

  9. juani (4 comentarios) - 13/06/2008 a las 20:14

    Fernando, como repercute´agregar un campo al comment en la base de datos?

  10. hugo (1 comentarios) - 20/06/2008 a las 20:35

    hola, muy bueno el comentario

  11. Enlaces rápidos (II) | Otringal - 8/07/2008 a las 10:43

    [...] Diseccionando el archivo “coments.php”. [...]

  12. Manuel (1 comentarios) - 19/07/2008 a las 22:35

    A ver si alguien me ayuda con esto que me esta volviendo loco!!

    De repente sin haber modificado nada, ni instalado algun plugin nuevo me dejaron de entrar comentarios, al probar me di cuenta que al enviar aparece una pantalla integramente blanca y en la url me muestra http://www.misitio.com/blog/wp-comments-post.php

    Cosas que hice;
    Actualice a WP 2.5 (Tenia 2.3)
    probe sin plugins
    y nada…

    Lo curioso es que:
    Probe el mismo tema tal cual, con los plugins en otro servidor, y anda ok.
    Si en el servidor donde estoy cambio el theme si funcionan los comentarios…

    Algo que tambien vi es que me ingresa spam (limpie la db de todo spam que habia)

    Gracias!!!

  13. megaline (1 comentarios) - 26/08/2008 a las 12:38

    Hola, mi pagina esta en comments off, ya lo hice via las opciones y trate de buscar el comando en comments.php pero no resuelvo el problema, quiero que la gente comente en mi blog, sin tener que hacerlo manual en cada entrada que escribo, ojala me ayuden.

    Gracias

  14. Fernando Tellado (879 comentarios) - 26/08/2008 a las 18:50

    @megaline: como va a ser cosa del código de tu fichero comments.php mejor que lo postees en el foro que allí podemos verlo bien ;)

Escribe un comentario




XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>