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

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

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

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

PHP

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

Q&A

解決済

2回答

249閲覧

複数タームに所属する記事に、各ターム毎の関連記事へのリンクを付けたい。

yura53

総合スコア8

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/01/19 07:31

お世話になります。
下記のようなカスタム投稿タイプの個別ページを作成しています。

投稿タイプ:gourmet
タクソノミー:ctgourmet

エリア(area)
東京
大阪
京都

ジャンル(genre)
カフェ
ディナー

single-gourmet.phpで、現在見ている記事が所属しているターム毎に関連記事をつけたいと考えています。

lang

12<!--ここまで記事 --> 3<?php endwhile; ?> 4 5<!--ここから関連記事 --> 6<?php 7global $post; 8// 親タームを除くスタッグ名の配列を取得する。 9$children_terms = array(); 10$terms = get_the_terms( $post->ID, 'ctgourmet' ); 11foreach ( $terms as $term ) { 12 if ( $term->parent !== 0 ) { 13 $children_terms[] = $term->slug; 14 } 15} 16$args = array( 17 'numberposts' => -1, 18 'post_type' => 'gourmet', 19 'orderby' => 'rand', 20 'post__not_in' => array( $post->ID ), 21 'tax_query' => array( array( 22 'taxonomy' => 'ctgourmet', 23 'field' => 'slug', 24 'terms' => $children_terms, 25 ) ) 26); 27?> 28<?php $myPosts = get_posts($args); if($myPosts) : ?> 29<h2>関連記事</h2> 30<ul> 31<?php foreach($myPosts as $post) : setup_postdata($post); ?> 32<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 33<?php endforeach; ?> 34<?php else : ?> 35<p>関連記事はまだありません。</p> 36<?php endif; wp_reset_postdata(); ?>

上記で取得するところまではこれたのですが、これを下記のようにタームごとに分けたいのですが、なかなか検索してもたどり着かずで、そもそもアプローチ方法が違っているのかと思い、質問させていただきました。

lang

1<h2>同じエリアで探す</h2> 2<!-- 3所属するエリアの子タームだけの一覧記事 4--> 5<ul> 6<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 7<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 8<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 9</ul> 10<h2>同じジャンルで探す</h2> 11<!-- 12所属するジャンルの子タームだけの一覧記事 13--> 14<ul> 15<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 16<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 17<li><?php the_post_thumbnail(‘thumbnail’); ?></li> 18</ul>

何かアドバイスを頂けるとうれしいです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

最初の foreach で分別しておいて get_posts をそれぞれ実行するとかどうでしょう。

PHP

1foreach ( $terms as $term ) { 2 if ( $term->parent === 1 ) { // area のidを調べて判定に使う。 3 $children_terms[ 'area' ][] = $term->slug; 4 } else if ( $term->parent === 2 ) { // genre のidを調べて判定に使う。 5 $children_terms[ 'genre' ][] = $term->slug; 6 } 7}

投稿2018/01/23 13:57

kei344

総合スコア69364

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

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

0

自己解決

kei344さん、ありがとうございました。
結果的にそもそも1つのタクソノミーにこだわる必要はないな、と考え、以下のように構成を変えました。

投稿タイプ:gourmet

エリア用タクソノミー:ctarea
東京
大阪
京都

ジャンル用タクソノミー:ctgenre
カフェ
ディナー

最終的に実装したサンプルは以下です。

<?php global $post; $terms = get_the_terms($post->ID, 'ctarea'); foreach($terms as $term) { $args = array( 'numberposts' => -1, 'post_type' => 'gourmet', 'taxonomy' => 'ctarea', 'term' => $term->slug, 'post__not_in' => array($post->ID) ); } ?> <?php $areaPosts = get_posts($args); if($areaPosts) : ?> <h2>同じエリアで探す</h2> <ul> <?php foreach($genrePosts as $post) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></li> <?php endforeach; ?> </ul> <?php global $post; $terms = get_the_terms($post->ID, 'ctgenre'); foreach($terms as $term) { $args = array( 'numberposts' => -1, 'post_type' => 'gourmet', 'taxonomy' => 'ctgenre', 'term' => $term->slug, 'post__not_in' => array($post->ID) ); } ?> <?php $genrePosts = get_posts($args); if($genrePosts) : ?> <h2>同じジャンルで探す</h2> <ul> <?php foreach($genrePosts as $post) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></li> <?php endforeach; ?> </ul>

投稿2018/01/26 09:04

yura53

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問