Постраничная навигация в комментариях 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. Не забудьте, что для того, чтобы работала постраничная навигация в комментариях, необходимо активировать разбивку комментариев на страницы, зайдя в админку на страницу «Параметры — Обсуждение».

Комментарии (61)
  1. 1
    Дмитрий
    <?php // Do not delete these lines
     if ('comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
     die ('Please do not load this page directly. Thanks!');
     if (!empty($post->post_password)) { // if there's a password
    
     if ($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) { // and it doesn't match the cookie
    
     ?>
     <p class="nocomments">This post is password protected. Enter the password to view comments.<p>
     <?php
     return;
     }
     }
     /* This variable is for alternating comment background */
     $oddcomment = 'alt';
    ?>
    <!-- You can start editing here. -->
    <div id="blog_comm">
    <a id="comments"></a>
    <?php if ($comments) : ?>
    <h3>Комментарии</h3>
    
     <?php foreach ($comments as $comment) : ?>
     <div class="comm_panel">
     <b><?php comment_author_link() ?></b> <?php comment_date('j F, Y') ?> в <?php comment_time() ?> 
    <span class="quoter"><a href="javascript:void(0);" onmousedown="postQuote('','comment','Вы не выделили текст');return false;" title="Выделите текст на странице и кликайте">Цитировать</a></span>
     </div>
     <div class="comm_text">
     <?php if ($comment->comment_approved == '0') : ?>
     <font color="#d90e31"><em>Ваш комментарий будет опубликован после проверки.</em></font>
     <?php endif; ?>
     <?php comment_text() ?>
     </div>
     <br />
     <?php endforeach; /* end for each comment */ ?>
    <?php else : // this is displayed if there are no comments so far ?>
    <?php if ('open' == $post->comment_status) : ?>
     <!-- If comments are open, but there are no comments. -->
     <?php else : // Comments are closed. ?>
     
     <!-- If comments are closed. -->
     <?php endif; ?>
    <?php endif; ?>
    <?php if ('open' == $post->comment_status) : ?>
    <div id="comments_from_bg">
    <a id="respond"></a>
     <div id="comm_post_title">
     Оставить комментарий
     </div>
    <?php if ( get_option('comment_registration') && !$user_ID ) : ?>
     <p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p>
    <?php else : ?>
     <div id="comm_post_form">
     <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
     <table cellspacing="0" cellpadding="0">
     <?php if ( $user_ID ) : ?>
     <tr>
     <td colspan="2">
     <p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Logout &raquo;</a></p>
     </td>
    		 </tr>
     <?php else : ?>
     <tr>
     <td class="right">
     Имя:
     </td>
     <td>
     <input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
     </td>
     </tr>
     <tr>
     <td class="right">
     E-mail:
     </td>
     <td>
     <input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
     </td>
     </tr>
     <tr>
     <td class="right">
     Антиспам:
     </td>
     <td>
    <?php if ( function_exists('math_comment_spam_protection') ) {
    $mcsp_info = math_comment_spam_protection();
    ?> <input type="text" name="<?php echo $mcsp_info['fieldname_answer'] ?>" id="<?php echo $mcsp_info['fieldname_answer'] ?>" value="" size="22" tabindex="2" />
    <label for="<?php echo $mcsp_info['fieldname_answer'] ?>">сколько будет: <?php echo $mcsp_info['operand1'] . ' + ' . $mcsp_info['operand2'] . ' ?' ?></label>
    <input type="hidden" name="<?php echo $mcsp_info['fieldname_hash'] ?>" value="<?php echo $mcsp_info['result']; ?>" />
    
    <?php } // if function_exists... ?>
    
     </td>
     </tr>
     <?php endif; ?>
     <!--<p><small><strong>XHTML:</strong> You can use these tags: <?php echo allowed_tags(); ?></small></p>-->
     <tr>
     <td class="right">
     Комментарий:
     </td>
     <td>
    <?php if(function_exists(wp_comment_quicktags_plus)) { wp_comment_quicktags_plus(); } ?>
     <textarea name="comment" id="comment" cols="60" rows="5" tabindex="4"></textarea>
     </td>
     </tr>
     <tr>
     <td>
     </td>
     <td>
     <input name="submit" type="submit" value="Отправить" class="sub" />
     </td>
     </tr>
     </table>
    <input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
     <?php do_action('comment_form', $post->ID); ?>
     </form>
     </div>
    </div>
    <?php endif; // If registration required and not logged in ?>
    <?php endif; // if you delete this the sky will fall on your head ?>
    </div>
  2. 3
    Дмитрий

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

  3. 5
    Дмитрий

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

  4. 6
    Дмитрий

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

  5. 8
    Дмитрий

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

  6. 10
    Павел

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

  7. 11
    VRS

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

  8. 12

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

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

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

  9. 15
    Дмитрий

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

  10. 17

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

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

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

  11. 19

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

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

  12. 22

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

  13. 23

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

    • 24

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

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

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

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

      • 25

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

  14. 26
    Сергей

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

  15. 27
    Uthvfy

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

  16. 28
    Дмитрий

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

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

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