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

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

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

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

PHP

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

Q&A

3回答

3015閲覧

タームごとの記事一覧を表示したい。

YousukeTanaka

総合スコア79

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/04/27 10:10

編集2022/01/12 10:55

お世話になっております。
表題の件で、ご質問させてください。

wordpressで投稿タイプ、タクソノミー、タームを設定しました。今回そのタームごとに投稿を表示させたいと
考えており、以下のようにトライしましたが、投稿一覧が表示されてしまいます。
原因と解決策を頂きたい次第です。

以下のように、A,B,C,,,ごとにカスタムフィールドから投稿の出力を行いたいと考えています。
例えば、amazonを例にとれば、Aがビジネス本というタームだとすると、ビジネス本の投稿一覧が出力されるイメージです。
一旦画像を入れ、出力されるかどうか確認していますが、種類Aの投稿一覧を表示させたいのですが、
なぜか、A-Gまでの投稿一覧として表示されます。

完成形としては、例えば、A-G毎に投稿

①以下のコードの何処が誤りかのご指摘をお願いします。
②どのように対応するべきか、教えていただければと思います。

<?php $args = array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'OR', array('taxonomy' => 'brands', 'field' => 'slug','terms' => array('A', 'B', 'C', 'D', 'E', 'F', 'G')), array('taxonomy' => 'category', 'field' => 'slug','terms' => array('X', 'Y', 'Z')), ), 'posts_per_page' => 9, ); ?> <?php $myposts = new WP_Query( $args ); ?> <?php if($myposts -> have_posts()): ?> <div class="row"></div> <?php while($myposts -> have_posts()): $myposts->the_post();?> <?php // get an image field $image = get_field('item-image'); // each image contains a custom field called 'link' $link = get_field('link', $image['ID']); // render ?> <a href="<?php echo $link; ?>"> <img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" /> </a> <?php endwhile; ?> </div> <?php endif; ?> <?php wp_reset_postdata(); ?>

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

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

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

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

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

SSaka

2016/04/27 10:44 編集

タームごとにグルーピングされたような形で表示したい、ということでしょうか?
guest

回答3

0

自分ならこう書きます回答ですが・・・。

1.ターム一覧を表示するquery
2.タームをキーにしたquery
という形で、1.のloopの中で2.をloopする入れ子構造で書きます。

投稿2016/04/27 14:28

SSaka

総合スコア96

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

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

YousukeTanaka

2016/04/28 07:50

大変申し訳ないのですが、もう少しわかりやすくお願いできますでしょうか?参考になるURLやコードなどありましたら教えていただきたい次第です。
SSaka

2016/05/08 09:02 編集

先の回答では言葉足らずでしたので、追記です。 今回は少しコードを交えます。 こんなイメージです。 kei344さんの書いた回答の方がシンプルです。 (私の方は、foreachする度に記事問い合せが発生します。kei344さんのは一度取得したデータを元に加工して出力します) 1.get_termsで配列にbrand タクソノミー配下のタクソノミーを取得 ```PHP <?php $terms = get_terms(array('brands'));?> ``` 2.タームをキーにしたqueryをloop ````PHP <?php foreach($terms as $term){ $args = array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'OR', array('taxonomy' => 'brands', 'field' => 'slug','terms' => array($term)), array('taxonomy' => 'category', 'field' => 'slug','terms' => array('X', 'Y', 'Z')), ), 'posts_per_page' => 9, ); $myposts = new WP_Query($args); if($myposts -> have_posts()): ?> ~描画部分なので省略~ <?php endif; } ?> ````
callmehappening

2016/05/08 00:35

タイプミスかと思われますが 'posts_per_page' => 9, じゃないとエラーになるかと存じます。
SSaka

2016/05/08 09:02

callmehappeningさん すいません。フォローありがとうございます ちょっと足りなかったです。修正しました
YousukeTanaka

2016/05/14 15:57 編集

SSaka様、callmehappening様。ご助言を参考に私のコードを書き直してみましたが、表示に至りませんでした。この問題でもう1週間ほど頭を悩ませているので、そろそろ解決したいと考えています。どの部分が誤りがわかりません。ご指摘をいただけると幸いです。 以下、私のコードとなります。 <?php $taxonomy = array( 'brand', 'group'); //2つのタクソノミーを代入 $args = array( 'parent' => 0, 'hierarchical' => 0, 'orderby' => 'term_order', 'order' => 'ASC' ); $terms = get_terms( $taxonomy, $args ); foreach( $terms as $term ){ $termlist = array( 'post_type' => get_post_type(), 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'brand', 'field' => 'slug', 'terms' => array( $term ), ), array( 'taxonomy' => 'group', 'field' => 'term_id', 'terms' => array( $term ), ), ), 'posts_per_page' => 6, ); ?> <?php $myposts = new WP_Query( $termlist ); ?> <?php if($myposts -> have_posts()): ?> <?php while($myposts -> have_posts()): $myposts->the_post();?> // ここに表示させたい内容を書いている。 <?php endwhile; endif; ?> <?php wp_reset_postdata(); ?> } <div class="pagenation"> <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?> </div> <?php wp_reset_postdata(); ?>
guest

0

こんな感じではいかがでしょうか。

PHP

1<?php 2//まずは、brands, categoryのタクソノミーに存在するterm情報を取得 3$termArgs = array( 4 'taxonomy' => array ('brands', 'category'), 5 'hide_empty' => false 6); 7//get_termsの引数の形って4.5.0以降変更されたのを今知りました。 8 9$termArr = get_terms($termArgs); 10 11//それぞれのtermで、9件ずつ記事を取得 12foreach($termArr as $termObj): 13 echo "<h1>" . $termObj->name . "</h1>" //ターム名を表示 14 15 $args = array( 16 'post_type' => 'product', 17 'tax_query' => array( 18 'relation' => 'OR', //不要ですが 19 array( 20 'taxonomy' => $termObj->taxonomy, 21 'field' => 'slug', 22 'terms' => $termObj->slug, 23 ), 24 ), 25 'posts_per_page' => 9, 26 ); 27 $myposts = new WP_Query($args); 28 () 29endforeach; 30

投稿2017/06/27 02:21

yukikp

総合スコア797

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

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

0

①以下のコードの何処が誤りかのご指摘をお願いします。

細かいですが、<div class="row"></div><div class="row"> でしょう。他の部分に書かれているHTMLがあるならこの限りではありませんが。

②どのように対応するべきか、教えていただければと思います。

タグ「A-G,X-Z」のどれかが付いている記事をループ内で判別して、タグ名をキーにした連想配列に追記して、あとでまとめて echo するという方法も取れるかと思います。
コードはテストしていないのでミスが有るとは思いますが、考え方はわかると思います。

PHP

1<?php 2 $groups = array( 'A' => '', 'B' => '', 'C' => '', 'D' => '', 'E' => '', 'F' => '', 'G' => '', 'X' => '', 'Y' => '', 'Z' => '' ); 3 $args = array( 4 'post_type' => 'product', 5 'tax_query' => array( 6 'relation' => 'OR', 7 array('taxonomy' => 'brands', 'field' => 'slug','terms' => array('A', 'B', 'C', 'D', 'E', 'F', 'G')), 8 array('taxonomy' => 'category', 'field' => 'slug','terms' => array('X', 'Y', 'Z')), 9 ), 10 'posts_per_page' => 9, 11 ); 12 $myposts = new WP_Query( $args ); 13 if ( $myposts -> have_posts() ): while($myposts -> have_posts() ): $myposts->the_post(); 14 $html = ''; 15 16 // 適宜HTMLを組む 17 $html = '||'.$post->ID.'|'.$post->ID.'|'.$post->ID.'|'.$post->ID.'||'; 18 19 $post_tags = get_the_tags(); 20 foreach( $post_tags as $post_tag ) { 21 $groups[ $post_tag->slug ] .= $html; // 作ったHTMLを $group に追記格納 22 } 23 24 endwhile; endif; 25 wp_reset_postdata(); 26?> 27<div class="row"><?php 28foreach( $groups as $key => $value ) { // $key に 'A' とかが入っている。$value は記事 $html が連結されて入っている 29 echo $value; 30} 31?></div>

【Wordpressの現在の記事につけているタグの情報を取得するget_the_tags】
http://mizyupon-rpg.com/posts/703.html


追記:

②組んだhtmlをどのように$htmlに入れるのでしょうか?通常、組むhtmlは情報量が多くて、1行で終わらないのですが。。。

PHP

1// ヒアドキュメント + sprintf 2$html = <<< EOF 3<div> 4ID%1$s<br> 5Date:%2$s<br> 6Title:%3$s<br> 7</div> 8EOF; 9$html = sprintf( $html, $post->ID, $post->post_date, esc_html( $post->post_title ) ); 10```とか 11```PHP 12// 代入演算子「.=」 13$html .= '<div>'; 14$html .= 'ID:'.$post->ID.'<br>'; 15$html .= 'Date:'.$post->post_date.'<br>'; 16$html .= 'Title:'.esc_html( $post->post_title ).'<br>'; 17$html .= '</div>';

【PHP ヒアドキュメントの使い方:2通り - すたら日記】
http://d.hatena.ne.jp/sutara_lumpur/20080803/1217724875

【ヒアドキュメント | PHP プログラミング解説】
http://so-zou.jp/web-app/tech/programming/php/grammar/data-type/string/here-document.htm

【PHP: sprintf - Manual】
http://php.net/manual/ja/function.sprintf.php

【PHP: 代入演算子 - Manual】
http://php.net/manual/ja/language.operators.assignment.php

投稿2016/04/28 17:50

編集2016/05/11 17:45
kei344

総合スコア69357

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

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

YousukeTanaka

2016/05/11 16:53

ありがとうございます。試してみてわからない点があります。 ①$groups = array( 'A' => '',・・)に関して、キーを空にして$groupに入れる意味はなんでしょうか? ②組んだhtmlをどのように$htmlに入れるのでしょうか?通常、組むhtmlは情報量が多くて、1行で終わらないのですが。。。 ③なぜループの中にループを入れこにするのでしょうか? まだ、初心者で頭が混乱するばかりですが、是非マスターしたいと思っています。
kei344

2016/05/11 17:45

> キーを空にして$groupに入れる意味 このコードでは意味はありません。「説明用にわかりやすいように」という意図と、「$post_tag->slug」にA-G,X-Z以外のslugが入っていたらそれを弾く処理をなんとなく考えて書いたのだと思います。(ちょっと前なので忘れています) > 組んだhtmlをどのように$htmlに入れる 追記しました。 > なぜループの中にループを入れこにする whileの中のforeachについてでしょうか。whileは「記事」についてのループで、foreachは「記事に付けられたタグ」についてのループだからです。
YousukeTanaka

2016/05/12 01:19

ここまで詳しく書いていただいて恐縮です。ありがとうございます。早速試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問