WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Нумерация комментариев в WordPress

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

Тема нумерации комментариев в WordPress уже неоднократно поднималась на блогах и форумах, однако один из вариантов я так нигде и не встречал, ровно так же, как и не видел всех собранных вариантов в одной статье. Так же, некоторые из решений, на мой взгляд, не самые лучшие (с лишними запросами к данным, вроде: get_option('page_comments') ). Все это легло в основе решения написать этот пост.

Прежде чем использовать хаки ниже нужно обратить внимание на то куда их вставлять. Воспользоваться хаками можно, если вывод комментариев у вас в шаблоне оформлен не по умолчанию, т.е. используется произвольная функция вывода комментариев (см. <a class="func" href="/function/wp_list_comments">wp_list_comments()</a>) или если шаблон разрабатывался под версию ниже 2.7 (в 2.7 была введена специальная функция вывода комментариев wp_list_comments()).

Откройте файл темы comments.php, найдите там функцию wp_list_comments() и посмотрите в её аргументы, если указан аргумент callback, то все нормально пронумеровать комменты получится, довольно просто: код нужно вставлять в начало функции, которая указана в аргументе callback (в примере ниже это mytheme_comment). Ищите функцию (mytheme_comment) в файле темы functions.php.

wp_list_comments("type=all&callback=mytheme_comment");

Если wp_list_comments вы не нашли, то вставлять код нужно после строки:

foreach ($comments as $comment) :

Нумерация древовидных комментариев в WordPress

Хаки для нумерации древовидных комментариев:

Нумерация по хронологии добавления комментариев

  • Комментарий 1
    • Комментарий 2
      • Комментарий 4



  • Комментарий 3

<?php 
// Нумерация по порядковому номеру публикации, для древовидных комментариев
global $com_id_num;
if( !isset($com_id_num) ){ // чтобы $com_id_num собирался 1 раз
	foreach( $GLOBALS['wp_query']->comments as $com ){
		if($args['type']=='comment' && $com->comment_type!='') continue;
		$com_id_num[$com->comment_ID]=++$n;
	}
}
$cnum = $com_id_num[$comment->comment_ID];
// переменная $cnum содержит номер комментария
?>

Используйте переменную $cnum в том месте, где нужно вывести номер.

Древовидная нумерация (как на этом блоге)

  • Комментарий 1
    • Комментарий 1.1
      • Комментарий 1.2



  • Комментарий 2

<?php # Счетчик комментариев: $cnum - верхний уровень, $cnum_inner - вложенные
global $cnum, $incnum, $comment_depth;
// определяем первый номер, если включено разделение на страницы
$per_page = isset($args['per_page']) ? $args['per_page'] : $GLOBALS['wp_query']->query_vars['comments_per_page'];
if( $per_page && !isset($cnum) ){
	$com_page = (int)$GLOBALS['wp_query']->query_vars['cpage'];
	if( $com_page>1 )
			$cnum = ($com_page-1) * (int)$per_page;
}
// счетчик
if ($comment_depth>1){
	$cnum_inner = '.'. $incnum++;
} else {
	$cnum++;
	$incnum=1;
} ?>

Используйте конструкцию

<?php echo $cnum ?><sub><?php echo $cnum_inner ?></sub>

в том месте, где нужно вывести номер.
В этом коде $cnum содержит номер верхнего уровня комментариев, а $cnum_inner - порядковый номер вложенных комментов.

Нумерация не древовидных комментариев в WordPress

Нумерация, если комментарии разбиваются на страницы

<?php # Для обычной нумерации, если комментарии не древовидные

# и разбиваются на страницы (если не разбиваются, код тоже подходит)
global $cnum;
// определяем первый номер, если включено разделение на страницы
$per_page = $args['per_page'] ? $args['per_page'] : $GLOBALS['wp_query']->query_vars['comments_per_page'];
if( $per_page && !isset($cnum) ){
	$com_page = (int)$GLOBALS['wp_query']->query_vars['cpage'];
	if($com_page>1)
		$cnum = ($com_page-1)*(int)$per_page;
}
// считаем
$cnum = isset($cnum) ? $cnum+1 : 1;
// переменная $cnum содержит номер комментария ?>

Используйте переменную $cnum в том месте, где нужно вывести номер.

Если комментарии не древовидные и не разбиваются на страницы

Самая банальная нумерация. В основном, везде описывается этот тип нумерации.

<?php # Для обычной нумерации, если комментарии не древовидные и не разбиваются на страницы
global $cnum;
$cnum = isset($cnum) ? $cnum+1 : 1; ?>

Используйте переменную $cnum в том месте, где нужно вывести номер.

А еще, есть такой плагин

Также, для древовидной нумерации комментариев существует плагин: Greg's Threaded Comment Numbering. Единственной особенностью этого плагина, которая не учтена в хаках выше является принцип нумерации древовидных комментариев, номерами выделяются все уровни вложенности комментариев (см. картинку):

Greg's Threaded Comment Numbering в действии

Насколько банальность в виде нумерации комментариев заслуживает установки, не маленького плагина, и нужна ли нумерация вообще, решать вам.

52 коммента
  • Dev webmasterprof.ru

    Нумерация по хронологии добавления комментариев - не работает.

    А вот второй способ выводит без проблем. В чем может быть проблема?

    -1
    Ответить22.Июн.2011 в 20:53 #
    • Kama7641

      У меня работало все когда я тестировал. Можно какие-то симптомы, хоть что-то?

      1
      Ответить22.Июн.2011 в 23:23 #
      • Dev webmasterprof.ru

        Просто не выводит никаких цифр.

        А вот если заменить код вывода "хронологических" на вывод "Древовидная нумерация (как на этом блоге)".

        Тогда переменная "$cnum" начинает показывать цифры.

        Ответить22.Июн.2011 в 23:39 #
        • Kama7641

          Вот я сейчас переключил на этом блоге нумерацию - все работает, как видите.

          Может не выводится, потому что данные комменатрия у вас содержатся не в стандартной переменной $comment, т.е. не срабатывает эта часть кода: $comment->comment_ID

          П.С. код довольно топорный, поэтому работать должно! Проверьте все еще раз.

          Ответить23.Июн.2011 в 00:13 #
          • Dev webmasterprof.ru

            wp_list_comments('type=comment&callback=mytheme_comment')

            Такая у меня функция.

            Ответить23.Июн.2011 в 00:19 #
          • Kama7641

            У меня тоже!
            mytheme_comment должна начинаться так:

            function mytheme_comment($comment, $args, $depth)

            Код для нумерации нужно вставлять именно внутрь mytheme_comment, т.е. в итоге должно получиться:

            function mytheme_comment($comment, $args, $depth){
            	 [Код нумерации комментов]
            	 [остальная часть кода, где указывается $cnum]
            }

            Если аргументы функции $comment, $args у вас называются как-то по-другому их нужно изменить в моем коде нумерации.

            Ответить23.Июн.2011 в 00:27 #
          • Dev webmasterprof.ru

            function mytheme_comment($comment, $args, $depth) {$GLOBALS['comment'] = $comment;

            может проблема в {$GLOBALS['comment'] = $comment;?

            Ответить23.Июн.2011 в 00:39 #
          • Kama7641

            Нет, из-за этого не может быть. Выложите сюда весь код, с тем как вставлен мой код, гляну ка. Странно как-то, должно работать.

            П.С. для правильной вставки кода, соответствующую кнопку (код) юзайте.

            Ответить23.Июн.2011 в 01:37 #
          • Dev webmasterprof.ru
            <?php function mytheme_comment($comment, $args, $depth) {$GLOBALS['comment'] = $comment; ?>
            <?php // Нумерация по порядковому номеру публикации, для древовидных комментариев
            global $cnum;
            static $com_id_num = array(); $n=1;
            if( $com_id_num===array() ){ // чтобы $com_id_num собирался 1 раз
            	foreach($GLOBALS['wp_query']->comments as $com){
            		if($args['type']=='comment' && $com->comment_type!='') continue;
            		$com_id_num[$com->comment_ID]=$n++;
            	}
            }
            $cnum = $com_id_num[$comment->comment_ID];
            // переменная $cnum содержит номер комментария
            ?>
               <div <?php comment_class(); ?> id="div-comment-<?php comment_ID() ?>">
            	 <div id="comment-<?php comment_ID(); ?>">
            	 <div id="comment_top">
            	  <div class="gravt"><?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?></div>
            	  <div id="comm_grup">
            		 <div id="comm_name"><?php echo get_comment_author_link() ?></div>
            		 <div id="comm_info"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),'  ','') ?></div>
            	  </div>
            	  </div>
            
            	  <?php if ($comment->comment_approved == '0') : ?>
            		 <em><?php _e('Your comment is awaiting moderation.') ?></em>
            		 <br />
            	  <?php endif; ?>
            
             <div class="comm_number"><?php echo $cnum; ?></div>
            	  <div id="comment_text"><?php comment_text() ?></div>
            
            	  <div class="reply">
            		 <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
            	  </div>
            	 </div>
            	 </div>
            <?php
            		}
            
            ?>
            Ответить23.Июн.2011 в 01:49 #
          • Kama7641

            Нашел ошибку в своем коде, попробуйте такой вариант:

            // Нумерация по порядковому номеру публикации, для древовидных комментариев
            global $com_id_num;
            if( !isset($com_id_num) ){ // чтобы $com_id_num собирался 1 раз
            	$n=1;
            	foreach( $GLOBALS['wp_query']->comments as $com ){
            		if($args['type']=='comment' && $com->comment_type!='') continue;
            		$com_id_num[$com->comment_ID]=$n++;
            	}
            }
            $cnum = $com_id_num[$comment->comment_ID];
            // переменная $cnum содержит номер комментария

            У меня и тот и этот варианты работают. Но так правильнее.

            Если это не поможет, то не знаю в чем проблема - все вставлено правильно и должно работать. Попробуйте проверить существует ли вообще переменная $GLOBALS['wp_query']->comments:

            if( isset($GLOBALS['wp_query']->comments) ) die("переменная существует");
            else die("нет такой переменной");

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

            Ответить23.Июн.2011 в 02:34 #
          • Dev webmasterprof.ru

            К сожалению не работает. Переменная существует. Буду юзать второй вариант.

            Спасибо!

            Ответить23.Июн.2011 в 13:37 #
  • Dev webmasterprof.ru

    И подскажите как вы реализовали нумерацию страниц комментариев?

    Ответить22.Июн.2011 в 21:18 #
    • Kama7641

      Функция такая в ВП есть: paginate_comments_links(), если вы о пагинации комментариев.

      Ответить22.Июн.2011 в 23:19 #
      • Dev webmasterprof.ru

        Именно о ней. Но она вроде же выводит: предыдущая страница и т.п.

        А как сделать цифрами как у вас?

        Ответить22.Июн.2011 в 23:41 #
        • Kama7641

          Она и цифрами выводит, и назад/вперед, можно отключать и то и это. Там полный карт-бланш, если чуть разобраться smile Еще paginate_links() изучите, она ядро paginate_comments_links().

          Пройдите по ссылке почитайте внимательно.

          Ответить23.Июн.2011 в 00:04 #
  • Dev webmasterprof.ru

    Спасибо, обе темы сделал.

    Ответить23.Июн.2011 в 19:26 #
  • eavasi www.eavasi.ru

    Привет, Тимур.
    Убей, не могу вспомнить, почему я отказался от нумерации комментариев. Постояла у меня эта функция недолго и почему-то была отключена.
    Спасибо за использование моего скриншота.
    Со своей проблемой по обновлению WordPress разобрался и написал об этом в БШ. Твои функции не при чем и все так же отлично работают.
    Благодарим тебя, Тимур! smile

    Ответить11.Июл.2011 в 19:39 #
    • Kama7641

      Сейчас почитаю что за проблемы были. У меня с моими функция тоже пока конфликтов не было - вроде все работает норм от версии к версии smile

      Ответить11.Июл.2011 в 20:02 #
  • Allpa allpa.ru

    Я ничего не поняла sad
    Блеать..

    Ответить01.Янв.2012 в 23:04 #
  • Allpa allpa.ru

    ОК, с нумерацией разобралась.
    Теперь вопрос: как сделать номер полноценной ссылкой на камент вида хттп://урл.поста/#comment-1234? unknw

    P.S. Меня уже не в первый раз здесь принимают за бота и камент отправить не дают — протестую!

    Ответить05.Янв.2012 в 06:37 #
  • Allpa allpa.ru

    Всё, разобралась и со ссылкой smile
    Извини за лишний напряг, дружище.

    Ответить05.Янв.2012 в 07:36 #
  • RomanZmeu roman.burashnikov.name

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

    Ответить27.Авг.2013 в 15:15 #
  • CanaBeasT64 mingas.ru

    Еще раз добрый день, Тимур!
    Переделываю дизайн и юзабилити одного из своих сайтов и дошел уже до комментариев. Как раз только спрашивал про пагинацию, да и еще счетчик такой решил поставить.
    Так вот, хочу себе сделать нечто наподобие рейтинга комментаторов, типа как репутацию на форумах и решил данной мыслью поделиться с Вами, так как вижу, что на блоге много спрашивают, а всем ответить не всегда получается.
    Что это может дать: человек, который много пишет, поднимает себе репутацию, соответственно с одной стороны на него вопросы можно обратить более пристальное внимание, с другой стороны - человек получает стимул ответить на вопросы других - репутация растет, самомнение повышается good .
    Плюс, стимул в следующий раз вернуться на блог, где у него уже есть репутация, да и все знакомо.
    Допустим как по мне, так все все решения и примочки которые делаю для своих сайтов (основных у меня 2), начинаю искать именно с вашего блога, путем добавления в поисковике к запросу слова Kama, не забывая при этом периодически глянуть и рекламу с вашего сайта wink
    В общем подумайте, может себе введете, а я перейму smile
    Один вариант именно рейтинга коментов видел на tut.by (там можно + или - ставить), другой это по количеству коментов плагин видел, в идеале хочу себе сделать некий гибрид рейтинга, который будет зависеть как от количества постов, так и от качества (+/-).
    Надеюсь, моя идея пригодится, так как ваших идей себе передрал уже много (правда значительная часть пока на локали).

    1
    Ответить25.Апр.2014 в 17:13 #
    • Kama7641

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

      Спасибо за комментарий! Приятно smile

      Ответить25.Апр.2014 в 17:36 #
      • CanaBeasT64 mingas.ru

        И Вам, огромное спасибо за кучу полезных фишек, а рейтинг придется видно самому придумывать, скорее всего к мылу и привяжу.. а что поделаешь smile
        У меня сайт по газу, тематика обширная - везде своя специфика (и не во всех ее аспектах я эксперт), а пользователей нужно как-то стимулировать (особенно тех кто понимает в теме) на ответы друг другу. Правда не знаю пока, когда займусь, может Вы раньше сделаете smile

        Ответить25.Апр.2014 в 18:13 #
      • CanaBeasT64 mingas.ru

        Да и еще, регистрацию если разрешать, то, к примеру после 10 одобренных постов.

        Ответить25.Апр.2014 в 18:18 #
  • CanaBeasT64 bezvreda.com

    Здравствуйте, Тимур!
    Подправил сайт по газу и решил все фишки, которые всплыли добавить на второй свой сайт по теме здорового образа жизни smile. Сделал пагинацию, добавил Вашу функцию по выводу последних комментариев в виджет (допилил чуть-чуть, чтобы автора подсвечивало другим цветом), а вот с нумерацией коментов вышла проблемка.
    А что получается, с нумерацией, если у меня комментарии выводятся так:

    wp_list_comments('type=comment&avatar_size=30');

    Я так понимаю, что если хочу нумерацию, то мне придется функцию добавлять, например как у описано здесь
    Типа, добавить функцию а-ля

    function mytheme_comment

    и потом тыкать туда нумерацию.
    А нельзя как-то воткнуться в мою стандартную, wp_list_comments?

    Ответить07.Май.2014 в 17:17 #
    • CanaBeasT64 bezvreda.com

      В общем, плюнул на стандартную wp_list_comments и добавил пользовательскую функцию по выводу. В нее и воткнул нумерацию. Как сделать, брал тоже у Вас. спасибо.

      Ответить08.Май.2014 в 12:06 #
      • Kama7641

        Ну и правильно, это, пожалуй, самое простое решение. good

        Ответить08.Май.2014 в 22:35 #
Здравствуйте, !     Войти . Зарегистрироваться