コーポレートサイトなどで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に追加しています。
(ありがとうございます!)

参考サイト
WordPressで、現在の固定ページが子ページかどうか判別する
//子ページ判定
function is_subpage() {
	global $post;
        if ( is_page() && $post->post_parent ) {
               return $post->post_parent;
        } else {
               return false;
        };
};

上記コードの問題点

「子ページ」までなら問題ないですが、「孫」ページがある場合、階層化されず表示されてしまいます。

この問題点を解決できたら、実際に活用できるのではと思います。
そのうちチャレンジしたいです。

参考サイト
[解決済み] wp_list_pagesで表示される情報をカスタムフィールドの値で置き換えたい (3 件の投稿)