Нумерация комментариев в 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
- Комментарий 2
-
Комментарий 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
- Комментарий 1.1
-
Комментарий 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. Единственной особенностью этого плагина, которая не учтена в хаках выше является принцип нумерации древовидных комментариев, номерами выделяются все уровни вложенности комментариев (см. картинку):
Насколько банальность в виде нумерации комментариев заслуживает установки, не маленького плагина, и нужна ли нумерация вообще, решать вам.
- Функция вывода постов по количеству комментариев
- Автоматическое растягивание textarea на javascript и jQuery
- Автоматическое растягивание поля (textarea) комментария
Нумерация по хронологии добавления комментариев - не работает.
А вот второй способ выводит без проблем. В чем может быть проблема?
У меня работало все когда я тестировал. Можно какие-то симптомы, хоть что-то?
Просто не выводит никаких цифр.
А вот если заменить код вывода "хронологических" на вывод "Древовидная нумерация (как на этом блоге)".
Тогда переменная "$cnum" начинает показывать цифры.
Вот я сейчас переключил на этом блоге нумерацию - все работает, как видите.
Может не выводится, потому что данные комменатрия у вас содержатся не в стандартной переменной $comment, т.е. не срабатывает эта часть кода: $comment->comment_ID
П.С. код довольно топорный, поэтому работать должно! Проверьте все еще раз.
wp_list_comments('type=comment&callback=mytheme_comment')
Такая у меня функция.
У меня тоже!
mytheme_comment должна начинаться так:
function mytheme_comment($comment, $args, $depth)
Код для нумерации нужно вставлять именно внутрь mytheme_comment, т.е. в итоге должно получиться:
Если аргументы функции $comment, $args у вас называются как-то по-другому их нужно изменить в моем коде нумерации.
function mytheme_comment($comment, $args, $depth) {$GLOBALS['comment'] = $comment;
может проблема в {$GLOBALS['comment'] = $comment;?
Нет, из-за этого не может быть. Выложите сюда весь код, с тем как вставлен мой код, гляну ка. Странно как-то, должно работать.
П.С. для правильной вставки кода, соответствующую кнопку (код) юзайте.
Нашел ошибку в своем коде, попробуйте такой вариант:
У меня и тот и этот варианты работают. Но так правильнее.
Если это не поможет, то не знаю в чем проблема - все вставлено правильно и должно работать. Попробуйте проверить существует ли вообще переменная $GLOBALS['wp_query']->comments:
Если у статьи есть комментарии она должна существовать, а значит, по идее, код должен работать.
К сожалению не работает. Переменная существует. Буду юзать второй вариант.
Спасибо!
И подскажите как вы реализовали нумерацию страниц комментариев?
Функция такая в ВП есть: paginate_comments_links(), если вы о пагинации комментариев.
Именно о ней. Но она вроде же выводит: предыдущая страница и т.п.
А как сделать цифрами как у вас?
Она и цифрами выводит, и назад/вперед, можно отключать и то и это. Там полный карт-бланш, если чуть разобраться
Еще paginate_links() изучите, она ядро paginate_comments_links().
Пройдите по ссылке почитайте внимательно.
Спасибо, обе темы сделал.
Привет, Тимур.
Убей, не могу вспомнить, почему я отказался от нумерации комментариев. Постояла у меня эта функция недолго и почему-то была отключена.
Спасибо за использование моего скриншота.
Со своей проблемой по обновлению WordPress разобрался и написал об этом в БШ. Твои функции не при чем и все так же отлично работают.
Благодарим тебя, Тимур!
Сейчас почитаю что за проблемы были. У меня с моими функция тоже пока конфликтов не было - вроде все работает норм от версии к версии
Я ничего не поняла
Блеать..
ОК, с нумерацией разобралась.
Теперь вопрос: как сделать номер полноценной ссылкой на камент вида хттп://урл.поста/#comment-1234?
P.S. Меня уже не в первый раз здесь принимают за бота и камент отправить не дают — протестую!
Всё, разобралась и со ссылкой
Извини за лишний напряг, дружище.
Спасибо. Пригодилось для моего блога
Еще раз добрый день, Тимур!
.

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

У меня сайт по газу, тематика обширная - везде своя специфика (и не во всех ее аспектах я эксперт), а пользователей нужно как-то стимулировать (особенно тех кто понимает в теме) на ответы друг другу. Правда не знаю пока, когда займусь, может Вы раньше сделаете
Да и еще, регистрацию если разрешать, то, к примеру после 10 одобренных постов.
Здравствуйте, Тимур!
. Сделал пагинацию, добавил Вашу функцию по выводу последних комментариев в виджет (допилил чуть-чуть, чтобы автора подсвечивало другим цветом), а вот с нумерацией коментов вышла проблемка.
Подправил сайт по газу и решил все фишки, которые всплыли добавить на второй свой сайт по теме здорового образа жизни
А что получается, с нумерацией, если у меня комментарии выводятся так:
Я так понимаю, что если хочу нумерацию, то мне придется функцию добавлять, например как у описано здесь
Типа, добавить функцию а-ля
и потом тыкать туда нумерацию.
А нельзя как-то воткнуться в мою стандартную, wp_list_comments?
В общем, плюнул на стандартную wp_list_comments и добавил пользовательскую функцию по выводу. В нее и воткнул нумерацию. Как сделать, брал тоже у Вас. спасибо.
Ну и правильно, это, пожалуй, самое простое решение.