Как вывести comments_template() вне цикла WordPress?
Я создаю новый шаблон и мне нужно разместить шаблон комментариев вне цикла 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( '←', 'Ссылка на предыдущую запись', 'twentytwelve' ) . '</span> %title' ); ?></span>
<span class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '→', 'Ссылка на следующую запись', '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(); ?>

Хорошо, после некоторых исследований я нашел решение. Решение касается отображения комментариев 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);
Пожалуйста, не стесняйтесь сообщить, если есть более оптимальный способ реализации этого решения.
