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

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

Как мы можем проверить, является ли текущий комментарий WordPress верхним (главным родителем) в ветке комментариев. Если текущий комментарий не является корневым, то нам нужно найти корневой комментарий (комментарий верхнего уровня) в дереве комментариев.

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

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

/**
 * Retrieves top level comment of specified comment.
 *
 * @param int|WP_Comment $child_comment
 *
 * @return WP_Comment|null Null on error.
 */
function get_top_comment( $child_comment ){

	$top_comm = get_comment( $child_comment );
	if( ! $top_comm ){
		return 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;
		}

		// infinite loop
		if( in_array( $parent_comm->comment_ID, $ancestors, true ) ){
			trigger_error( "Comment $parent_comm->comment_ID breaks comment tree." );

			return null;
		}

		$ancestors[] = $parent_comm->comment_ID;
		$top_comm = $parent_comm;
	}

	return $top_comm;
}
Пример использования

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

  • 10
    • 20
      • 30

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

$top_comment = get_top_comment( 30 );
$top_comment = get_top_comment( 20 );
$top_comment = get_top_comment( 10 );

Любая из этих строк извлекает такой объект:

WP_Comment Object
(
	[comment_ID] => 10
	[comment_post_ID] => 95
	[comment_author] => Johnny
	[comment_author_email] => eonovich@gmail.com
	[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 text
	[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] =>
)