Как можно получить уровень вложенности комментария? 3 способа

Этот вопрос возник передо мной, когда я разрабатывал асинхронные AJAX-комментарии на своём сайте.

Когда я начинал над ними работать, такие вещи как disqus и комменты из соц сетей ещё не были широко распространены, а мне вот хотелось на своём сайте иметь офигенскую систему комментариев на AJAX со всей сопутствующей функциональностью — в данном случае вложенностью комментариев.

Способ 1. Вступление для начинающих

Так как мой сайт посещают не только продвинутые в WordPress люди, но и новички, сделаю эту небольшую главу-вступление, чтобы в двух словах рассказать, что вообще такое вложенность комментария и как её можно определить «на глаз».

Вот пример комментариев со вложенностью. То есть, когда посетитель нажимает на кнопку «Ответить» к комментарию другого пользователя, то в итоге его сообщение появится с небольшим сдвигом вправо — это и есть вложенность.

пример древовидных комментариев в WordPress
Пример вложенности комментариев в WordPress

Что делать, если на вашем сайте нет кнопки «Ответить»? Есть два варианта:

  1. Вы можете сами включить вложенность в «Настройки > Обсуждение»
    включаем древовидные комментарии в админке
  2. Ваша тема просто не поддерживает древовидные комментарии.

Остальная часть поста будет только про код.

Способ 2. Получение уровня вложенности при помощи глобальных переменных $comment_depth и $GLOBALS[‘comment_depth’]

Возможно вы знаете и даже используете функцию wp_list_comments() — она нужна для вывода комментариев на сайте в виде списка.

Ну во-первых скажу, что в этой функции всё предусмотрено и комментарии выводятся уже с учётом заданного уровня вложенности.

Во-вторых, wp_list_comments позволяет задавать собственный шаблон (функцию) вывода комментариев при помощи параметра callback, например:

wp_list_comments('callback=my_custom_comment_template');

В функции my_custom_comment_template() получить уровень вложенности комментария тоже проще простого — достаточно обратиться к глобальной переменной $comment_depth или $GLOBALS['comment_depth']:

global $comment_depth;
echo $comment_depth;
echo $GLOBALS['comment_depth'];

Дело в том, что глобальная переменная больше нигде и по сути и не работает.

Способ 3. Как узнать уровень вложенности комментария по его ID

Окей, как узнать вложенность комментария, если глобальная переменная $comment_depth недоступна, а всё, что у нас имеется — это ID комментария.

Конечно, тут всё зависит от задач, которые перед вами стоят, тем не менее вот универсальная функция для получения «глубины» коммента:

function true_get_comment_depth( $comment_id ) {
    $depth = 0;
    while( $comment_id > 0  ) { // не знаю, можно ли тут обойтись без цикла, если знаете как, буду рад вашим предложениям
        $comment = get_comment( $comment_id );
        $comment_id = $comment->comment_parent;
        $depth++;
    }
    return $depth;
}

Затем в любом месте кода используем её:

echo true_get_comment_depth( 532 ); // например выведем уровень вложенности комментария с ID 532

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: