Нумерация комментариев в WordPress: способы и хаки

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

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

![Пример нумерации комментариев](assets/uploads/2024/01/numbersmall1.jpg)

## Важно перед началом

Перед тем как использовать любые способы, важно обратить внимание на то, куда их вставлять. Вы можете применить описанные хакерские решения, если вывод комментариев в вашей теме не стилизован по умолчанию, то есть используется произвольная функция вывода комментариев (см. wp_list_comments()) или если шаблон разрабатывался для версии WordPress ниже 2.7. В версии 2.7 была введена специальная функция вывода комментариев wp_list_comments().

1. Откройте файл вашей темы comments.php.
2. Найдите функцию wp_list_comments().
3. Посмотрите на её аргументы. Если указан аргумент callback, то нумеровать комментарии достаточно просто: код нужно вставить в начале функции, указанной в аргументе callback (в примере ниже — это mytheme_comment). Найдите функцию mytheme_comment в файле functions.php.

```php
wp_list_comments( 'type=all&callback=mytheme_comment' );
  1. Если вы не нашли wp_list_comments, код нужно вставить после строки:
foreach ( $comments as $comment ) :

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

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

Хронологическая нумерация добавленных комментариев

* Комментарий 1
  * Комментарий 2
  * Комментарий 4
* Комментарий 3
// Нумерация по порядку публикации поста для вложенных комментариев
global $com_id_num;
if( ! isset( $com_id_num ) ){ // собираем $com_id_num только один раз
    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
// Счетчик комментариев: $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;
}

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

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

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

Нумерация, когда комментарии разбиты на страницы

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

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

Самая простая нумерация. Этот тип нумерации описан повсюду.

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

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

Плагины

Существует также плагин для нумерации вложенных комментариев: "Greg's Threaded Comment Numbering". Единственное, чего не охватывает этот плагин, это принцип нумерации вложенных комментариев, где номера присваиваются всем уровням вложенности.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *