WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

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

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

Прежде чем использовать хаки ниже нужно обратить внимание на то куда их вставлять. Воспользоваться хаками можно, если вывод комментариев у вас в шаблоне оформлен не по умолчанию, т.е. используется произвольная функция вывода комментариев (см. wp_list_comments()) или если шаблон разрабатывался под версию ниже 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 комментария
    Войти