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

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

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

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

PHP

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

Q&A

解決済

1回答

1126閲覧

タクソノミーアーカイブページで子タームの情報を記事ごとに取得したい

ai_123

総合スコア25

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/05/03 21:04

編集2020/05/04 23:06

wordpressのカスタム投稿で作った投稿ページを、タクソノミーアーカイブページで表示しています。その際に、各投稿に紐付けしているタクソノミーの子タームのnameを1つずつ取り出したいです。

例えば下記のように定義されていたとします。

<アイテム1>
タクソノミー名:fashion
ターム1層目:outer
ターム2層目:coat

(階層構造)
fashion
-outer(ターム1層目)
--coat(ターム2層目)

<アイテム2>
タクソノミー名:fashion
ターム1層目:outer
ターム2層目:jacket

(階層構造)
fashion
-outer(ターム1層目)
--jacket(ターム2層目)

編集しているファイル名
taxonomy-fashion-outer.php

ここでouterにチェックが入っている投稿を一覧表示しながら子タームのcoat,jacketをそれぞれの投稿に表示しようとしています。

html

1<?php if ( have_posts() ) : ?> 2 <?php while ( have_posts() ) : the_post(); ?> 3 4 <?php 5 $term_id = get_queried_object()->term_id; 6 $taxonomy_name = 'fashion'; 7 $termchildren = get_term_children( $term_id, $taxonomy_name ); 8 ?> 9 10 <?php 11 $i = 0; 12 foreach ( $termchildren as $child ) { 13 if($i == 1){ 14 break; 15 } 16 $term = get_term_by( 'id', $child, $taxonomy_name ); 17 18 ?> 19 20 <ul> 21 <?php echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . $term->name . '</a></li>'; ?> 22 <li><?php the_post_thumbnail(); ?></li> 23 <li><?php echo get_the_title(); ?></li> 24 <li><?php echo get_the_content(); ?></li> 25 </ul> 26 <hr> 27 <?php $i++; } ?> 28 <?php endwhile; ?> 29 <?php endif; ?>

上記のように表示すると、二つともcoatが表示されてしまいます。

php

1if($i == 2){ 2 break; 3 }

2周でブレイクさせると、

アイテム1 coat
アイテム2 coat
アイテム1 jacket
アイテム2 jacket

という風に表示されてしまうのですが、どうしたら

アイテム1 coat
アイテム2 jacket

となるでしょうか?

ご教授いただけましたら幸いです。

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

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

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

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

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

Yasumichi

2020/05/06 06:20

カスタム投稿には、 Custom Post Type UI プラグインを使っているのでしょうか?
ai_123

2020/05/06 07:57

そうです!
Yasumichi

2020/05/06 08:07

すいません。Wordpress のカスタマイズ自体、やったことなかったので前提条件がまだ、整ってなくて、すぐに答えるのは、難しそうです。
ai_123

2020/05/06 20:49

そうだったんですね汗 丁寧にありがとうございます。了解です!
guest

回答1

0

ベストアンサー

イメージと異なっていたら、申し訳ありません。とりあえず、以下のように修正してみました。

php

1<?php $taxonomy_name = "fashion"; ?> 2<?php if ( have_posts() ) : ?> 3 <?php while ( have_posts() ) : the_post(); ?> 4 <ul> 5 <?php 6 $terms = wp_get_post_terms( $post->ID, $taxonomy_name, "orderby=term_order" ); 7 foreach($terms as $child) { 8 echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . $child->name . '</a></li>'; 9 } 10 ?> 11 <li><?php the_post_thumbnail(); ?></li> 12 <li><?php echo get_the_title(); ?></li> 13 <li><?php echo get_the_content(); ?></li> 14 </ul> 15 <hr> 16 <?php endwhile; ?> 17<?php endif; ?>

問題となっていた部分ですが、

php

1 <?php 2 $term_id = get_queried_object()->term_id; 3 $taxonomy_name = 'fashion'; 4 $termchildren = get_term_children( $term_id, $taxonomy_name ); 5 ?> 6 7 <?php 8 $i = 0; 9 foreach ( $termchildren as $child ) { 10 if($i == 1){ 11 break; 12 }

毎回、記事に関係なく 'fishion' タクソノミーの子タームを取得して、その個数分ループを回していますが、必ず、2巡目のループで抜けているので最初に見つかった子タームが必ず出力されていました。

この部分を wp_get_post_terms() を利用して、$post->ID に紐づいた $terms を取得するように変更しました。

投稿2020/05/07 11:46

Yasumichi

総合スコア1773

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

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

ai_123

2020/05/07 21:57

回答ありがとうございます! wp_get_post_terms()の存在が知れて助かりました。 <ul> <?php $terms = wp_get_post_terms( $post->ID, $taxonomy_name, "orderby=term_order" ); echo '<li><a href="' . get_term_link( $terms[1], $taxonomy_name ) . '">' . $terms[1]->name . '</a></li>'; ?> <li><?php the_post_thumbnail('image-custom'); ?></li> <li><?php echo get_the_title(); ?></li> <li><?php echo get_the_content(); ?></li> </ul> wp_get_post_termsで個別に取得したターム情報の配列番号を指定して取り出すことで、子タームの情報のみget出来ました。大変助かりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問