Pregunta:
Estoy creando un sitio de reseñas y quiero mostrar las reseñas de los clientes (comentarios) en una página separada del single-restaurant.php. Solo tendré un enlace que dice (Leer reseñas / agregar las tuyas).
Creé una plantilla de comentarios personalizada y la llamé comments-side.php y esto es lo que tengo en ella:
<?php
/**
* Comments Template
*
*/
?>
<div id="comments-template" class="comments-side">
<div class="comments-wrap">
<div id="comments">
<?php if ( have_comments() ) : ?>
<?php do_atomic( 'before_comment_list' );// supreme_before_comment_list ?>
<ol class="comment-list">
<?php $args = array(
'walker' => null,
'max_depth' => '10',
'style' => 'ul',
'callback' => 'mytheme_comment',
'end-callback' => null,
'type' => 'all',
'reply_text' => 'Reply',
'length' => '10',
'page' => '',
'per_page' => '3',
'avatar_size' => 32,
'reverse_top_level' => null,
'reverse_children' => '',
'format' => 'xhtml', //or html5 @since 3.6
'short_ping' => false // @since 3.6
); ?>
<?php wp_list_comments( $args, $comments); ?>
</ol><!-- .comment-list -->
<?php endif; ?>
</div><!-- #comments -->
<?php $comment_args = array( 'fields' => apply_filters( 'comment_form_default_fields', array(
'author' => '<div class="form_row clearfix">' .
'<input id="author" name="author" type="text" value="' .
esc_attr( $commenter['comment_author'] ) . '" size="30"' . @$aria_req . ' PLACEHOLDER="'.__('Your name','supreme').'"/>' .
( $req ? ' <span class="required">*</span>' : '' ) .
'</div><!-- #form-section-author .form-section -->',
'email' => '<div class="form_row clearfix">' .
'<input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . @$aria_req . ' PLACEHOLDER="'.__('Email Address','supreme').'"/>' .
( $req ? ' <span class="required">*</span>' : '' ) .
'</div><!-- #form-section-email .form-section -->',
'url' => '<div class="form_row clearfix">' .
'<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30"' . @$aria_url . ' PLACEHOLDER="'.__('Website','supreme').'"/>'.'</div>')),
'comment_field' => '<div class="form_row clearfix">' .
'<textarea id="comments" name="comment" cols="45" rows="8" aria-required="true" PLACEHOLDER="'.__('Comments','supreme').'"></textarea>' .
( $req ? ' <span class="required">*</span>' : '' ) .
'</div><!-- #form-section-comment .form-section -->',
'comment_notes_after' => '',
'title_reply' => __( 'Add a comment', 'supreme' ),
);
if(get_option('default_comment_status') =='open'){
comment_form($comment_args); } // Loads the comment form. ?>
</div><!-- .comments-wrap -->
</div><!-- #comments-template -->
Sin embargo, cuando intento ir a la plantilla de comentarios ( http://myurl.com/post-slug/comments-side/ ), la página arroja un error 404. Cambié los enlaces permanentes a la configuración predeterminada y volví a cambiar a /% postname% / pero todavía obtengo el 404.
¿Cómo hago para que esto funcione correctamente?
No sé si es relevante, pero esto es lo que tengo en mi functions.php para los comentarios:
function mytheme_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment;
extract($args, EXTR_SKIP);
if ( 'div' == $args['style'] ) {
$tag = 'div';
$add_below = 'comment';
} else {
$tag = 'li';
$add_below = 'div-comment';
}
?>
<<?php echo $tag ?> <?php comment_class(empty( $args['has_children'] ) ? '' : 'parent') ?> id="comment-<?php comment_ID() ?>">
<?php if ( 'div' != $args['style'] ) : ?>
<div id="div-comment-<?php comment_ID() ?>" class="comment-body">
<?php endif; ?>
<div class="comment-author vcard">
<?php if ($args['avatar_size'] != 0) echo get_avatar( $comment, $args['avatar_size'] ); ?>
<?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>
</div>
<?php if ($comment->comment_approved == '0') : ?>
<em class="comment-awaiting-moderation"><?php _e('Your comment is awaiting moderation.') ?></em>
<br />
<?php endif; ?>
<div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>">
<?php
/* translators: 1: date, 2: time */
printf( __('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),' ','' );
?>
</div>
<?php comment_text($comment_ID); ?>
<a href="comments-side/#comment-<?php comment_ID() ?>" class="comment-more">read more</a>
<div class="reply">
<?php comment_reply_link(array_merge( $args, array('add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
</div>
<?php if ( 'div' != $args['style'] ) : ?>
</div>
<?php endif; ?>
<?php
}
Esto es lo que tengo en single-restaurant.php para mostrar los comentarios recientes para cada publicación del tipo de publicación "restaurantes"
<div class="sidereviews clearfix">
<h3>Recent Reviews</h3>
<?php comments_template( '/comments-side.php', true ); // Loads the comments-side.php template. ?>
</div><!--/sidereviews-->
Respuesta:
Necesita crear una página desde wp-admin->Pages
y asignar su plantilla como la "Plantilla". Hasta que no lo hagas, WordPress no sabrá dónde encontrar la "página", no sabrá qué hacer con la solicitud, y obtendrás un 404. Creo que eso es todo, de verdad.
Piense en dónde se encuentra realmente su archivo en el servidor ( http://sitename.com/wp-contents/themes/themename/comments-side.php
, pero está intentando acceder a él en http://myurl.com/post-slug/comments-side/
, exactamente donde no está. WordPress y el servidor conspiran para mentir sobre la ubicación de los archivos, por lo que, para que esto funcione, es necesario informar a WordPress sobre la página. Los mecanismos de reescritura no funcionarán de otra manera.
Lo mínimo para que sus comentarios funcionen es pasar la ID de la publicación a través de un parámetro de obtención como este: http://sitename.com/wp-contents/themes/themename/comments-side.php?sac=123
– y buscar comentarios como este:
if (isset($_GET['sac'])) {
$comments = get_comments(array('post_id'=>$_GET['sac']));
wp_list_comments('',$comments);
}
No puedo hacer que la función como have_comments
funcione, aunque no lo he intentado antes. Puede haber una forma de hacerlo. Por lo tanto, hasta nuevo aviso, elimine la have_comments
. Eso fallará.
No hay validación de datos en ese código. Solo estoy probando cosas. No presione la cadena GET
sin validación.