Получить заголовок верхнего родительского уровня страницы
Как получить заголовок страницы самого верхнего родителя текущей страницы посетителя?
Опишу ситуацию:
У меня такая структура страниц:
- Пример Заголовка 1
- Пример Заголовка 1-1
- Пример Заголовка 1-1-1
- Пример Заголовка 1-1-2
- Пример Заголовка 1-2
- Пример Заголовка 1-1
- Пример Заголовка 2
- Пример Заголовка 3
- Пример Заголовка 4
Вот что я хочу получить:
- Если пользователь на
Пример Заголовка 1
— вернутьПример Заголовка 1
- Если пользователь на
Пример Заголовка 1-1
— вернутьПример Заголовка 1
- Если пользователь на
Пример Заголовка 1-1-1
— вернутьПример Заголовка 1
- Если пользователь на
Пример Заголовка 2
— вернутьПример Заголовка 2
Обычно я бы проверял $post->parent
и если 0
, то возвращал заголовок страницы, иначе заголовок родительской страницы. Проблема в том, что $post->parent
возвращает только один уровень вверх. Мне нужна рекурсивная функция, которая будет подниматься до тех пор, пока $post->parent == 0
.
Я могу реализовать это сам, но единственный способ, который приходит в голову — использовать get_post()
каждый раз. Но представьте, что я на 8 уровне вложенности — это потребует загрузки 8 страниц, чтобы добраться до верхнего уровня. Есть ли более эффективный способ?

Нашел такой способ:
if ( 0 == $post->post_parent ) {
the_title();
} else {
$parents = get_post_ancestors( $post->ID );
echo apply_filters( "the_title", get_the_title( end ( $parents ) ) );
}
Если у кого-то есть более оптимальное решение, пожалуйста, поделитесь.

Это, вероятно, настолько же хорошо, как и любой другой способ. Ещё один вариант — циклически перебирать get_page( array( 'post_parent' => $post->post_parent ) )
, пока не дойдёшь до вершины иерархии. Ваш подход явно будет эффективнее.

Не уверен, что это наиболее эффективный способ, но это можно сделать с помощью рекурсивной функции
function get_post_ancestor_title($post_id){
$post = get_post($post_id)->post_parent;
if ( 0 == $post->post_parent ) {
return get_the_title();
} else {
get_post_ancestor_title($post->ID);
}
}

Лучше вот так: https://css-tricks.com/snippets/wordpress/find-id-of-top-most-parent-page/
