Постраничная навигация в комментариях 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">«</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">»</a>
</div>
Пользуйтесь.
P.S. Не забудьте, что для того, чтобы работала постраничная навигация в комментариях, необходимо активировать разбивку комментариев на страницы, зайдя в админку на страницу «Параметры — Обсуждение».
Комментарии (71)
Цифры появились. В записи 12 комментариев, появились 2 цифры 1 и 2, но на первой и второй странице отображаютя все 12 комментариев. В чем может быть проблема, подскажите, пожалуйста?
В админке стоит галочка — «Разбивать комментарии верхнего уровня на страницы по 10 штук, по умолчанию отображается последняяпервая страница «
Скорее всего это связано с тем, что у вас используется старый код вывода комментариев. Т.е. видимо, без функции wp_list_comments() работать не будет.
Понятно, спасибо.
Взял файл comments.php из другого шаблона с функцией wp_list_comments(), чуть переделал — нормально все работает. Спасибо.
Хотел еще спросить. Не помню где, но точно видел — тоже постраничная навигация в комментариях, но страница с цельным текстом только последняя (или первая, т.е. с изначальным URL), а остальные страницы с анонсом записи. Не подскажите как это можно сделать?
Когда-то сам такое делал, но уже не помню, код не сохранился.
Здравствуйте. Еще раз спасибо, все работает. Но есть одна проблема. При отправке комментария не с последней станицы у меня не происходит редиректа на последнюю страницу, т.е. пользователь, отправив комментарий, остается на той же странице и не видит отправлен его комментарий, или нет. Для того, что бы увидеть свой коммент (или сообщение о том, что он будет опубликован после проверки) нужно перейти на последнюю страницу. Подскажите, пожалуйста, в чем проблема и как ее исправить?
Не представляю, в чем может быть причина. Никогда с подобным не сталкивался.
Дружище, я тебе люблю!!! Ты мне очень помог! Спасибо :)
Спасибо! как всегда выручили!
Избавилась еще от одного плагина навигации.
Здравствуйте, Dimox! Успешно использую ваш код на одном из сайтов. Возникла проблема дублирования title на страницах комментариев. Как сделать, чтоб на этих страницах после тайтла дописывалось что-то типа: — страница комментариев 2.
Тайтлы выводятся плагином ALL in SEO. Я находил различные коды условий проверки на страницу комментария и дописывал в файле header.php темы перед закрывающим тегом title. Не работает. Может, это как-то связано с вашим кодом, который я использую? Он у меня в functions.php.
Версия вордпресса 3.4.1. Помогите, пожалуйста.
Решение здесь — http://wphacks.name/avoid-duplicate-titles-in-paged-comments/. Если не работает, значит нужно отказаться от использования ALL in SEO, т.к. он заголовки делает по-своему.
Да, это решение не работает. Но я логики не могу понять. Я же не лезу в ALL in seo. Как я понимаю, он в wp_title(); подставляет свое. Я же это не трогаю, просто после этой функции хочу вывести, если это страница комментария, свой код.
А чем у вас организована навигация? Этими правками, или плагинами?
Особенно интересно выглядит кнопка «(ответить)».
Заранее спасибо за ответ.
Конечно этим кодом.
Спасибо, код рабочий. Возникает два момента:
1) Стили. Куда впихивать дивы? Если впихнуть в шаблон там, где выводим комменты, то выводится две навигации.
2) Важный! А как поступить, если на первой страницы навигации комментов должны выводиться самые свежие? По умолчанию они на последней. Копание в админке, как и в интернете результатов не дало.
Даже если мы выбираем отобразить на странице комментарии с последней (самой новой) страницы, то всё ок, они выводятся, да только на этой странице не 10 комментов, а два, например (на остальных по десять).
1) В comments.php. Значит что-то неправильно делаете.
2) Без понятия.
Забыли про пункт 2. Появился пункт 3.
3) А что если я хочу перейти на определенны комментарий? Например, http://xn—-7sbqtiudfgnm6i.xn--p1ai/otzyvy-i-kommentarii-o-medikamentoznom-aborte/#comment-377. Но вместо перехода на указанный коммент, меня выкидывает на первую страницу всех комментариев. Как исправить?
Или как мне вернуть (получить) параметр номера страницы комментария (для comment-page-16, это 16)?
Т.е. каким-то образом, зная номер комментария вернуть значение страницы, где он расположен.
Спасибо. Пригодилось для моего блога
Здравствуйте! Спасибо за код! Все работает, но почему-то среди кнопочек не показывается «…», а висит где-то справа-сверху, нумерация же идет сплошным рядом 1,2,4 Подскажите, плиз, что сделать, чтобы … на место прописать?
И еще — можно ли как-то убрать кнопочки с «предыдущей» и «следующей» страницами? А то получается 2 ссылки на одну и туже страницу — зачем они?
Заранее спасибо!
Наугад сложно сказать. Возможно, написан неправильный CSS-код.
Такой возможности, к сожалению, нет.
css я не мудрствуя лукаво прописала тот же, что и к навигации главной страницы (она в теме встроенная) Что там может быть неправильно?
Изменила в Вашем коде commentNavigation в диве на pagination, тем самым напрямую подключив его к стилю навигации шаблона. Получилось, но проблема-таки осталась — висит «…» в правом углу
В коде элемент «…» читается на главной …, а в комментах: …
Разобралась, пока писала! Нужно было просто добавить .pagination span.dots в css рядом с .pagination span.extend И проблема решилась, ура!
Может, кому пригодится :)
У вас страница доступна по двум адресам. Сначала по:
…./wordpress-comments-pagination-without-a-plugin/
И по странице
wordpress-comments-pagination-without-a-plugin/comment-page-2/#comments
Это когда переходишь на постраничной навигации комментариев.
Как можно такое исправить? Может каким редиректом?
а как сделать чтобы выводилось не 3 страницы, а столько сколько есть? У меня только 2 страницы, зачем мне 3я? Или допустим у меня 20 стр., тогда 1,2.3… 20.
А как быть, если я менял вывод комментариев функциями в functions.php и сейчас у меня пагинация выводится, но на каждой странице идет повтор первой страницы комментариев?
код для изменения брал с этого сайта wordsmall ru/sajtostroenie/wordpress-kommentarii-polnoe-oformlenie-vneshnego-vida.html
Если вернуть встроенный вывод комментариев, то всё работает.
Всё круто, но, подскажите пожалуйста, как убрать в ссылке на предыдущую/следующую страницу комментариев вот это — #comments. Удалил в /wp-includes/comment-template.php — не помогло.
Заранее спасибо.
После строки:
добавьте:
Добрый день, не подскажите как у вас реализован вывод только анонса (цитаты) поста на страницах пагинации комментариев, а не всего поста целиком?
Вот так:
Добрый день! Подскажите пожалуйста как вывести полный путь URL на 1 странице комментариев, как у Вас comment-page-1/#comments? У меня выводится только #comments
Это делает код из статьи.
И ещё вопрос. У Вас в Яндекс браузере отображается на русском страница комментариев на которой мы находимся, как этого добиться?
Если речь про заголовок окна браузера, то ответ здесь.
Я смотрю создается дополнительная страница дублирующая основную статью, а у вас ни canonical не прописан, не metarobots, просто в robots.txt закрыли?
Ничего из этого не делал.