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

Нумерация комментариев в 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. Единственной особенностью этого плагина, которая не учтена в хаках выше является принцип нумерации древовидных комментариев, номерами выделяются все уровни вложенности комментариев (см. картинку):

Greg's Threaded Comment Numbering в действии
52 коммента