2

私は現在ウェブサイトに取り組んでおり、ナビゲーションは次のように機能します(クライアントの仕様による)。

ヘッダーの下には、トップ レベルのページを一覧表示する水平ナビゲーションがあり、これらのいずれかをクリックすると、page.php に移動します。サイドバーには、次のような特定のページのサブページを一覧表示する垂直ナビゲーションがあります。

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>
}

私ができるようにしたいのは、現在のページ レベルに関係なく、同じ垂直方向のナビゲーションを維持することです。第 3 レベルのページにいるときに、第 1 レベルのページのサブページをリストするのは難しいと思います。

どんな提案でも大歓迎です。

4

3 に答える 3

3

を使ってみてください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 レベルのページであることを示すには、おそらく深度パラメーターを削除する必要があります。

これが役立つことを願っています!

于 2009-10-18T04:20:26.837 に答える
0

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 ) ) );。これは2つのことを行います。

  1. get_post_ancestors()によって返された IDを実際のオブジェクトにマップします (実際に必要なのはおよびWP_Postに渡す ID だけなので、これは厳密には必要ありません) 。get_permalink()get_the_title()
  2. get_post_ancestors()直接の親をリストの一番上に置くため、配列の順序を逆にしますが、おそらくそれを一番下にしたいでしょう。
于 2013-11-24T20:43:01.980 に答える
0

これはあなたの助けになると思います。私は同じ問題を抱えていました。親ページのレイアウト要素 (すべて) を子ページに表示する必要がありました。

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]);
    }
  }
}

私の場合、親の宣伝文句をロードする必要がありました。$parents[1] ID を保存するために、Wordpress Registry プラグインを使用しました。次に、宣伝文句データがフェッチされる関数に親ページ ID を渡すだけで、親の宣伝文句をフェッチしました。

function fetchBlurbs($parentId = null){
  if(is_null($parentId)){
    //fetch blurb for the page
  }else{
    //fetch blurb of parent page
  }
}
于 2012-04-12T10:31:20.133 に答える