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

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

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

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

PHP

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

Q&A

2回答

4607閲覧

WordPress:タームごとに投稿記事を表示したい。

YousukeTanaka

総合スコア79

WordPress

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

PHP

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

0グッド

1クリップ

投稿2016/05/14 17:27

お世話になります。
何度も同じ質問をしておりますが、なんどやっても表示が成功しませんので再度質問させてください。

現在の問題は、記事の表示がターム1のみであり、また、表示件数を6件と指定しているにもかかわらず、
全投稿数が表示されます。

①以下のコードでどこが誤りなのかがわかりません。ご指摘とご説明をいただければと思います。
特に、わからない点は、
②なぜループの中にループを入れるのかが、明確に説明できない。(なんとなくそうなのかなという程度)
③WP_Queryは機能しなくて、get_postsだと表示されました(ターム1だけですが)。使い方の違いがあるのでしょうか?

前提 カスタム投稿(product) タクソノミー(brand, size) ターム1(brand→A,B,C,D,E,F,G) ターム2(size→X,Y,Z) A-G、X-Zごとに投稿記事があり、Aの投稿記事、Bの投稿記事のようにページごとに表示を変えたい。
<?php $taxonomy = array( 'brand', 'size'); $args = array( 'parent' => 0, 'hierarchical' => 0, 'hideempty' => 1, '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->slug ), ), array( 'taxonomy' => 'size', 'field' => 'term_id', 'terms' => array( $term->slug ), ), ), 'posts_per_page' => 6, ); ?> <?php $myposts = get_posts( $termlist ); ?> <?php foreach ( $myposts as $post ) :?> <?php setup_postdata( $post ); ?> //ここにhtmlを表示 <?php endforeach; wp_reset_postdata(); ?> <?php endforeach;?> <div class="pagenation"> <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?> </div> <?php wp_reset_postdata(); ?>

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

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

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

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

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

guest

回答2

0

A-G、X-Zごとに投稿記事があり、Aの投稿記事、Bの投稿記事のようにページごとに表示を変えたい。

とは下記のようなことでしょうか。
もし違う場合は具体的に表示結果をこうしたい等質問文に追加したほうがよさそうです。
(自分がやりたいことを他人に伝えるのが実はかなり難しいんですよね

以下推測

タクソノミーbrand タームAの記事6件 タクソノミーbrand タームBの記事6件 タクソノミーbrand タームCの記事6件 ~ タクソノミーsize タームXの記事6件 タクソノミーsize タームYの記事6件 タクソノミーsize タームZの記事6件

とターム毎に6件ずつ投稿を表示

php

1<?php 2$taxonomy = array( 'brand', 'size'); 3$taxArgs = array( 4 'parent' => 0, 5 'hierarchical' => 0, 6 //term_orderは使えないためidにしました 7 'orderby' => 'id', 8 'order' => 'ASC' 9); 10 11foreach ($taxonomy as $tax){ 12 //タクソノミーでループする 13 $terms = get_terms($tax, $taxArgs); 14 $slugs = array(); 15 foreach ($terms as $term){ 16 //タームでループする 17 $gpArgs = array( 18 'posts_per_page' => 6, 19 'post_type' => 'product', 20 'tax_query' => array( 21 array( 22 'taxonomy' => $tax, 23 'field' => 'slug', 24 'terms' => $term->slug 25 ) 26 ) 27 ); 28 $myposts = get_posts($gpArgs); 29 global $post; 30 if($myposts){ 31 foreach ($myposts as $post){ 32 setup_postdata($post); 33 /* ここで投稿内容を表示 the_title等 */ 34 } 35 } else { 36 /* 投稿がない場合 */ 37 } 38 wp_reset_postdata(); 39 } 40}

コードは動作確認してないため微妙に間違ってるかもしれませんが。。。

  1. 流れとしてはタクソノミーでループ
  2. タームでループ
  3. ターム毎にget_postsに投稿数,タクソノミー,ターム,カスタム投稿タイプを指定して投稿を取得

となります。
global $post;に関してはコードを書く場所によっては必要なので、外してみて問題なければ削除して下さい。

パラメータの指定方法ですが似たような関数でも指定方法が異なったりしますので
https://wpdocs.osdn.jp/Main_Page
やget_terms,get_posts等の関数名で検索して確認されたほうがよいと思います

投稿2016/05/15 02:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YousukeTanaka

2016/05/15 16:22 編集

ご助言ありがとうございます。大変ありがたかったです。ご指摘の推測で理解は間違いありません。早速試してみたのですが、いくつか問題もでてきました。 ①表示件数6件に設定しているにもかかわらず、全投稿が表示される。 ②タームごとに表示が切り替わらない。 ご助言を元に、以下のように作成しています。やはり、1日調べて試すの繰り返しですが、 どこがダメなのかがわかりません。再度ご確認いただけますでしょうか? ``` <?php $taxonomy = array( 'brand', 'group'); foreach( $taxonomy as $tax ){ //タクソノミーでループする。 $args = array( 'parent' => 0, 'hierarchical' => 0, 'hideempty' => 1, 'order' => 'ASC' ); $terms = get_terms( $tax, $args ); foreach( $terms as $term ){ //タームでループする。 $termlist = array( 'post_type' => get_post_type(), 'posts_per_page' => 6, 'orderby' => 'date', 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'brand', 'field' => 'slug', 'terms' => $term, ), array( 'taxonomy' => 'group', 'field' => 'slug', 'terms' => $term, ), ), ); $myposts = get_posts( $termlist ); // global $post; if($myposts){ foreach ( $myposts as $post ){ setup_postdata( $post ); ?> //ここにコードを書いている。 <?php } wp_reset_postdata(); } } wp_reset_postdata(); } wp_reset_postdata(); ?> ```
退会済みユーザー

退会済みユーザー

2016/05/15 17:32

>①表示件数6件に設定しているにもかかわらず、全投稿が表示される。 foreach ( $myposts as $post ){ の前の行に var_dump(count($myposts)); を追加し出力結果を確認して各タームごとに何件投稿が取得されているのか確認してみてください。 「全投稿が表示される。」という表現では曖昧すぎて状況が把握できません。 私が書いたコードが想定してるのは -------------------- Aの記事1つ目 Aの記事2つ目 ~ Aの記事6つ目 -------------------- Bの記事1つ目 Bの記事2つ目 ~ Bの記事6つ目 -------------------- Zの記事1つ目 Zの記事2つ目 ~ Zの記事6つ目 -------------------- と最大でターム数*6個の記事が1つのページで表示される状況です。 >②タームごとに表示が切り替わらない。 に関してですがそもそもこのコードの中で表示を切り替えている箇所がありません。 「表示を切り替える」というのは具体的にどのような出力結果を想定していますか? 下記の部分ですが推測した内容と設定されている内容にかなり差があるように思われます。 $termlist = array( 'post_type' => get_post_type(), 'posts_per_page' => 6, 'orderby' => 'date', 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'brand', 'field' => 'slug', 'terms' => $term, ), array( 'taxonomy' => 'group', 'field' => 'slug', 'terms' => $term, ), ), );
YousukeTanaka

2016/05/16 01:05 編集

ご返信ありがとうございます。大変感謝しています。 >var_dump(count($myposts)); を追加し出力結果を確認して各タームごとに何件投稿が取得されているのか確認してみてください。 早速試してみます。また、「全投稿が表示される。」とは、A-Zまでの投稿記事6件(6 X 25)が全て表示されるということになります。 >「表示を切り替える」というのは具体的にどのような出力結果を想定していますか? 記載がわかりづらくてすいません。タクソノミーbrand タームAの記事6件を例にとると、例えば、タームの中に「ASICS」があったとすると、そのASICSの商品に関する記事を1ページあたり6件表示させたいということになります。そして、別のブランドである「puma」を別のページで1ページあたり6件表示させたいということになります。
guest

0

最初の回答がYousukeTanakaさんの意図とかなり違ってしまっていたので回答しなおします。

タクソノミーbrand タームAの記事6件を例にとると、例えば、タームの中に「ASICS」があったとすると、そのASICSの商品に関する記事を1ページあたり6件表示させたいということになります。そして、別のブランドである「puma」を別のページで1ページあたり6件表示させたいということになります

この場合1ページで表示させるのは1つのタームに属する記事のみですので、タクソノミーやタームの一覧を取得する必要はありません。

taxonomy.phpはタクソノミー、タームのアーカイブにアクセスした際に呼び出されるテンプレートになるので、ここでタクソノミーslug、タームslugを取得して条件を設定する形になるかと思います。


以下の2点を前提条件としています。

  • テンプレートファイルのtaxonomy.phpに書く
  • ドメイン/タクソノミーslug/タームslug/というパスで表示する

php

1//タクソノミーのslug取得 2$taxonomy_slug = get_query_var('taxonomy'); 3//タームのslug取得 4$term_slug = get_query_var('term'); 5 6$args = array( 7 'posts_per_page' => 6, 8 'paged' => $paged, 9 'post_type' => 'product', //カスタム投稿タイプ 10 'taxonomy' => $taxonomy_slug, //タクソノミー指定 11 'terms' => $term_slug //ターム指定 12); 13 14$tax_posts = query_posts($args); 15if($tax_posts){ 16 foreach ($tax_posts as $post){ 17 setup_postdata($post); 18 /* ここで投稿を表示 the_title()等 */ 19 } 20} else { 21 /* 投稿が無かった場合 */ 22}

上のコードはテストしてないので上手く行かない場合
var_dump($taxonomy_slug)var_dump($term_slug)等を使って各変数に意図した内容が入っているを確認してみると原因が判別しやすいかと思います。

投稿2016/05/16 02:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問