Постраничная навигация в комментариях WordPress без плагина

Постраничная навигация WordPress

Так же, как и при создании постраничной навигации в архивах сайта, работающего на движке WordPress, можно сделать постраничную навигацию в комментариях без использования каких-либо плагинов.

Для этого используется специальная функция paginate_comments_links(), которая появилась в WordPress версии 2.7. Работает она на основе функции вывода постраничной навигации в архивах, а потому очень на нее похожа.

Код выглядит следующим образом:

function wp_comments_corenavi() {
	$pages = '';
	$max = get_comment_pages_count();
	$page = get_query_var('cpage');
	if (!$page) $page = 1;
	$a['current'] = $page;
	$a['echo'] = false;

	$total = 0; //1 - выводить текст "Страница N из N", 0 - не выводить
	$a['mid_size'] = 3; //сколько ссылок показывать слева и справа от текущей
	$a['end_size'] = 1; //сколько ссылок показывать в начале и в конце
	$a['prev_text'] = '«'; //текст ссылки "Предыдущая страница"
	$a['next_text'] = '»'; //текст ссылки "Следующая страница"

	if ($max > 1) echo '<div class="commentNavigation">';
	if ($total == 1 && $max > 1) $pages = '<span class="pages">Страница ' . $page . ' из ' . $max . '</span>'."\r\n";
	echo $pages . paginate_comments_links($a);
	if ($max > 1) echo '</div>';
}

Этот код вставьте в файл functions.php вашего шаблона. Здесь, как видите, те же самые 5 опций. Для наглядности я их также отделил разрывом строки.

Чтобы непосредственно отобразить постраничную навигацию в комментариях, вставьте следующий код в файл comments.php своего шаблона рядом с функцией wp_list_comments():

<?php if(function_exists('wp_comments_corenavi')) wp_comments_corenavi(); ?>

Ну и, конечно же, в html-коде полученной навигации присутствуют все необходимые классы, чтобы ее можно было красиво оформить с помощью CSS:

<div class="commentNavigation">
	<a class="prev page-numbers" href="http://wordpress32/post/comment-page-6/#comments">&laquo;</a>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-1/#comments'>1</a>
	<span class="page-numbers dots">...</span>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-4/#comments'>4</a>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-5/#comments'>5</a>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-6/#comments'>6</a>
	<span class='page-numbers current'>7</span>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-8/#comments'>8</a>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-9/#comments'>9</a>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-10/#comments'>10</a>
	<span class="page-numbers dots">...</span>
	<a class='page-numbers' href='http://wordpress32/post/comment-page-14/#comments'>14</a>
	<a class="next page-numbers" href="http://wordpress32/post/comment-page-8/#comments">&raquo;</a>
</div>

Пользуйтесь.

P.S. Не забудьте, что для того, чтобы работала постраничная навигация в комментариях, необходимо активировать разбивку комментариев на страницы, зайдя в админку на страницу «Параметры — Обсуждение».

Комментарии (71)

  1. Дмитрий
    2 августа 2012 г. в 14:51

    Цифры появились. В записи 12 комментариев, появились 2 цифры 1 и 2, но на первой и второй странице отображаютя все 12 комментариев. В чем может быть проблема, подскажите, пожалуйста?
    В админке стоит галочка — «Разбивать комментарии верхнего уровня на страницы по 10 штук, по умолчанию отображается последняяпервая страница «

    1. 2 августа 2012 г. в 15:14 / ответ на коммент Дмитрий

      Скорее всего это связано с тем, что у вас используется старый код вывода комментариев. Т.е. видимо, без функции wp_list_comments() работать не будет.

  2. Дмитрий
    2 августа 2012 г. в 15:17

    Понятно, спасибо.

  3. Дмитрий
    2 августа 2012 г. в 18:08

    Взял файл comments.php из другого шаблона с функцией wp_list_comments(), чуть переделал — нормально все работает. Спасибо.
    Хотел еще спросить. Не помню где, но точно видел — тоже постраничная навигация в комментариях, но страница с цельным текстом только последняя (или первая, т.е. с изначальным URL), а остальные страницы с анонсом записи. Не подскажите как это можно сделать?

    1. 2 августа 2012 г. в 20:32 / ответ на коммент Дмитрий

      Когда-то сам такое делал, но уже не помню, код не сохранился.

  4. Дмитрий
    6 августа 2012 г. в 16:18

    Здравствуйте. Еще раз спасибо, все работает. Но есть одна проблема. При отправке комментария не с последней станицы у меня не происходит редиректа на последнюю страницу, т.е. пользователь, отправив комментарий, остается на той же странице и не видит отправлен его комментарий, или нет. Для того, что бы увидеть свой коммент (или сообщение о том, что он будет опубликован после проверки) нужно перейти на последнюю страницу. Подскажите, пожалуйста, в чем проблема и как ее исправить?

    1. 6 августа 2012 г. в 16:22 / ответ на коммент Дмитрий

      Не представляю, в чем может быть причина. Никогда с подобным не сталкивался.

  5. Павел
    8 августа 2012 г. в 22:42

    Дружище, я тебе люблю!!! Ты мне очень помог! Спасибо :)

  6. VRS
    12 сентября 2012 г. в 20:22

    Спасибо! как всегда выручили!
    Избавилась еще от одного плагина навигации.

  7. 14 сентября 2012 г. в 05:31

    Здравствуйте, Dimox! Успешно использую ваш код на одном из сайтов. Возникла проблема дублирования title на страницах комментариев. Как сделать, чтоб на этих страницах после тайтла дописывалось что-то типа: — страница комментариев 2.

    Тайтлы выводятся плагином ALL in SEO. Я находил различные коды условий проверки на страницу комментария и дописывал в файле header.php темы перед закрывающим тегом title. Не работает. Может, это как-то связано с вашим кодом, который я использую? Он у меня в functions.php.

    Версия вордпресса 3.4.1. Помогите, пожалуйста.

    1. Решение здесь — http://wphacks.name/avoid-duplicate-titles-in-paged-comments/. Если не работает, значит нужно отказаться от использования ALL in SEO, т.к. он заголовки делает по-своему.

      1. Да, это решение не работает. Но я логики не могу понять. Я же не лезу в ALL in seo. Как я понимаю, он в wp_title(); подставляет свое. Я же это не трогаю, просто после этой функции хочу вывести, если это страница комментария, свой код.

  8. Дмитрий
    13 ноября 2012 г. в 02:19

    А чем у вас организована навигация? Этими правками, или плагинами?
    Особенно интересно выглядит кнопка «(ответить)».
    Заранее спасибо за ответ.

    1. 13 ноября 2012 г. в 09:49 / ответ на коммент Дмитрий

      Конечно этим кодом.

  9. 2 мая 2013 г. в 19:28

    Спасибо, код рабочий. Возникает два момента:
    1) Стили. Куда впихивать дивы? Если впихнуть в шаблон там, где выводим комменты, то выводится две навигации.

    2) Важный! А как поступить, если на первой страницы навигации комментов должны выводиться самые свежие? По умолчанию они на последней. Копание в админке, как и в интернете результатов не дало.

    Даже если мы выбираем отобразить на странице комментарии с последней (самой новой) страницы, то всё ок, они выводятся, да только на этой странице не 10 комментов, а два, например (на остальных по десять).

    1. 2 мая 2013 г. в 20:02 / ответ на коммент ushi

      1) В comments.php. Значит что-то неправильно делаете.
      2) Без понятия.

  10. 2 мая 2013 г. в 21:36

    Забыли про пункт 2. Появился пункт 3.

    3) А что если я хочу перейти на определенны комментарий? Например, http://xn—-7sbqtiudfgnm6i.xn--p1ai/otzyvy-i-kommentarii-o-medikamentoznom-aborte/#comment-377. Но вместо перехода на указанный коммент, меня выкидывает на первую страницу всех комментариев. Как исправить?

    1. 2 мая 2013 г. в 22:59 / ответ на коммент ushi

      Или как мне вернуть (получить) параметр номера страницы комментария (для comment-page-16, это 16)?

      1. 3 мая 2013 г. в 01:07 / ответ на коммент ushi

        Т.е. каким-то образом, зная номер комментария вернуть значение страницы, где он расположен.

  11. 27 августа 2013 г. в 15:23

    Спасибо. Пригодилось для моего блога

  12. 25 марта 2014 г. в 10:15

    Здравствуйте! Спасибо за код! Все работает, но почему-то среди кнопочек не показывается «…», а висит где-то справа-сверху, нумерация же идет сплошным рядом 1,2,4 Подскажите, плиз, что сделать, чтобы … на место прописать?
    И еще — можно ли как-то убрать кнопочки с «предыдущей» и «следующей» страницами? А то получается 2 ссылки на одну и туже страницу — зачем они?
    Заранее спасибо!

    1. 25 марта 2014 г. в 11:01 / ответ на коммент Надежда

      Все работает, но почему-то среди кнопочек не показывается «…», а висит где-то справа-сверху, нумерация же идет сплошным рядом 1,2,4 Подскажите, плиз, что сделать, чтобы … на место прописать?

      Наугад сложно сказать. Возможно, написан неправильный CSS-код.

      И еще — можно ли как-то убрать кнопочки с «предыдущей» и «следующей» страницами? А то получается 2 ссылки на одну и туже страницу — зачем они?

      Такой возможности, к сожалению, нет.

      1. 26 марта 2014 г. в 00:09 / ответ на коммент Dimox

        css я не мудрствуя лукаво прописала тот же, что и к навигации главной страницы (она в теме встроенная) Что там может быть неправильно?
        Изменила в Вашем коде commentNavigation в диве на pagination, тем самым напрямую подключив его к стилю навигации шаблона. Получилось, но проблема-таки осталась — висит «…» в правом углу
        В коде элемент «…» читается на главной …, а в комментах: …
        Разобралась, пока писала! Нужно было просто добавить .pagination span.dots в css рядом с .pagination span.extend И проблема решилась, ура!
        Может, кому пригодится :)

  13. Сергей
    5 ноября 2014 г. в 20:20

    У вас страница доступна по двум адресам. Сначала по:
    …./wordpress-comments-pagination-without-a-plugin/
    И по странице
    wordpress-comments-pagination-without-a-plugin/comment-page-2/#comments
    Это когда переходишь на постраничной навигации комментариев.
    Как можно такое исправить? Может каким редиректом?

  14. Uthvfy
    29 ноября 2015 г. в 05:59

    а как сделать чтобы выводилось не 3 страницы, а столько сколько есть? У меня только 2 страницы, зачем мне 3я? Или допустим у меня 20 стр., тогда 1,2.3… 20.

  15. Дмитрий
    9 ноября 2016 г. в 19:08

    А как быть, если я менял вывод комментариев функциями в functions.php и сейчас у меня пагинация выводится, но на каждой странице идет повтор первой страницы комментариев?

    код для изменения брал с этого сайта wordsmall ru/sajtostroenie/wordpress-kommentarii-polnoe-oformlenie-vneshnego-vida.html

    Если вернуть встроенный вывод комментариев, то всё работает.

  16. max
    22 января 2018 г. в 17:34

    Всё круто, но, подскажите пожалуйста, как убрать в ссылке на предыдущую/следующую страницу комментариев вот это — #comments. Удалил в /wp-includes/comment-template.php — не помогло.
    Заранее спасибо.

    1. 22 января 2018 г. в 17:40 / ответ на коммент max

      После строки:

      $a['echo'] = false;

      добавьте:

      $a['add_fragment'] = '';
  17. Захар
    15 марта 2018 г. в 15:11

    Добрый день, не подскажите как у вас реализован вывод только анонса (цитаты) поста на страницах пагинации комментариев, а не всего поста целиком?

    1. 15 марта 2018 г. в 17:13 / ответ на коммент Захар

      Вот так:

      <?php if ( $cpage > 0 ) { ?>
      
      	<p><?php echo wp_trim_words(get_the_excerpt(), 43, ' ...'); ?></p>
      
      <?php } else { ?>
      
      	<?php the_content(); ?>
      
      <?php } ?>
      
  18. Тимур
    26 февраля 2019 г. в 12:41

    Добрый день! Подскажите пожалуйста как вывести полный путь URL на 1 странице комментариев, как у Вас comment-page-1/#comments? У меня выводится только #comments

    1. 26 февраля 2019 г. в 16:54 / ответ на коммент Тимур

      Это делает код из статьи.

  19. Тимур
    26 февраля 2019 г. в 12:44

    И ещё вопрос. У Вас в Яндекс браузере отображается на русском страница комментариев на которой мы находимся, как этого добиться?

    1. 26 февраля 2019 г. в 16:57 / ответ на коммент Тимур

      Если речь про заголовок окна браузера, то ответ здесь.

  20. zmoe
    11 июня 2019 г. в 12:19

    Я смотрю создается дополнительная страница дублирующая основную статью, а у вас ни canonical не прописан, не metarobots, просто в robots.txt закрыли?

    1. 11 июня 2019 г. в 15:47 / ответ на коммент zmoe

      Ничего из этого не делал.

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код