2007/11/15追記
以下の方法では環境によってエラーが出るようです。修正版は「その2」を参照。

「ページ」機能で作ったページへのリンクリストはwp_list_pagesで簡単に作り出すことが出来ます。ulタグとliタグを組み合わせて書き出してくれるので手軽なのですが、ちょっと凝ったことをしたい場合にてこずる事があります。

例えば・・・

<div id=”sidebar”>
<h2>メニュー</h2>
<ul>
<li><a href=”<?php bloginfo(’url’); ?>/”>ホーム</a></li>
<li><a href=”<?php bloginfo(’url’); ?>/page1/”>ページ1</a></li>
<li><a href=”<?php bloginfo(’url’); ?>/page2/”>ページ2</a></li>
<li><a href=”<?php bloginfo(’url’); ?>/page3/”>ページ3</a></li>
</ul>
</div>

こんな感じでソースを作り出したいときは、1つ目のliタグはテンプレートに手動で書き込み、2つ目以降のliタグの行は自動で書き出せるといいのですが、wp_list_pagesではこういう使い方ができません・・・

そ こで、ソースコードを見てみました。「post-template.php」にwp_list_pagesが定義されています。ざっと見たところ 「get_pages()」でページを取得して、「walk_page_tree()」でページの階層を解析しliタグ付きで出力しているようです。ちな みに、walk_page_tree()はwp_list_pagesのすぐ後で定義されています。

ということで、今回は「walk_page_tree()」を利用してみました。以下がそのソース。

<div id=”sidebar”>
<h2>メニュー</h2>
<ul>
<li><a href=”<?php bloginfo(’url’); ?>/”>ホーム</a></li>
<?php
$childOf = ‘child_of=0&sort_column=menu_order’;
$depth = 0;
$current_page = 0;
$pages = get_pages($childOf);
if ( is_page() )
$current_page = $wp_query->get_queried_object_id();
$output = walk_page_tree($pages, $depth, $current_page, $childOf);
echo($output);
?>
</ul>
</div>

変数「$childOF」で設定しているのはwp_list_pagesの引数がそのまま使えます。変数「$depth」は出力するサブページの階層の深さの設定・・・だと思います・・・ここは、よく調べてないので間違ってたらすみません。

以 上で想定していたソースを出力することができるようになりました。walk_page_tree()では「Walker_Page」を使ってオブジェクト を作り出して操作しているようです。「classes.php」でWalker_Pageが定義されていますが、ちらっと見たところ、このオブジェクトを 操作すればもっと細かいソースの出力が出来そうです。

関連記事