ありがとうございます。
こちらのページも、こちらに投稿する前に試しました。
リンク先にある、
<Bbbにいる場合>
[Ba]
― Bba
― Bbb
― Bbc
の場合でも、下記のように、
全ての親ページが表示される方法を探しています。
(Homeはないと仮定します。)
― A
― B
―― Ba
―― Bb
――― Bba
――― Bbb
――― Bbc
―C
―D
どの場合でも一番トップの階層から表示し、かつ今のページの子ページはすべて表示したいと考えています。
興味があったので、いろいろさわってみました。
これで動くと思いますがどうでしょう?
整形されたhtmlの適宜修正してください。validじゃないと思いますので。
<?php
if(is_page()){
$list = $post->ancestors;
$parent['list'] = array_reverse($list);
$parent['cnt'] = count($list);
$parent['top'] = array_pop($list);
$page_list = get_pages('parent=0&sort_column=menu_order');
foreach($page_list as $id){
echo '<li><a href="'.get_permalink($id->ID).'">'.get_the_title($id->ID).'</a>'."\n";
if($id->ID == $post->ID){
echo "<ul><li>\n";
wp_list_pages('depth=1&title_li=&child_of=' . $post->ID );
echo "</li></ul>\n";
}
if($id->ID == $parent['top']){
$pointer = $parent['list'];
$cnt = 0;
while($buf = next($pointer)){;
echo '<ul>'."\n";
echo '<li><a href="'.get_permalink($buf).'">'.get_the_title($buf).'</a>'."\n";
$cnt++;
}
echo '<ul><li><a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'."\n";
echo "<ul><li>\n";
wp_list_pages('depth=1&title_li=&child_of=' . $post->ID );
echo "</li></ul>\n";
for($i=0;$i<$cnt;$i++){
echo '</li></ul>'."\n";
}
echo '</li></ul>'."\n";
}
echo "</li>\n";
}
}
else{
wp_list_pages('depth=1&title_li=');
}
?>
ちょっと生成されるhtmlに問題がありましたね。
テーマに直接書くとややこしくなるので
1.テーマディレクトリの function.php に以下のコードを
function wp_list_pages_tree($post){
if(is_page()){
$list = $post->ancestors;
$parent['list'] = array_reverse($list);
$parent['cnt'] = count($list);
$parent['top'] = array_pop($list);
$page_list = get_pages('parent=0&sort_column=menu_order');
foreach($page_list as $id){
echo '<li><a href="'.get_permalink($id->ID).'">'.get_the_title($id->ID).'</a>'."\n";
if($id->ID == $post->ID){
echo "<ul>\n";
wp_list_pages('depth=1&title_li=&child_of=' . $post->ID );
echo "</ul>\n";
}
if($id->ID == $parent['top']){
$pointer = $parent['list'];
$cnt = 0;
while($buf = next($pointer)){;
echo '<ul>'."\n";
echo '<li><a href="'.get_permalink($buf).'">'.get_the_title($buf).'</a>'."\n";
$cnt++;
}
echo '<ul><li><a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'."\n";
echo "<ul>\n";
wp_list_pages('depth=1&title_li=&child_of=' . $post->ID );
echo "</ul>\n";
for($i=0;$i<$cnt;$i++){
echo '</li></ul>'."\n";
}
echo '</li></ul>'."\n";
}
echo "</li>\n";
}
}
else{
wp_list_pages('depth=1&title_li=');
}
}
2.テーマのサイドバー等にコード(例)
<li class="widget">
<ul>
<?php wp_list_pages_tree($post); ?>
</ul>
</li>
これでいいかと思います。
ありがとうございます。
早速、試したところ、
理想の表示となりました。
ありがとうございます。
もう一つ、お聞きしたいのですが、
更新日時を全ての項目に表示したいのですが、
今開いているページとその同階層のページに関しては、wp_list_pagesでの表示で出来るようなのですが、
その上下のループとタグで表示している他階層のリストの更新日時をどのように表示すればよいでしょうか。
get_the_titleのような形で更新日時を呼び出せるのではと、色々試しましたが、
そのような関数がわからず、うまくいきませんでした。
何か方法はありますでしょうか。
頼ってばかりで申し訳ないですが、よろしくお願いします。
追記です。
その後、それぞれの配列のデータをじっくり読んで、なんとか更新日時の表示が出来ました。
PHPは、まだまだ始めたばかりなので、少しずつ理解していこうと思います。
ありがとうございました。
ご希望の動作でしたか?よかったです。
いまいち私自身が飲み込めて無かった気がするので、ちょっと自信がありませんでした。
とにかく動作してよかったです。