wp_list_pages 表示中ページの親子関係だけ開く

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

固定ページの階層が4階層。最上階層ごとに分けて、サイドバーのナビに表示するのは2階層目から。
1階層目のページにいる時は2階層目だけを表示。
2階層目のページにいる時は2階層目と表示中ページの子ページを開く。
3階層目のページにいる時は2階層目・3階層目と表示中ページの子ページを開く。
4階層目のページにいる時は2階層目・3階層目と表示中ページの親の子ページを開く。

<style type="text/css">
ul.children {display:none;}
<?php if($post->post_parent AND !get_page($post->post_parent)->post_parent):?>
li.current_page_item ul.children
 {display:block;}
li.current_page_item ul.children li ul.children
 {display:none;}
<?php elseif(!has_subpage()): global $post; $pID = $post->post_parent; $ppID = get_page($post->post_parent)->post_parent; ?>
li.page-item-<?php echo $ppID; ?> ul.children {display:block;}
li.page-item-<?php echo $ppID; ?> ul.children li ul {display:none;}
li.page-item-<?php echo $ppID; ?> ul.children li.page-item-<?php echo $pID; ?> ul {display:block;}
<?php else: ?>
li.current_page_item ul.children,
li.current_page_ancestor ul.children,
li.current_page_parent ul.children
 {display:block;}
<?php endif; ?>
</style>

親ページはあるが、その親ページには親ページがない=2階層目、子ページがない=最下層、で、分岐。

has_subpage の条件分岐を有効にするためにfunctions に

function has_subpage (){
global $post;
$pages = get_pages("sort_column=menu_order&amp;amp;depth=1&amp;amp;child_of={$post->ID}");
if ($pages) return TRUE;
}