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

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

ただいまの
回答率

90.51%

  • PHP

    24049questions

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

  • WordPress

    8939questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,934

YousukeTanaka

score 64

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

現在の問題は、記事の表示がターム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(); ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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
$taxonomy = array( 'brand', 'size');
$taxArgs = array(
  'parent' => 0,
  'hierarchical' => 0,
    //term_orderは使えないためidにしました
  'orderby' => 'id',
  'order' => 'ASC'
);

foreach ($taxonomy as $tax){
  //タクソノミーでループする
  $terms = get_terms($tax, $taxArgs);
  $slugs = array();
  foreach ($terms as $term){
    //タームでループする
    $gpArgs = array(
        'posts_per_page' => 6,
        'post_type' => 'product',
        'tax_query' => array(
            array(
                'taxonomy' => $tax,
                'field'    => 'slug',
                'terms'    => $term->slug
            )
        )
    );
    $myposts = get_posts($gpArgs);
    global $post;
    if($myposts){
      foreach ($myposts as $post){
        setup_postdata($post);
        /* ここで投稿内容を表示 the_title等 */
      }
    } else {
      /* 投稿がない場合 */
    }
    wp_reset_postdata();
  }
}


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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/16 01:21 編集

    ご助言ありがとうございます。大変ありがたかったです。ご指摘の推測で理解は間違いありません。早速試してみたのですが、いくつか問題もでてきました。

    ①表示件数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/16 02: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,
    ),
    ),
    );

    キャンセル

  • 2016/05/16 10:05 編集

    ご返信ありがとうございます。大変感謝しています。
    >var_dump(count($myposts));
    を追加し出力結果を確認して各タームごとに何件投稿が取得されているのか確認してみてください。

    早速試してみます。また、「全投稿が表示される。」とは、A-Zまでの投稿記事6件(6 X 25)が全て表示されるということになります。

    >「表示を切り替える」というのは具体的にどのような出力結果を想定していますか?

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

    キャンセル

0

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

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

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

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


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

  • テンプレートファイルのtaxonomy.phpに書く
  • ドメイン/タクソノミーslug/タームslug/というパスで表示する
//タクソノミーのslug取得
$taxonomy_slug = get_query_var('taxonomy');
//タームのslug取得
$term_slug = get_query_var('term');

$args = array(
    'posts_per_page' => 6,
    'paged' => $paged,
    'post_type' => 'product', //カスタム投稿タイプ
    'taxonomy' => $taxonomy_slug, //タクソノミー指定
    'terms'    => $term_slug //ターム指定
);

$tax_posts = query_posts($args);
if($tax_posts){
    foreach ($tax_posts as $post){
        setup_postdata($post);
        /* ここで投稿を表示 the_title()等 */
    }
} else {
    /* 投稿が無かった場合 */
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    24049questions

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

  • WordPress

    8939questions

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