Vamos con dos plantillas más, esta vez las que generan la página del post (single.php) y la de los comentarios (comment.php).
SINGLE.PHP
Creamos el archivo single.php y añadimos el siguiente código:
[codesyntax lang=»php»]
<?php get_header(); ?> <div id="primary"> <div id="content" role="main"> <?php while ( have_posts() ) : the_post(); ?> <nav id="nav-single"> <h3 class="assistive-text"><?php _e( 'Post navigation', 'newtheme' ); ?></h3> <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">←</span> Previous', 'newtheme' ) ); ?></span> <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">→</span>', 'newtheme' ) ); ?></span> </nav><!-- #nav-single --> <?php get_template_part( 'content', 'single' ); ?> <?php comments_template( '', true ); ?> <?php endwhile; // end of the loop. ?> </div><!-- #content --> </div><!-- #primary --> <?php get_footer(); ?>
[/codesyntax]
Como puedes ver la estructura de este archivo es muy parecida a la de index.php, tenemos una llamada get_header() para crear la cabecera y otra a get_footer() para crear el pie. En medio encontramos el bloque que generará el html para mostrar el post. Tenemos el mismo bucle que teníamos en la página principal además de dos funciones que generan los links hacia el post anterior y el posterior: previous_post_link() y next_post_link().
Se hace una llamada a get_template_part() que cargará la plantilla content-single.php.
Por último carga la plantilla de comentarios con la función comments_template().
COMMENTS.PHP
Crea el archivo comments.php y añade el siguiente código:
[codesyntax lang=»php»]
<div id="comments"> <?php if ( post_password_required() ) : ?> <p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'newtheme' ); ?></p> </div><!-- #comments --> <?php /* Stop the rest of comments.php from being processed, * but don't kill the script entirely -- we still have * to fully load the template. */ return; endif; ?> <?php // You can start editing here -- including this comment! ?> <?php if ( have_comments() ) : ?> <h2 id="comments-title"> <?php printf( _n( 'One thought on “%2$s”', '%1$s thoughts on “%2$s”', get_comments_number(), 'newtheme' ), number_format_i18n( get_comments_number() ), '<span>' . get_the_title() . '</span>' ); ?> </h2> <?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> <nav id="comment-nav-above"> <h1 class="assistive-text"><?php _e( 'Comment navigation', 'newtheme' ); ?></h1> <div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'newtheme' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'newtheme' ) ); ?></div> </nav> <?php endif; // check for comment navigation ?> <ol class="commentlist"> <?php /* Loop through and list the comments. Tell wp_list_comments() * to use newtheme_comment() to format the comments. * If you want to overload this in a child theme then you can * define newtheme_comment() and that will be used instead. * See newtheme_comment() in newytheme/functions.php for more. */ wp_list_comments( array( 'callback' => 'newtheme_comment' ) ); ?> </ol> <?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> <nav id="comment-nav-below"> <h1 class="assistive-text"><?php _e( 'Comment navigation', 'newtheme' ); ?></h1> <div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'newtheme' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'newtheme' ) ); ?></div> </nav> <?php endif; // check for comment navigation ?> <?php /* If there are no comments and comments are closed, let's leave a little note, shall we? * But we don't want the note on pages or post types that do not support comments. */ elseif ( ! comments_open() && ! is_page() && post_type_supports( get_post_type(), 'comments' ) ) : ?> <p class="nocomments"><?php _e( 'Comments are closed.', 'newtheme' ); ?></p> <?php endif; ?> <?php comment_form(); ?> </div><!-- #comments -->
[/codesyntax]
Vamos a ver este código poco a poco:
[codesyntax lang=»php»]
<div id="comments"> <?php if ( post_password_required() ) : ?> <p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'newtheme' ); ?></p> </div><!-- #comments --> <?php /* Stop the rest of comments.php from being processed, * but don't kill the script entirely -- we still have * to fully load the template. */ return; endif; ?>
[/codesyntax]
En primer lugar comprobamos si los comentarios están protegidos por contraseña, si es así se devuelve un return, que evitará que el resto de la plantilla se procese, pero se continuará ejecutando el script.
En el caso de que los comentarios no estén protegidos por contraseña, se comprueba que el post tenga comentarios utilizando la función have_comments(), si es que sí los tiene se genera el html correspondiente.
[codesyntax lang=»php»]
<?php if ( have_comments() ) : ?> <h2 id="comments-title"> <?php printf( _n( 'One thought on “%2$s”', '%1$s thoughts on “%2$s”', get_comments_number(), 'newtheme' ), number_format_i18n( get_comments_number() ), '<span>' . get_the_title() . '</span>' ); ?> </h2>
[/codesyntax]
Como ves, aquí se comprueba si hay comentarios, en caso positivo se crea la cabecera de los comentarios.
[codesyntax lang=»php»]
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> <nav id="comment-nav-above"> <h1 class="assistive-text"><?php _e( 'Comment navigation', 'newtheme' ); ?></h1> <div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'newtheme' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'newtheme' ) ); ?></div> </nav> <?php endif; // check for comment navigation ?>
[/codesyntax]
Se crea el sistema de navegación de los comentarios, para mostrar los comentarios más recientes o los más antiguos.
[codesyntax lang=»php»]
<ol class="commentlist"> <?php /* Loop through and list the comments. Tell wp_list_comments() * to use newtheme_comment() to format the comments. * If you want to overload this in a child theme then you can * define newtheme_comment() and that will be used instead. * See newtheme_comment() in newytheme/functions.php for more. */ wp_list_comments( array( 'callback' => 'newtheme_comment' ) ); ?> </ol>
[/codesyntax]
Añadimos los comentarios utilizando una llamada a wp_list_comments(), en el que se indica que procese los datos de los comentarios utilizando la función newtheme_comment que encontrará en el archivo functions.php.
Para ver otros argumentos que se le pueden indicar a la función wp_list_comments() ver http://codex.wordpress.org/Function_Reference/wp_list_comments
[codesyntax lang=»php»]
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> <nav id="comment-nav-below"> <h1 class="assistive-text"><?php _e( 'Comment navigation', 'newtheme' ); ?></h1> <div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'newtheme' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'newtheme' ) ); ?></div> </nav> <?php endif; // check for comment navigation ?>
[/codesyntax]
Volvemos a crear el sistema de navegación de los comentarios, pero esta vez al finalizar la lista de comentarios.
[codesyntax lang=»php»]
<?php /* If there are no comments and comments are closed, let's leave a little note, shall we? * But we don't want the note on pages or post types that do not support comments. */ elseif ( ! comments_open() && ! is_page() && post_type_supports( get_post_type(), 'comments' ) ) : ?> <p class="nocomments"><?php _e( 'Comments are closed.', 'newtheme' ); ?></p> <?php endif; ?> <?php comment_form(); ?> </div><!-- #comments -->
[/codesyntax]
Por último mostramos un mensaje en el caso de que los comentarios estén cerrados, además, mostramos el formulario para enviar un comentario.