[WordPress] カスタム投稿タイプでのカレント表示

まさにこれと同じ状況にぶち当たり

http://www.warna.info/archives/866/

グローバルナビゲーションメニューはこれをアレンジすれば何とかなるということは分かった。

しかしどっちかというとグローバルメニューでカレントを明示するのはタブのようなものならやるけど

シンプルなものならあまりやらないのではないかと思います。

どっちかというと困るのはサブメニュー。

サイドバーなどに階層が表示されている場合など、こっちは今選ばれている場所を明示しないわけには行かない。

 

固定ページに加えてブログも存在し

表示設定-フロントページの表示が固定ページとして

フロントページ:サイトトップ

投稿ページ:ブログ

となっておりパーマリンク設定はカスタム

というような構成ですが

 

カスタム投稿タイプだと詳細ページ(the_permalink()でいくところ)では

/blog配下に存在するわけなので

一覧ページは固定ページで実際に階層となっているので問題なくカレント表示できても、詳細ページは/blog下にいるのでできませんというかブログ下のメニュー階層が表示されてしまうことになりかねません。

 

グローバルナビゲーションのようにフィルタで何とかならんかなと

wp_list_pagesをadd_filterで変更するものは、できあがったHTMLを修正するものになるので

そこから無理やり文字列を置き換えてやるというのはできなくはないけど

あんまりな感じ

 

WordPressのソースを直接いじるものがあったが

さすがにこれはいただけない

WordPressの更新のたびに

・そこが変わって使えなくなってないか

・毎回そこを修正する

羽目になる

http://ameblo.jp/uassist-ceo/entry-10738128182.html

 

Walkerとかでやればいいのかなぁとおもいつつ見つけたのがこれ

http://www.mark-leong.com/wordpress-hack-force-wp_list_pages-to-print-current_page_item-class/

実に単純な話逆転の発想

無理やり今のページを別のページと思わせればcurrent_page_itemをつけてくれるではないか

ということで解決

抜粋するとこんな感じ

<?php
    // カスタム投稿hoge
    // カスタム分類hogetypes(選択は1個と限定)
    // A (固定ページ)
    //  |
    //  +- B1 分類1一覧(固定ページ)
    //  |   |
    //  |   +- C1 詳細
    //  |
    //  +- B2 分類2一覧(固定ページ)
    //      |
    //      +- C2 詳細
    if( is_singular('hoge') ){ ?>
        <!--サイドバー ▼-->
        <div id="side_container">
          <div class="submenu">

            <?php
            $id = get_page_by_path ('A')->ID; ?>

              <h2><a href="<?php echo get_permalink($id); ?>"><?php echo get_the_title($id); ?></a></h2>
              <?php
              if( wp_list_pages("title_li=&child_of=$id&echo=0" ) ){
                  // current_page_itemを変更するため擬似的に目的のページであると思わせる
                  $the_id = $id;// デフォルト 親ページ
                  $terms = get_the_terms( $post->ID ,'hogetypes');
                  foreach ( $terms as $term ) {
                      $slugs[] = $term->slug;
                  }
                  if( in_array("B1",$slugs) ){
                      $the_id = get_page_by_path ('A/B1')->ID;
                  }
                  else if( in_array("B2",$slugs) ){
                      $the_id = get_page_by_path ('A/B2')->ID;
                  }
                  $temp_query = clone $wp_query;
                  $wp_query->is_page = 1;
                  $wp_query->queried_object_id = $the_id; ?>
                <ul>
                <?php wp_list_pages("title_li=&child_of=$id&depth=2" ); ?>
                </ul>
              <?php
              }
              $wp_query = clone $temp_query; ?>

          </div>
        </div><!--end of side_container-->
        <!--サイドバー ▲-->
<?php
    }
?>

関連してるかも記事

この記事へのコメント

※コメントはスパム対策の為、承認制となっています。あらかじめご了承ください。

トラックバックURL