Cómo colocar comments_template() fuera del bucle en WordPress

17 sept 2013, 02:05:52
Vistas: 17.5K
Votos: 4

Estoy creando una nueva plantilla y necesito colocar la plantilla de comentarios fuera del bucle de WordPress, justo encima del pie de página en el archivo single.php.

Busqué en Google y la mejor respuesta relacionada con mi problema que pude encontrar está en este enlace: https://stackoverflow.com/questions/6384205/displaying-the-wordpress-comments-template-outside-the-loop

Sin embargo, eso no funcionó. Los mismos comentarios aparecen en todas las publicaciones.

Entonces, ¿cómo puedo mostrar los comentarios fuera del bucle de WordPress?

EDIT: Este es el archivo single.php

<?php
get_header(); ?>

<div id="primary" class="site-content">
    <div id="content" role="main">

        <?php while ( have_posts() ) : the_post(); ?>

            <?php get_template_part( 'content-single', get_post_format() ); ?>

            <nav class="nav-single">
                <h3 class="assistive-text"><?php _e( 'Navegación de entradas', 'twentytwelve' ); ?></h3>
                <span class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '&larr;', 'Enlace a entrada anterior', 'twentytwelve' ) . '</span> %title' ); ?></span>
                <span class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '&rarr;', 'Enlace a siguiente entrada', 'twentytwelve' ) . '</span>' ); ?></span>
            </nav><!-- .nav-single -->

        <?php endwhile; // fin del bucle. ?>

    </div><!-- #content -->
</div><!-- #primary -->
<div id="secondary" class="sidebar-area" role="complementary">
    <?php get_sidebar(secondary); ?>
    <?php get_sidebar(); ?>
</div><!-- #secondary -->

<?php
comments_template( '', true );
?>

<?php get_footer(); ?>
4
Comentarios

Por favor, publica cualquier código que tengas ahora mismo que no esté funcionando.

mrwweb mrwweb
17 sept 2013 02:53:59

Vale, acabo de editar la publicación para incluir el código.

Gixty Gixty
17 sept 2013 04:26:59

A continuación, verifica que tienes los comentarios habilitados para la publicación que estás intentando usar y que estás viendo algo que utiliza la plantilla single.php.

mrwweb mrwweb
17 sept 2013 16:06:02

Sí, los comentarios están habilitados para la entrada que estoy viendo. El problema aquí es que el comments_template aparece, pero los comentarios que se hacen se muestran en todas las entradas.

Gixty Gixty
17 sept 2013 19:00:04
Todas las respuestas a la pregunta 1
0
10

Ok, después de investigar un poco encontré la solución. La solución es para mostrar los comentarios de WordPress fuera del loop y como bonus cómo colocar los comentarios de Disqus fuera del loop también.

Primero, cómo colocar los comentarios de WordPress fuera del loop:

En single.php necesitamos definir una nueva variable global para almacenar el ID del post (coloca esto dentro del loop)

global $postid;
$postid = get_the_ID();

Luego, podemos colocar la lista de comentarios fuera del loop con el siguiente código:

<ol class="commentlist">
    <?php    
        //Recolectar comentarios para una página/post específico
        $comments = get_comments(array(
            'post_id' => $postid,
            'status' => 'approve' //Cambia esto al tipo de comentarios a mostrar
        ));

        //Mostrar la lista de comentarios
        wp_list_comments(array(
            'per_page' => 10, //Permitir paginación de comentarios
            'reverse_top_level' => false //Mostrar los comentarios más recientes al inicio de la lista
        ), $comments);

    ?>
</ol>

También puedes colocar el formulario de comentarios y pasar el ID del post así:

<?php comment_form( $args, $postid ); ?>

Para DISQUS:

En single.php, necesitamos definir una segunda variable para obtener el título del post (coloca esto dentro del loop):

global $dposttitle;
$dposttitle = wp_title( '', false);

Y luego añade el siguiente llamado donde quieras mostrar tus comentarios de Disqus:

En las funciones de tu tema hijo añade lo siguiente:

function disqus_embed($disqus_shortname, $postid, $dposttitle) {
    global $post;
    wp_enqueue_script('disqus_embed','http://'.$disqus_shortname.'.disqus.com/embed.js');
    echo '<div id="disqus_thread"></div>
    <script type="text/javascript">
        var disqus_shortname = "'.$disqus_shortname.'";
        var disqus_title = "'.$dposttitle.'";
        var disqus_url = "'.get_permalink($postid).'";
        var disqus_identifier = "'.$disqus_shortname.'-'.$postid.'";
    </script>';
}

Finalmente, llama a disqus_embed fuera del loop en single.php

disqus_embed($disqus_shortname, $postid, $dposttitle);

Por favor, dime si hay una mejor manera de implementar esto.

17 sept 2013 21:35:30