How to place comments_template(); outside the loop?

I am making a new template and I need to place the comments template outside the wordpress loop and just above the footer in the single.php file.

I searched on google and the best answered I could find related to my issue is in this link: https://stackoverflow.com/questions/6384205/displaying-the-wordpress-comments-template-outside-the-loop

However, that did not work. The same comments are appearing on all posts.

So, how can I display the comments display outsite the wp loop?

EDIT: This is the single.php file

?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( 'Post navigation', 'twentytwelve' ); ?/h3
                span class="nav-previous"?php previous_post_link( '%link', 'span class="meta-nav"' . _x( 'larr;', 'Previous post link', 'twentytwelve' ) . '/span %title' ); ?/span
                span class="nav-next"?php next_post_link( '%link', '%title span class="meta-nav"' . _x( 'rarr;', 'Next post link', 'twentytwelve' ) . '/span' ); ?/span
            /nav!-- .nav-single --



        ?php endwhile; // end of the loop. ?

    /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(); ?

Topic comments-template outside-wordpress loop Wordpress

Category Web


ok, after some research I came up with the solution. The solution is for displaying wordpress comments outside the loop and as a bonus how to place disqus comments outside the loop as well.

First, How to place wordpress comments outside the loop:

In single.php we need to define a new global variable for storing the post id (place this inside the loop)

global $postid;
$postid = get_the_ID();

Then, we can place the list of comments outside the loop with the following code:

<ol class="commentlist">
    <?php    
        //Gather comments for a specific page/post 
        $comments = get_comments(array(
            'post_id' => $postid,
            'status' => 'approve' //Change this to the type of comments to be displayed
        ));

        //Display the list of comments
        wp_list_comments(array(
            'per_page' => 10, //Allow comment pagination
            'reverse_top_level' => false //Show the latest comments at the top of the list
        ), $comments);

    ?>
</ol>

You can as well place the comment form and pass the post id as follows:

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

For DISQUS:

In single.php, We need to define a second variable to get the post title (place this inside the loop):

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

And then add the following call wherever you want to display your disqus comments:

In your child's theme functions add the following:

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>';
}

Finally, call disqus_embed outside the loop in single.php

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

Please feel free to tell me if there is a better way to implement this.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.