固定ページに関連する投稿をナビに表示

情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。

トップの表示は
第1階層A
第1階層B

第1階層のページを開いた時は
第1階層A
 第2階層A
 第2階層B
第1階層B

第2階層のページを開いた時、関連する投稿を開いた時
第1階層A
 第2階層A
  第2階層Aの関連カテゴリーの投稿1
  第2階層Aの関連カテゴリーの投稿2
第1階層B

という仕組みのナビ

第1階層は共通のメタ値を持たせて
get_pages( array( ‘meta_key’ => ‘aaaa’, ‘meta_value’ => ‘xxxx’, ‘sort_order’ => ‘desc’ ) );

第2階層は
get_pages( array( ‘child_of’ => $page->ID, ‘sort_order’ => ‘desc’ ) );
表示中と非表示のクラスを付けて、選択されていない場合は非表示・表示中の第1階層の子ページにあたる時は表示とスタイルを付ける。

第3階層は第2階層のページに表示したいカテゴリースラッグをメタ値として持たせ、
$cat1 = get_post_meta($page->ID , ‘bbbb’ ,true); $args = array(
‘posts_per_page’=>’-1′,
‘tax_query’ => array(
array(
‘taxonomy’=>’category’,
‘terms’=>$cat1,
‘field’=>’slug’,
‘operator’=>’IN’
),
)
);
$query = new WP_Query( $args );
で表示。ここまでは固定ページでの表示。
第3階層を開いた時は個別ページとなるので、まず、最下層のカテゴリーを取得して $cat2 とし、第2階層は関連付けたページだけを表示するので、
get_pages( array( ‘child_of’ => $page->ID, ‘meta_key’ => ‘bbbb’, ‘meta_value’ => $cat2, ‘sort_order’ => ‘desc’ ) );
この時、他の第1階層の子ページを閉じておくために、第1階層のページには、その下に表示するカテゴリースラッグを全てメタ値に含め
$relations = get_post_meta($page->ID , ‘cccc’ ,true);
$element = $cat2;
$pos = strpos($relations, $element);
if ($pos !== false) {
で、スラッグの文字列が含まれているかどうか、get_pagesの前でチェックさせる。

投稿は’terms’=>$cat2,で取得、第2階層のページのメタ値(カテゴリー)と投稿のカテゴリーが同じ時だけ表示する。
if($query->have_posts() && $cat1 == $cat2):