Постраничная навигация в комментариях 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

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

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