WordPress - выводить список многоуровневых родительских страниц на дочерней странице 3-го уровня - PullRequest
2 голосов
/ 21 июля 2009

Сейчас я работаю над сайтом, и навигация работает следующим образом (по спецификации клиента).

Под заголовком находится горизонтальная навигация, в которой перечислены страницы верхнего уровня, щелкнув по одной из них, вы попадете на страницу page.php, которая имеет вертикальную навигацию в боковой панели, в которой перечислены подстраницы этой конкретной страницы, например: 1003 *

2-й уровень - 3 уровень - 3 уровень - 3 уровень 2 уровень - 3 уровень - 3 уровень - 3-й уровень

и т. Д. И т. П.

Это код, который я сейчас использую в вертикальной навигации:

$children = wp_list_pages('title_li=&child_of='.$post->ID.'&echo=0');
if ($children)
{
    <ul>
        echo $children;
    </ul>
}

То, что я хотел бы сделать, это продолжать иметь ту же вертикальную навигацию, независимо от текущего уровня страницы. Мне трудно перечислять подстраницы страницы 1-го уровня, когда вы находитесь на странице 3-го уровня.

Любые предложения с благодарностью.

Ответы [ 3 ]

3 голосов
/ 18 октября 2009

Попробуйте использовать get_post_ancestors. Этот подход, казалось, работал для меня в аналогичной ситуации:

<?php
global $wp_query;
$post = $wp_query->post;
$ancestors = get_post_ancestors($post);
if( empty($post->post_parent) ) {
    $parent = $post->ID;
} else {
    $parent = end($ancestors);
} 
if(wp_list_pages("title_li=&child_of=$parent&echo=0" )) { ?>

<ul id="secondary-nav">
    <?php wp_list_pages("title_li=&child_of=$parent&depth=1" ); ?>
</ul><!-- #secondary-nav -->

<?php } ?>

Затем я использовал это для определения текущих состояний навигации с помощью CSS:

#secondary-nav li a:hover,
#secondary-nav li.current_page_item a,
#secondary-nav li.current_page_ancestor a {
    background:#fcb701;
}

Вам, вероятно, потребуется удалить параметры глубина , чтобы показать, что вы страницы 3-го уровня.

Надеюсь, это поможет!

0 голосов
/ 25 ноября 2013

Как только вы окажетесь внутри The Loop, очень легко получить обратную историю всех предков страниц.

<?php
    // It's not necessary to globalize $post if you're doing this inside your page.php
    // but if you're in, say, sidebar.php, then you need to declare the global variable
    global $post;

    // We have to reverse the array so the top link is the topmost ancestor
    $history = array_reverse( array_map( 'get_post', get_post_ancestors( $post ) ) );

    // And if you want to add this page to the list as well, push it onto the end
    $history[] = $post;
?>

<ol>
<?php
    // Now, loop through each page in the list
    foreach( $history as $page ){
         echo "<li><a href='" . get_permalink( $page->ID ) . "' />" . get_the_title( $page ) . '</a>';
    }
?>
</ol>

Ключевая строка, конечно, $history = array_reverse( array_map( 'get_post', get_post_ancestors( $post ) ) ); Это делает две вещи:

  1. Он сопоставляет идентификаторы, возвращаемые get_post_ancestors(), с действительными WP_Post объектами (что не является строго необходимым, поскольку все, что нам действительно нужно, это идентификаторы, которые нужно передать get_permalink() и get_the_title())
  2. Он меняет порядок массива, так как get_post_ancestors() помещает непосредственного родителя в top списка, и мы, вероятно, хотим, чтобы он был внизу.
0 голосов
/ 12 апреля 2012

Я думаю, что это может быть вашей помощью. У меня была такая же проблема. Мне пришлось показать элементы макета родительской страницы (все) на дочерней странице.

add_action('wp_head', 'init_stuffs');
function init_stuffs(){
  if( is_page() ){
    $parents = get_ancestors(get_the_id(), 'page');
    if( count( (array) $parents ) >= 2 ){
      //now you can use $parents[1] as parent
      registry()->setParentPageId($parents[1]);
    }
  }
}

В моем случае мне приходилось загружать списки родителей. Я использовал плагин реестра Wordpress для хранения идентификатора $ родителей [1]. Затем я выбрал данные родителей, просто передав идентификатор родительской страницы в функцию, из которой выбираются данные фотографий.

function fetchBlurbs($parentId = null){
  if(is_null($parentId)){
    //fetch blurb for the page
  }else{
    //fetch blurb of parent page
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...