コーポレートサイトなどでWordPressを使用している場合、サイドメニューに固定ページ一覧を使用する場合があると思います。
その際に、「特定のメニューのリンク先だけページを作成せず、他の既存ページや外部サイトにリンクさせたい」という要望は、意外と多いのではないでしょうか。
「メニュー」機能を使い、自由にサイドメニューを選ぶという方法も一案だと思いますが、ページを追加する度にさらにメニューで設定するのは、カテゴリが多いサイトだと面倒だと思います。
そこで、カテゴリ毎(親ページ毎)に固定ページを一覧させて、メニューのリンク先を、特定のカスタムフィールドに入力があった場合は、カスタムフィールドの値を入力、ない場合はパーマリンクを設定する方法を考えたメモを、まだ未完成ですが残しておきたいと思います。
要件
- 固定ページの「親ページ」毎に「子ページ」を一覧するサイドメニューを作りたい。
- メニュー(子ページ)の中には、子ページへリンクせず、既存の他のページへリンクを設定したいメニューがある。
PHPコード
<div id="sub"> <section id="subMenu"> <?php $ancestor = array_pop( get_post_ancestors( $post->ID ) ); $top_parent_permalink = get_permalink( $ancestor ); $top_parent_title = get_the_title( $ancestor ); ?> <h1><a href="<?php echo ($top_parent_permalink);?>"><?php echo ($top_parent_title);?></a></h1> <?php if(is_subpage()){ $pagelist = $ancestor; } else { $pagelist = $post->ID; } $children= get_pages('child_of='.$pagelist); echo '<ul>'; foreach ( $children as $page ) { $list_menu = '<li><a href="'; $menu_url = get_post_meta($page->ID, 'other_url', true); if($menu_url !=""){ $list_menu .= $menu_url; }else{ $list_menu .= get_page_link( $page->ID ); } $list_menu .= '">'; $list_menu .= $page->post_title; $list_menu .= '</a></li >'; echo $list_menu; } echo '</ul>'; ?> </section> </div><!-- /#sub -->
別途、「other_url」という値のテキストのカスタムフィールドを作成しておきます。
上記のコードは子ページの判定に、次のサイトの設定をfunctions.phpに追加しています。
(ありがとうございます!)
//子ページ判定 function is_subpage() { global $post; if ( is_page() && $post->post_parent ) { return $post->post_parent; } else { return false; }; };
上記コードの問題点
「子ページ」までなら問題ないですが、「孫」ページがある場合、階層化されず表示されてしまいます。
この問題点を解決できたら、実際に活用できるのではと思います。
そのうちチャレンジしたいです。
コメント