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

概要

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

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

コード

下記のとおりです。

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

//現在のページ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 = 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>';