Получить заголовок верхнего родительского уровня страницы

25 окт. 2011 г., 17:44:04
Просмотры: 19.2K
Голосов: 7

Как получить заголовок страницы самого верхнего родителя текущей страницы посетителя?

Опишу ситуацию:

У меня такая структура страниц:

  • Пример Заголовка 1
    • Пример Заголовка 1-1
      • Пример Заголовка 1-1-1
      • Пример Заголовка 1-1-2
    • Пример Заголовка 1-2
  • Пример Заголовка 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 страниц, чтобы добраться до верхнего уровня. Есть ли более эффективный способ?

0
Все ответы на вопрос 2
3
15

Нашел такой способ:

if ( 0 == $post->post_parent ) {
    the_title();
} else {
    $parents = get_post_ancestors( $post->ID );
    echo apply_filters( "the_title", get_the_title( end ( $parents ) ) );
}

Если у кого-то есть более оптимальное решение, пожалуйста, поделитесь.

25 окт. 2011 г. 17:56:30
Комментарии

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

Chip Bennett Chip Bennett
25 окт. 2011 г. 18:09:56

Надеюсь, вы не против правки. (+1)

kaiser kaiser
25 окт. 2011 г. 20:55:15

Знаю, что это старая тема, но так как функция возвращает массив (даже если предок только один), кажется, это не работает.

Nathan Nathan
14 окт. 2022 г. 20:23:14
1

Не уверен, что это наиболее эффективный способ, но это можно сделать с помощью рекурсивной функции

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);
    }
}
25 окт. 2011 г. 22:52:18
Комментарии

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

TCB13 TCB13
18 мая 2023 г. 00:45:48