質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1071閲覧

カスタム投稿タイプの子ページに親ページと同様の子ページ一覧をつくりたい

gangarujoma

総合スコア14

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/02/24 03:14

カスタム投稿タイプの子ページに子ページの兄弟一覧をリンク付きで表示させたいです。
(親ページと同じものを同じ親の子の兄弟一覧として表示させる)

昨日m.ts10806さんのおかげで、親ページに子ページ一覧をリンク付きで表示させることができましたが、
子ページに遷移すると親ページで表示されていた子ページ一覧は消えてしまいます。
子ページでも親ページと同様に、同じ親の兄弟ページ一覧を表示させたいです。

<ul> <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => 15, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->ID //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; endif; wp_reset_postdata(); ?> </ul>

下記のサイトを参考にif文で子ページだった場合を作ればと思ったのですが、表示すら消えてしまいました・・。
特定のページの子ページかどうか
参考ページ

function.php

function is_child_of($pagename) { if(is_singular( array( 'online_course' ) ) ) { global $post; if($post->ancestors) { $root = $post->ancestors[count($post->ancestors) - 1]; $root_post = get_post($root); $name = esc_attr($root_post->post_name); if($pagename == $name) return true; } } return false; }

sidebar-online_course.php

<ul> <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => 15, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->ID //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endif(is_child_of('online_course')) { // スラッグ名「online_course」ページを親に持つ子ページを表示中 } ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; endif; wp_reset_postdata(); ?> </ul>

こちらも試してみましたが最初と同様、子ページでは一覧表示が消えてしまう上に、
他の親子たちも表示されてしまうようでした。

<?php // 指定したIDの子ページ一覧を表示 $page_ID = get_page_by_path('online_course/child'); // ID取得用の固定ページオブジェクトの取得 $children = wp_list_pages(array( // ページリストの取得 'title_li' => '', // 見出しの非表示 'child_of' => $page_ID->ID, // ページIDを指定 'echo' => '0' // PHP で使うために HTML テキストとして返す )); if($children){ // 子ページがあるときに一覧を表示 wp_list_pages('title_li=&post_type=online_course'); } ?>

検索をかけて調べているのですが、カスタム投稿ページで子ページにも兄弟ページを表示させるというのがなく、わたしの知識も浅く・・困っています。

お力を貸していただけると幸いです。どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

親子ページで、子ページの兄弟ページを表示する場合、WP_Query のパラメータ

'post_parent' => $post->ID //親ページのIDを指定

の部分に子ページの親投稿のID を指定する必要があります。

親ページのID は、$post->post_parent になります。
0 の場合は、現在のページに親ページがない場合です( = 現在の投稿が親ページです。 )

親投稿か子投稿かを判断して、親投稿の場合は、$post->IDのままで、子投稿の場合、$post->ID$post->post_parent に変えるとどうなるでしょうか。

投稿2022/02/24 03:53

編集2022/02/24 03:54
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gangarujoma

2022/02/24 04:25 編集

ありがとうございます! 親投稿か、子投稿かを判断するということで、[こちら](http://creatornote.nakweb.com/wp%EF%BC%88%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%EF%BC%89%E3%81%A7%E8%A6%AA%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8B%E5%AD%90%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%92%E5%88%A4%E6%96%AD/)を参考に function.phpに下記をを追記しました。 ```lang-言語名 /* ------------------------------------------------------------- */ // // 子ページかどうかを判定する関数 // /* ------------------------------------------------------------- */ function is_child( $slug = "" ) { if(is_singular())://投稿ページのとき(固定ページ含) global $post; if ( $post->post_parent ) {//現在のページに親がいる場合 $post_data = get_post($post->post_parent);//親ページの取得 if($slug != "") {//$slugが空じゃないとき if(is_array($slug)) {//$slugが配列のとき for($i = 0 ; $i <= count($slug); $i++) { if($slug[$i] == $post_data->post_name || $slug[$i] == $post_data->ID || $slug[$i] == $post_data->post_title) {//$slugの中のどれかが親ページのスラッグ、ID、投稿タイトルと同じのとき return true; } } } elseif($slug == $post_data->post_name || $slug == $post_data->ID || $slug == $post_data->post_title) {//$slugが配列ではなく、$slugが親ページのスラッグ、ID、投稿タイトルと同じのとき return true; } else { return false; } } else {//親ページは存在するけど$slugが空のとき return true; } }else {//親ページがいない return false; } endif; } ``` テンプレートには下記を追記してみたのですが、認識がされないようでした。。。 ```lang-言語名 <ul> <?php if(is_child()): ?> //ここに子ページの場合の記述 <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => -1, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->post_parent //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php else:?> //ここに親ページの場合の記述 <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => -1, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->ID //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endif; ?> <?php endwhile; endif; wp_reset_postdata(); ?> </ul> ``` ご面倒をおかけします。。。
gangarujoma

2022/02/24 05:18

追記) 分岐がうまくできないのですが、最初のうまくいった記述の部分をCHERRYさんのおっしゃるように$post->post_parentに変更したら子ページで兄弟一覧を表示することができました! あとは分岐ですね・・・。
gangarujoma

2022/02/24 09:29 編集

分岐うまくできました! function.phpには先ほどコメントでいれたものをいれ、テンプレートは下記のようにしました。 ======= <ul> <?php if(is_child()): ?> <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => -1, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->post_parent //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; endif; wp_reset_postdata(); ?> <?php else:?> <?php $args = array( 'post_type' => 'online_course', //固定ページの場合は'page'、カスタム投稿の場合はそのスラッグ 'posts_per_page' => -1, //表示させたいページ数。-1で全ページ表示 'post_parent' => $post->ID //親ページのIDを指定 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; endif; wp_reset_postdata(); ?> <?php endif; ?> </ul> ======== ご回答いただきありがとうございました!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問