親ページに属する全子ページのタイトルと本文を表示
-
失礼します。初心者です。
ある親ページに、属する全ての子ページのタイトルとmore以上の内容(画像含む)を表示したいのです。構成は下記の通りです。
・top
├・japan
│ ├・kyoto
│ ├・sapporo
│ ├・tokyo
│ └・hakata
├・australia
│ ├・sydney
│ ├・
│ ├・このjapanページに、kyoto,sapporo,tokyo,hakataのタイトルとmoreまでの本文と写真を表示したいのですが、できるのでしょうか。
もし、できるならタグやコードなど教えていただけると助かります。ちなみに現状は、NextGEN Galleryのgalleryとalbumの機能を使って無理やり作っておりますが、新規作成や編集が複雑で相棒が更新できないのでシンプルにしたいと考えています。
よろしくお願い致します。
-
peppercinoさん、こんにちは。
写真がどこに配置されているのかわからないので、すこし違うかもしれませんが、下記コードをページのテンプレートに追加してみてください。japan、australiaなどの最上位ページで子ページのタイトルとmore以前の本文の表示一覧が表示されるかと思います。
htmlのマークアップはお好みで修正してください。
子ページの表示順は、タイトル順にて指定してありますが、こちらもお好みで修正ください。<?php if ( $post->post_parent == 0 ) { $child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=' . $post->ID ); if ( $child_posts ) { foreach ( $child_posts as $child ) { $c_title = apply_filters( 'the_title', $child->post_title ); $c_content = get_extended( $child->post_content ); $c_content = apply_filters( 'the_content', $c_content['main'] ); ?> <div class="child_page_excerpt"> <h3><?php echo $c_title; ?></h3> <?php echo $c_content; ?> </div> <?php } } } ?>
jim912さん
ありがとうございます!
すごいです。
細かい検証はまだですが、大成功です。このコードがわかるように勉強します。
本当にありがとうございました。ついでに、もう一点だけ。
runPHPを使って、特定のページに上記コードを組み込むことはできるのでしょうか?
例えば親ページのIDを指定して実行させるような感じです。
よろしくお願い致します。2日間、日本語ホームのテンプレート一覧を見ながら試行錯誤しましたが、
望むことができるようになりました。
ありがたいです。peppercinoさん、こんばんは。
runPHPを使って、特定のページに上記コードを組み込むことはできるのでしょうか?
例えば親ページのIDを指定して実行させるような感じです。get_postsのpost_parentパラメータを変数から持ってくるのではなく、記述してあげる必要があると思いますが可能ではあります。
ただ、個人的には、本文部分をPHPとして評価させることによる負荷、速度の低下などを考慮すると、runPHPを利用するよりは、テンプレートに記述して、最初の条件文を適切にカスタマイズする方が良いのでは?と思います。
jim912さん
本文部分にPHPを配すると負荷がかかるんですね。
了解いたしました。いろいろ教えていただき、ありがとうございました。
解決とさせていただきます。この件で関連して質問がありますので、再び開かせていただきます。すみません。
jim912さんに教えていただいた方法で親ページに、子ページを表示することができました。
ありがとうございます。新たにやりたいことは、他のページに特定の親ページに属する子ページを表示させたい、ということです。
jim912さんに教えていただいた方法でいえば、
テンプレートに記述して、最初の条件文を適切にカスタマイズする
方法を教えていただけますと、助かります。
特定の親ページの子ページを表示させるページは、親ページと同じ階層(第一階層)です。
この3日間、Wordpressやその他のPHP関連のページを読んで試行錯誤しましたがわかりませんでした。お手数をお掛けします。
よろしくお願い致します。jim912さんのコードの
ifブロックをとって$post->ID
を特定の親ページのIDにすれば良さそうです。
書かれていないので分かりませんが、条件はなにか必要なのでしょうか。
taikikenさん、ありがとうございます。
条件は、特定の親ページと、もう1つのページ両方に表示することです。
特定の親ページのIDを仮に10、あるページのIDを仮に20とした時のコードを教えていただけるとありがたいです。
コードは、ページ・テンプレートに書くことになります。ちなみに、taikikenさんが書かれた、
ifブロックをとって$post->を特定の親ページのIDにすれば
というのは、runPHPなどでページ内にPHPコードを書き込んで使う、ということですよね。
その場合は、<?php $child_posts = get_posts( ‘numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=’ . 20 );
if ( $child_posts ) {
foreach ( $child_posts as $child ) {
$c_title = apply_filters( ‘the_title’, $child->post_title );
$c_content = get_extended( $child->post_content );
$c_content = apply_filters( ‘the_content’, $c_content[‘main’] );
?>
<div class=”child_page_excerpt”>
<h3><?php echo $c_title; ?></h3>
<?php echo $c_content; ?>
</div>
<?php
}
}
?>ということでしょうか。
何度か試してみましたが、動きませんでした。
知識が足りなく、申し訳ないです。
ご指導、よろしくお願い致します。peppercinoさん、こんにちは。
特定の親ページのIDを仮に10、あるページのIDを仮に20とした時のコードを教えていただけるとありがたいです。
ID10と20のページに表示させたいのであれば、
if ( $post->post_parent == 0 ) {
の部分を
if ( $post->ID == 10 || $post->ID == 20 ) {
または、
if ( in_array( $post->ID, array( 10, 20 ) ) ) {
とすれば良いかと思います。
前者の書き方の方が分かりやすいとは思いますが、適用させるIDが増えた場合に記述が長くなり見にくくなってしまいます。後者の方がとっつきにくくはありますが、適用させるIDが増えた場合でも、arrayの中を増やせば良いだけなので、記述が短く見やすいソースになります。あと、
$child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=' . 20 );
と書いておられますが、変数を適用させるのでなければ、
$child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=20' );
の方が、ほんの少しだけ速く実行できます。
jim912さんへ
お返事が遅くなり失礼しました。
教えていただいたコードで、希望通りのページができました。
本当にありがとうございました。やってみて、表示された子ページのタイトルに、子ページへのリンクが必要なこと、また、他の親ページにも同様の処置をしたいことを思いつき、この一週間、codexを見ながら格闘していました。
jim912さんのコードを手がかりに試行錯誤した結果、無事解決することができました。
最下に最終的なコードを貼り付けておきます。
もし、記述の間違いなどあれば教えていただけるとうれしいです。今回は、PHPをいじろうと思いついたものの、途方にくれていたところ、皆様のお陰で解決することができました。
ありがたいです。
ありがとうございました。<?php if ( in_array( $post->ID, array( 10,20 ) ) ) { $child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=10' ); if ( $child_posts ) { foreach ( $child_posts as $child ) { $c_pagelink = get_page_uri( $child->ID ); $c_title = apply_filters( 'the_title', $child->post_title ); $c_content = get_extended( $child->post_content ); $c_content = apply_filters( 'the_content', $c_content['main'] ); ?> <div class="child_page_excerpt"> <h3><a href="<?php echo $c_pagelink; ?>"><?php echo $c_title; ?></a></h3> <?php echo $c_content; ?> </div> <?php } } } else if ( in_array( $post->ID, array( 30 ) ) ) { $child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=30' ); if ( $child_posts ) { foreach ( $child_posts as $child ) { $c_pagelink = get_page_uri( $child->ID ); $c_title = apply_filters( 'the_title', $child->post_title ); $c_content = get_extended( $child->post_content ); $c_content = apply_filters( 'the_content', $c_content['main'] ); ?> <div class="child_page_excerpt"> <h3><a href="<?php echo $c_pagelink; ?>"><?php echo $c_title; ?></a></h3> <?php echo $c_content; ?> </div> <?php } } } ?>
peppercinoさん、こんにちは。
コード拝見いたしました。間違いはありませんが、ほぼ同じコードの繰り返しになっているので、少々冗長になってしまっている感があります。
条件としては、$post->IDが20の時のみget_postsのpost_parentパラメータが10となり、それ以外(10と30)の場合は、post_parentパラメータに$post->IDを指定すればよいので、下記のように書くと可読性が高まると思います。<?php if ( in_array( $post->ID, array( 10, 20, 30 ) ) ) { if ( $post->ID == 20 ) { $post_parent = 10; } else { $post_parent = $post->ID; } $child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=' . $post_parent ); if ( $child_posts ) { foreach ( $child_posts as $child ) { $c_pagelink = get_page_uri( $child->ID ); $c_title = apply_filters( 'the_title', $child->post_title ); $c_content = get_extended( $child->post_content ); $c_content = apply_filters( 'the_content', $c_content['main'] ); ?> <div class="child_page_excerpt"> <h3><a href="<?php echo $c_pagelink; ?>"><?php echo $c_title; ?></a></h3> <?php echo $c_content; ?> </div> <?php } } } ?>
jim912さん
コードの点検、ありがとうございました。
なるほどですね。勉強になります。知識があるとwordpressは本当に便利ですね。
これからもよろしくお願い致します。ありがとうございました。
初めまして。
上記にある階層の事で伺いたいのですが、
カスタムフィールドで追加しているdescriptionを表示させる事は可能でしょうか?
あと、親のレイアウトが子に引き継がれません。
ThemeはSharpfolioです。
初心者なので、どうぞ宜しくお願い致します。解決済みのスレッドに質問しても回答してもらえる可能性は低いです。
このページへのリンクを記述した新規スレッドを作成することをお勧めします。
- トピック「親ページに属する全子ページのタイトルと本文を表示」には新たに返信することはできません。