Как вывести comments_template() вне цикла WordPress?

17 сент. 2013 г., 02:05:52
Просмотры: 17.5K
Голосов: 4

Я создаю новый шаблон и мне нужно разместить шаблон комментариев вне цикла WordPress, прямо перед футером в файле single.php.

Я искал в Google, и лучший ответ, который я нашел по моей проблеме, находится по этой ссылке: https://stackoverflow.com/questions/6384205/displaying-the-wordpress-comments-template-outside-the-loop

Однако это не сработало. Одинаковые комментарии появляются на всех записях.

Итак, как я могу отображать комментарии вне цикла WordPress?

РЕДАКТИРОВАТЬ: Вот содержимое файла 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( 'Навигация по записям', 'twentytwelve' ); ?></h3>
                <span class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '&larr;', 'Ссылка на предыдущую запись', 'twentytwelve' ) . '</span> %title' ); ?></span>
                <span class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '&rarr;', 'Ссылка на следующую запись', 'twentytwelve' ) . '</span>' ); ?></span>
            </nav><!-- .nav-single -->

        <?php endwhile; // конец цикла. ?>

    </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
Комментарии

Пожалуйста, опубликуйте любой код, который у вас есть сейчас и который не работает.

mrwweb mrwweb
17 сент. 2013 г. 02:53:59

Хорошо, я только что отредактировал пост, добавив код.

Gixty Gixty
17 сент. 2013 г. 04:26:59

Далее, дважды проверьте, что у вас включены комментарии для того поста, который вы пытаетесь использовать, и что вы смотрите на что-то, что использует шаблон single.php.

mrwweb mrwweb
17 сент. 2013 г. 16:06:02

Да, комментарии включены для записи, которую я просматриваю. Проблема в том, что comments_template отображается, но оставленные комментарии появляются на всех записях.

Gixty Gixty
17 сент. 2013 г. 19:00:04
Все ответы на вопрос 1
0
10

Хорошо, после некоторых исследований я нашел решение. Решение касается отображения комментариев WordPress вне цикла, а также, в качестве бонуса, как разместить комментарии Disqus вне цикла.

Во-первых, как разместить комментарии WordPress вне цикла:

В файле single.php нам нужно определить новую глобальную переменную для хранения ID записи (разместите это внутри цикла):

global $postid;
$postid = get_the_ID();

Затем мы можем разместить список комментариев вне цикла с помощью следующего кода:

<ol class="commentlist">
    <?php    
        // Собираем комментарии для конкретной страницы/записи
        $comments = get_comments(array(
            'post_id' => $postid,
            'status' => 'approve' // Измените это для отображения нужного типа комментариев
        ));

        // Отображаем список комментариев
        wp_list_comments(array(
            'per_page' => 10, // Включаем пагинацию комментариев
            'reverse_top_level' => false // Показываем новые комментарии вверху списка
        ), $comments);

    ?>
</ol>

Вы также можете разместить форму комментариев и передать ID записи следующим образом:

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

Для DISQUS:

В файле single.php нам нужно определить вторую переменную для получения заголовка записи (разместите это внутри цикла):

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

Затем добавьте следующий вызов там, где вы хотите отображать комментарии Disqus:

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

Наконец, вызовите disqus_embed вне цикла в single.php:

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

Пожалуйста, не стесняйтесь сообщить, если есть более оптимальный способ реализации этого решения.

17 сент. 2013 г. 21:35:30