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

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

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

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

PHP

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

Q&A

解決済

1回答

563閲覧

get_categoriesとquery_postsを組み合わせて、指定のカテゴリ配下のサブカテトップページと記事の一覧を表示したい

yarn

総合スコア28

WordPress

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

PHP

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

1グッド

0クリップ

投稿2018/10/02 10:06

前提・実現したいこと

wordpressで、下記のような構成でのページ一覧を自動で出力したいと考えております。

<dl> <dt> <a href="">カテゴリAトップ</a> </dt> <dd> <ul> <li><a href="">サブカテゴリAトップ</a></li> <li><a href="">サブカテゴリA下層ページ</a></li> <li><a href="">サブカテゴリBトップ</a></li> <li><a href="">サブカテゴリB下層ページ</a></li> <li><a href="">カテゴリA直下の下層ページ</a></li> <li><a href="">カテゴリA直下の下層ページ</a></li> <li><a href="">カテゴリA直下の下層ページ</a></li> <li><a href="">カテゴリA直下の下層ページ</a></li> </ul> </dd> </dl> <dl> <dt> <a href="">カテゴリBトップ</a> </dt> <dd> <ul> <li><a href="">サブカテゴリCトップ</a></li> <li><a href="">サブカテゴリC下層ページ</a></li> <li><a href="">サブカテゴリDトップ</a></li> <li><a href="">サブカテゴリD下層ページ</a></li> <li><a href="">カテゴリB直下の下層ページ</a></li> <li><a href="">カテゴリB直下の下層ページ</a></li> <li><a href="">カテゴリB直下の下層ページ</a></li> <li><a href="">カテゴリB直下の下層ページ</a></li> </ul> </dd> </dl>

発生している問題・エラーメッセージ

下記コードだと、サブカテトップページのみが表示されず、

■コード

<?php $args = array( 'parent' => 0, 'hide_empty' => 0 ); $categories = get_categories($args); foreach($categories as $category) : ?> <dl> <dt> <a href="<?php echo get_category_link( $category->term_id ); ?>"><?php echo $category->cat_name; ?></a> </dt> <dd> <ul> <?php query_posts('cat='.$category->cat_ID); if (have_posts()) : while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li> <?php endwhile; endif; ?> </ul> </dd> </dl> <?php endforeach; ?>

■出力結果
※「サブカテゴリAトップ」「サブカテゴリBトップ」…が表示されません。
<dl>
<dt>
<a href="">カテゴリAトップページ</a>
</dt>
<dd>
<ul>
<li><a href="">サブカテゴリA下層ページ</a></li>
<li><a href="">サブカテゴリB下層ページ</a></li>
<li><a href="">カテゴリA直下の下層ページ</a></li>
<li><a href="">カテゴリA直下の下層ページ</a></li>
<li><a href="">カテゴリA直下の下層ページ</a></li>
<li><a href="">カテゴリA直下の下層ページ</a></li>
</ul>
</dd>
</dl>
<dl>
<dt>
<a href="">カテゴリBトップページ</a>
</dt>
<dd>
<ul>
<li><a href="">サブカテゴリC下層ページ</a></li>
<li><a href="">サブカテゴリD下層ページ</a></li>
<li><a href="">カテゴリB直下の下層ページ</a></li>
<li><a href="">カテゴリB直下の下層ページ</a></li>
<li><a href="">カテゴリB直下の下層ページ</a></li>
<li><a href="">カテゴリB直下の下層ページ</a></li>
</ul>
</dd>
</dl>

試したこと

・the_postが孫ページならば…などのif文を構築しようと試みましたが、htmlの構成との相性が悪くできませんでした。

補足情報(FW/ツールのバージョンなど)

WordPress 4.9.4を使用しております。

退会済みユーザー👍を押しています

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

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

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

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

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

marlboro_tata

2018/10/03 01:11

質問内にコードを書くときは、「コードの挿入」を利用して書かれることをおすすめします。ちょっと見づらいので、問題が把握しにくいかもしれません。
guest

回答1

0

ベストアンサー

質問にあったPHPコードを、WP環境で確認しましたが、親カテゴリに属する子カテゴリを含めた記事の一覧が取得できているだけ、という状況に見えます。(WPでは、親カテゴリの記事一覧に、その子カテゴリに属する記事も「含まれます」)
理想とする出力を得るためには、下記のような構成になると思います。

PHP

1 2<親カテゴリの一覧を取得・ループ開始> 3 <親カテゴリアーカイブへのリンクを出力> 4 <親カテゴリに属する子カテゴリを取得・ループを開始> 5 <子カテゴリアーカイブへのリンクを出力> 6 <子カテゴリに属する記事を取得・ループを開始> 7 <記事へのリンクを出力> 8 <子カテゴリに属する記事のループを終了> 9 <親カテゴリに属する子カテゴリのループを終了> 10 <親カテゴリに属する記事を取得・ループを開始> 11 <記事へのリンクを出力> 12 <親カテゴリに属する記事のループを終了> 13<親カテゴリの一覧のループを終了> 14

今のコードには、「親カテゴリに属する子カテゴリを取得してループする」という部分がまるっと抜けています。

サンプルのコードは以下の通りです。WP_Queryではなく、get_posts()を使いました。
親カテゴリの記事一覧を取得するときに、やはり、子カテゴリの記事も合わせて取ってきてしまうので、
'tax_query' で 'include_children' => false を追記することで、親カテゴリ直下の記事のみ取り出せました。

PHP

1<?php 2 $args = array( 3 'parent' => 0, 4 'hide_empty' => 0 5 ); 6 $categories = get_categories($args); 7 //以下から親カテゴリのループ 8 foreach($categories as $category) : 9?> 10<dl> 11 <dt> 12 <a href="<?php echo get_category_link( $category->term_id ); ?>"><?php echo $category->cat_name; ?></a>(親カテゴリアーカイブへのリンク) 13 </dt> 14 <dd> 15 <ul> 16 <?php 17 $args = array( 18 'parent' => $category->term_id, 19 'hide_empty' => 0 20 ); 21 $children = get_categories($args); 22 //以下から子カテゴリのループ 23 if($children): 24 foreach($children as $child) : 25 ?> 26 <li><a href="<?php echo get_category_link( $child->term_id ); ?>"><?php echo $child->cat_name; ?></a>(子カテゴリアーカイブへのリンク)</li> 27 <?php 28 $args = array( 29 'posts_per_page' => -1, 30 'category' => $child->term_id 31 ); 32 $myposts = get_posts( $args ); 33 //ここから子カテゴリに属する記事のループ 34 if($myposts): 35 foreach ( $myposts as $post ) : setup_postdata( $post ); ?> 36 <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>(子カテゴリ記事)</li> 37 <?php endforeach; 38 wp_reset_postdata(); 39 endif; 40 //子カテゴリに属する記事のループここまで 41 ?> 42 <?php endforeach; 43 endif; 44 //子カテゴリのループここまで 45 ?> 46 <?php 47 $args = array( 48 'posts_per_page' => -1, 49 'tax_query' => array( 50 array( 51 'taxonomy' => 'category', 52 'field' => 'term_id', 53 'terms' => $category->term_id, 54 'include_children' => false 55 ) 56 ) 57 ); 58 $myposts = get_posts( $args ); 59 //ここから親カテゴリに属する記事のループ 60 if($myposts): 61 foreach ( $myposts as $post ) : setup_postdata( $post ); ?> 62 <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>(親カテゴリ記事)</li> 63 <?php endforeach; 64 wp_reset_postdata(); 65 endif; 66 //親カテゴリに属する記事のループここまで 67 ?> 68 </ul> 69 </dd> 70</dl> 71<?php endforeach; 72//親カテゴリのループここまで 73?> 74

投稿2018/10/03 01:38

編集2018/10/03 10:59
marlboro_tata

総合スコア525

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

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

yarn

2018/10/05 04:49

ご回答誠にありがとうございます。 指定のカテゴリ記事一覧の中にサブカテゴリのページが含まれない、ということが抜けていました。 サンプルコードまでご記載いただき、大変助かりました。 >質問内にコードを書くときは、「コードの挿入」を利用して書かれることをおすすめします。ちょっと見づらいので、問題が把握しにくいかもしれません。 こちらもありがとうございます。 今後そのようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問