Как получить корневой комментарий по любому дочернему комментарию

Как получить верхний (корневой) комментарий по любому дочернему комментарию

В WordPress нет встроенной функции для получения верхнего комментария для указанного комментария. Для этого можно воспользоваться функциями get_ancestors() и get_post_ancestors() для постов или таксономий.

Зачем нам это нужно?

Иногда может потребоваться проверить, является ли текущий комментарий верхним в ветке комментариев. Если не является, то нам необходимо найти корневой комментарий в этой ветке.

Ниже я представлю функцию, которая решает эту задачу и позволяет получить родительский комментарий любого уровня.

Функция для получения корневого комментария

/**
 * Получает верхний уровень комментария для указанного комментария.
 *
 * @param int|WP_Comment $child_comment Идентификатор дочернего комментария.
 *
 * @return WP_Comment|null Возвращает null в случае ошибки.
 */
function get_top_comment( $child_comment ) {

    $top_comm = get_comment( $child_comment );
    if( ! $top_comm ) {
        return null; // Если комментарий не найден, возвращаем null
    }

    $ancestors = [ $top_comm->comment_ID ]; // Массив для хранения идентификаторов предков

    while( $top_comm->comment_parent ) { // Пока есть родитель

        $parent_comm = get_comment( $top_comm->comment_parent ); // Получаем родительский комментарий
        if( ! $parent_comm ) {
            return $top_comm; // Если родитель не найден, возвращаем текущий верхний комментарий
        }

        // Проверка на бесконечный цикл
        if( in_array( $parent_comm->comment_ID, $ancestors, true ) ) {
            trigger_error( "Комментарий $parent_comm->comment_ID нарушает дерево комментариев." );
            return null; // Возвращаем null в случае ошибки
        }

        $ancestors[] = $parent_comm->comment_ID; // Добавляем идентификатор родителя в массив
        $top_comm = $parent_comm; // Переходим к родительскому комментарий
    }

    return $top_comm; // Возвращаем верхний комментарий
}

Пример использования функции

Предположим, у нас есть следующая ветка комментариев (идентификаторы комментариев):

  • 10
    • 20
    • 30

Если мы передадим любой из этих идентификаторов в функцию get_top_comment(), то в ответе получим объект WP_Comment для комментария с ID 10:

$top_comment = get_top_comment( 30 ); // Возвращает комментарий 10
$top_comment = get_top_comment( 20 ); // Возвращает комментарий 10
$top_comment = get_top_comment( 10 ); // Возвращает комментарий 10

Пример объекта WP_Comment

При любом из указанных выше вызовов мы получим объект:

WP_Comment Object
(
    [comment_ID] => 10
    [comment_post_ID] => 95
    [comment_author] => Johnny
    [comment_author_email] => [email protected]/cdn-cgi/l/email-protection
    [comment_author_url] =>
    [comment_author_IP] => 162.210.194.38
    [comment_date] => 2020-11-12 11:27:59
    [comment_date_gmt] => 2020-11-12 06:27:59
    [comment_content] => Текст комментария
    [comment_karma] => 0
    [comment_approved] => 1
    [comment_agent] => Mozilla/5.0 (Windows NT 6.3; Win64; x64)
    [comment_type] => comment
    [comment_parent] => 0
    [user_id] => 0
    [children:protected] =>
    [populated_children:protected] =>
)

Теперь вы знаете, как получить корневой комментарий по идентификатору любого комментария в WordPress!

Leave a Reply

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