皆さん、いつもお世話になっております。
(タイトルが分かりにくくてすみません)
WordPressをCMSとして使う際に以下のようなページリスト表示機能が必要になりました。
例えば,下のようなツリーのページ群があるときに、
a [親]
b [親]
-b1 [子]
-b2 [子]
c [親]
-c1 [子]
--c1-1 [孫]
aを閲覧時には
a
b
c
b、もしくは、b配下を閲覧時には
a
b
-b1
-b2
c
c、もしくは、c配下を閲覧時には
a
b
c
-c1
--c1-1
といったページツリー表示になるというものです。
上記要件を満たすpluginをさがしていましたが、サブページだけ表示するものや、javascriptで開閉の出来る超高機能(今回はOverSpec)なものは見つかれど、ピッタリ来るシンプルものが見つからず、結局、自分で関数を作ってみて、ひ孫ページまで存在するツリー構成でも、一応、想定した動きをするところまでこぎ着けました。
そこで、もしも同じニーズを持った方がいらっしゃった場合に、少しでも役に立てばとplugin化も考えましたが,何ぶん、日曜プログラマー以下のスキルなので、まずもって自分のコードが正しいのか、もし正しかったとしても効率的なのかが全く自信がありません。。。(wp_list_pages()の仕様が変わった時には、破綻してしまう構成なのは仕方ないかとは割り切っています)
もしもお手隙の方がいらっしゃいましたら、以下のコードの欠点をご指摘いただけませんでしょうか。もしくは、『自作せずとも、そういうプラグインがあります』でも、大変有り難いです。
function fl_pages() {//WP2.5 and later only
global $post;
//get parents page list
$parents=wp_list_pages('title_li=&depth=1&sort_column=menu_order&echo=0');
if (is_page() && $post->post_parent ) { //when the page has a parent
$top_of_subpage = array_pop( get_post_ancestors( $post->ID ) );
} else { //when the page has no parent
$top_of_subpage=$post->ID;
}
//get children page list
if ( $top_of_subpage > 0 ) {
$children = wp_list_pages('title_li=&sort_column=menu_order&child_of='.$top_of_subpage.'&echo=0');
}
if ( $children ) {
$children="<ul class='fl-childrenpages fl-children-of-".$top_of_subpage."'>\n".$children."</ul>\n";
}
//insert children page list into parents page list
$children_insert_regex='(page-item-'.$top_of_subpage.'[^<>"]+)("><a href="[^<>]+>[^<>]+<\/a>)';
$children_insert_regexafter='$1$2'.$children;
$fl_pages = preg_replace("/".$children_insert_regex."/",$children_insert_regexafter,$parents);
echo $fl_pages;
}
ちなみに、私の環境は、Wordpress2.7.1&Coreserverで、今のところ、上記関数をfunctions.phpに入れて、使っています。
いつも願いばかりで大変恐縮ですが、
ご教授の程、どうぞ宜しく御願いいたします。