[WordPress]ページリストを出力して現在のページ以外の子孫ページのソースをぶっ殺す

最終更新: 2019/02/05/公開: 2018/05/23
この記事は 2018年5月23日 に投稿されました。
内容が古いかもしれません。ご注意ください。
※最後に更新されたのは 2019年2月5日 です。

概要

タイトルの通りなんですけど下記のようなサイドバーが必要だったのでコネコネしてました。
一応できたよ。一応。
なお最後のリスト呼び出しの際に全然条件指定してないのでお好みでカスタムが必要でございます。

  • ページリストが出したい
  • 現在のページまたは現在のページが属する階層以外の子ページ孫ページのリストは出したくない

コード

下記のとおりです。

// 通常のページリストから、
// 現在のページ以外の子ページ孫ページのリストを削除して出力

//現在のページID 親ページがなければそのまま・あれば一番上の親のIDを取得
if( !$post->post_parent ){
$current_id = $post->ID;
} else {
$ancestors = get_post_ancestors( $post->ID );
$current_id = end($ancestors); //get_post_ancestorsの最後の数値が最上層
}

$pages = get_pages(); //ページ全部
$page_ids = array(); //ページID格納用配列
$children_lists = array(); //子ページリスト格納用配列

//1.
//最上層のページIDを配列に格納
foreach( $pages as $page ){
if( !$page->post_parent ){ //ここはforeach文の変数を使わないとダメなので$page->post_parentになります
$page_ids[] = $page->ID;
}
}
//現在のページIDを配列から削除
$page_ids = array_diff($page_ids, array($current_id));
//配列を詰める
$page_ids = array_values($page_ids);

//2.
//現在のページ以外の子ページ孫ページのリストを、後ほどの置換用に文字列として取得(タブと改行を削除)
foreach( $page_ids as $page_id ){
$children_lists[] = preg_replace('/[\n\t]/', '', wp_list_pages( 'title_li=&child_of='.(int)$page_id.'&echo=0' ));
     //ここと 下の「$all_pages」のwp_list_pages両方とも「child_of」以外のオプションを完全に合わせる。
    // sort_columnを片方にしか設定しなかった場合などにマッチしなくて除外に失敗するため。
}
//全ての固定ページリストを文字列として取得(タブと改行を削除)
$all_pages = preg_replace('/[\n\t]/', '', wp_list_pages( 'title_li=&echo=0' ));
//現在のページ以外の子ページ孫ページのリストを削除
$page_list = str_replace($children_lists, '', $all_pages);
//空のul.childrenを削除
$page_list = str_replace('<ul class=\'children\'></ul>', '', $page_list);


//3.
//リストを出力
echo '<ul>'.$page_list.'</ul>';