Come posizionare comments_template() fuori dal loop in WordPress?

17 set 2013, 02:05:52
Visualizzazioni: 17.5K
Voti: 4

Sto creando un nuovo template e ho bisogno di posizionare il template dei commenti fuori dal loop WordPress, appena sopra il footer nel file single.php.

Ho cercato su Google e la risposta migliore che ho trovato relativa al mio problema è in questo link: https://stackoverflow.com/questions/6384205/displaying-the-wordpress-comments-template-outside-the-loop

Tuttavia, non ha funzionato. Gli stessi commenti appaiono in tutti i post.

Quindi, come posso visualizzare i commenti fuori dal loop wp?

MODIFICA: Questo è il file 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( 'Navigazione articolo', 'twentytwelve' ); ?></h3>
                <span class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '&larr;', 'Link articolo precedente', 'twentytwelve' ) . '</span> %title' ); ?></span>
                <span class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '&rarr;', 'Link articolo successivo', 'twentytwelve' ) . '</span>' ); ?></span>
            </nav><!-- .nav-single -->

        <?php endwhile; // fine del 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(); ?>
4
Commenti

Per favore pubblica qualsiasi codice che hai al momento e che non funziona.

mrwweb mrwweb
17 set 2013 02:53:59

ok ho appena modificato il post per includere il codice.

Gixty Gixty
17 set 2013 04:26:59

Successivamente, ricontrolla che hai abilitato i commenti per il post che stai provando a usare e che stai guardando qualcosa che utilizza il template single.php.

mrwweb mrwweb
17 set 2013 16:06:02

Sì, i commenti sono abilitati per il post che sto visualizzando. Il problema qui è che il comments_template viene visualizzato, ma i commenti effettuati compaiono su tutti i post.

Gixty Gixty
17 set 2013 19:00:04
Tutte le risposte alla domanda 1
0
10

ok, dopo alcune ricerche ho trovato la soluzione. La soluzione riguarda la visualizzazione dei commenti di WordPress al di fuori del loop e come bonus come posizionare anche i commenti Disqus al di fuori del loop.

Primo, come posizionare i commenti di WordPress al di fuori del loop:

In single.php dobbiamo definire una nuova variabile globale per memorizzare l'ID del post (posiziona questo dentro il loop)

global $postid;
$postid = get_the_ID();

Poi, possiamo posizionare la lista dei commenti al di fuori del loop con il seguente codice:

<ol class="commentlist">
    <?php    
        //Raccogli i commenti per una specifica pagina/post 
        $comments = get_comments(array(
            'post_id' => $postid,
            'status' => 'approve' //Modifica questo per il tipo di commenti da visualizzare
        ));

        //Visualizza la lista dei commenti
        wp_list_comments(array(
            'per_page' => 10, //Permetti la paginazione dei commenti
            'reverse_top_level' => false //Mostra i commenti più recenti in cima alla lista
        ), $comments);

    ?>
</ol>

Puoi anche posizionare il form dei commenti e passare l'ID del post come segue:

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

Per DISQUS:

In single.php, dobbiamo definire una seconda variabile per ottenere il titolo del post (posiziona questo dentro il loop):

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

E poi aggiungi la seguente chiamata dove vuoi visualizzare i tuoi commenti Disqus:

Nel tuo tema child aggiungi la seguente funzione a functions.php:

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

Infine, chiama disqus_embed al di fuori del loop in single.php

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

Sentiti libero di dirmi se c'è un modo migliore per implementare tutto questo.

17 set 2013 21:35:30