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

Прежде чем использовать хаки ниже нужно обратить внимание на то куда их вставлять. Воспользоваться хаками можно, если вывод комментариев у вас в шаблоне оформлен не по умолчанию, т.е. используется произвольная функция вывода комментариев (см. wp_list_comments()) или если шаблон разрабатывался под версию ниже 2.7. В 2.7 была введена специальная функция вывода комментариев [wp_list_comments()](/function/wp_list_comments()).
Откройте файл темы comments.php, найдите там функцию [wp_list_comments()](/function/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. Единственной особенностью этого плагина, которая не учтена в хаках выше является принцип нумерации древовидных комментариев, номерами выделяются все уровни вложенности комментариев (см. картинку):

- Функция вывода постов по количеству комментариев
- Автоматическое растягивание textarea на javascript и jQuery
- Автоматическое растягивание поля (textarea) комментария