Cum să plasez comments_template() în afara loop-ului WordPress?

17 sept. 2013, 02:05:52
Vizualizări: 17.5K
Voturi: 4

Lucrez la un nou șablon și trebuie să plasez template-ul de comentarii în afara loop-ului WordPress, chiar deasupra footer-ului în fișierul single.php.

Am căutat pe Google și cel mai bun răspuns legat de problema mea este în acest link: https://stackoverflow.com/questions/6384205/displaying-the-wordpress-comments-template-outside-the-loop

Totuși, soluția respectivă nu a funcționat. Aceleași comentarii apar pe toate postările.

Deci, cum pot afișa corect comentariile în afara loop-ului WordPress?

EDIT: Acesta este conținutul fișierului 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( 'Navigare postare', 'twentytwelve' ); ?></h3>
                <span class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '&larr;', 'Link postare anterioară', 'twentytwelve' ) . '</span> %title' ); ?></span>
                <span class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '&rarr;', 'Link postare următoare', 'twentytwelve' ) . '</span>' ); ?></span>
            </nav><!-- .nav-single -->
4
Comentarii

Te rog să postezi orice cod ai în momentul de față care nu funcționează.

mrwweb mrwweb
17 sept. 2013 02:53:59

ok, tocmai am editat postarea pentru a include codul.

Gixty Gixty
17 sept. 2013 04:26:59

În continuare, verifică din nou dacă ai activat comentariile pentru postarea pe care încerci să o folosești și că te uiți la ceva care utilizează șablonul single.php.

mrwweb mrwweb
17 sept. 2013 16:06:02

Da, comentariile sunt activate pentru postarea pe care o vizualizez. Problema aici este că comments_template apare, dar comentariile care sunt făcute apar pe toate postările.

Gixty Gixty
17 sept. 2013 19:00:04
Toate răspunsurile la întrebare 1
0
10

ok, după o cercetare am găsit soluția. Soluția este pentru afișarea comentariilor WordPress în afara loop-ului și ca bonus cum să plasați comentariile Disqus în afara loop-ului.

În primul rând, cum să plasați comentariile WordPress în afara loop-ului:

În single.php trebuie să definim o variabilă globală nouă pentru stocarea ID-ului postului (plasați acest cod în interiorul loop-ului)

global $postid;
$postid = get_the_ID();

Apoi, putem plasa lista de comentarii în afara loop-ului cu următorul cod:

<ol class="commentlist">
    <?php    
        //Colectăm comentariile pentru o pagină/post specific
        $comments = get_comments(array(
            'post_id' => $postid,
            'status' => 'approve' //Schimbați această valoare pentru tipul de comentarii de afișat
        ));

        //Afișăm lista de comentarii
        wp_list_comments(array(
            'per_page' => 10, //Permitem paginarea comentariilor
            'reverse_top_level' => false //Arătăm cele mai recente comentarii în partea de sus a listei
        ), $comments);

    ?>
</ol>

De asemenea, puteți plasa formularul de comentarii și transmite ID-ul postului astfel:

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

Pentru DISQUS:

În single.php, trebuie să definim o a doua variabilă pentru a obține titlul postului (plasați acest cod în interiorul loop-ului):

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

Și apoi adăugați următorul apel oriunde doriți să afișați comentariile Disqus:

În fișierul functions.php al temei child, adăugați următoarele:

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

În final, apelați disqus_embed în afara loop-ului în single.php

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

Vă rog să îmi spuneți dacă există o metodă mai bună de a implementa acest lucru.

17 sept. 2013 21:35:30