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

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

ただいまの
回答率

90.48%

  • PHP

    20878questions

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

  • WordPress

    7450questions

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

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,403

YousukeTanaka

score 64

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

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(); ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • SSaka

    2016/04/27 19:43 編集

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

    キャンセル

回答 3

+1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/28 16:50

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

    キャンセル

  • 2016/05/01 18:40 編集

    先の回答では言葉足らずでしたので、追記です。
    今回は少しコードを交えます。

    こんなイメージです。
    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;
    }
    ?>
    ````

    キャンセル

  • 2016/05/08 09:35

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

    キャンセル

  • 2016/05/08 18:02

    callmehappeningさん

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

    キャンセル

  • 2016/05/15 00:53 編集

    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(); ?>

    キャンセル

0

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

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

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

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

<?php
    $groups = array( 'A' => '', 'B' => '', 'C' => '', 'D' => '', 'E' => '', 'F' => '', 'G' => '', 'X' => '', 'Y' => '', 'Z' => '' );
    $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,
        );
    $myposts = new WP_Query( $args );
    if ( $myposts -> have_posts() ): while($myposts -> have_posts() ): $myposts->the_post();
        $html = '';

        // 適宜HTMLを組む
        $html = '||'.$post->ID.'|'.$post->ID.'|'.$post->ID.'|'.$post->ID.'||';

        $post_tags = get_the_tags();
        foreach( $post_tags as $post_tag ) {
            $groups[ $post_tag->slug ] .= $html;            // 作ったHTMLを $group に追記格納
        }

    endwhile; endif;
    wp_reset_postdata();
?>
<div class="row"><?php
foreach( $groups as $key => $value ) { // $key に 'A' とかが入っている。$value は記事 $html が連結されて入っている
    echo $value;
}
?></div>

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


追記:

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

// ヒアドキュメント + sprintf
$html = <<< EOF
<div>
ID:%1$s<br>
Date:%2$s<br>
Title:%3$s<br>
</div>
EOF;
$html = sprintf( $html, $post->ID, $post->post_date, esc_html( $post->post_title ) );

とか

// 代入演算子「.=」
$html .= '<div>';
$html .= 'ID:'.$post->ID.'<br>';
$html .= 'Date:'.$post->post_date.'<br>';
$html .= 'Title:'.esc_html( $post->post_title ).'<br>';
$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/05/12 01:53

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

    キャンセル

  • 2016/05/12 02:45

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

    > 組んだhtmlをどのように$htmlに入れる
    追記しました。

    > なぜループの中にループを入れこにする
    whileの中のforeachについてでしょうか。whileは「記事」についてのループで、foreachは「記事に付けられたタグ」についてのループだからです。

    キャンセル

  • 2016/05/12 10:19

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

    キャンセル

0

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

<?php
//まずは、brands, categoryのタクソノミーに存在するterm情報を取得
$termArgs = array(
    'taxonomy' => array ('brands', 'category'),
    'hide_empty' => false
);
//get_termsの引数の形って4.5.0以降変更されたのを今知りました。

$termArr = get_terms($termArgs);

//それぞれのtermで、9件ずつ記事を取得
foreach($termArr as $termObj):
    echo "<h1>" . $termObj->name . "</h1>" //ターム名を表示

    $args = array(
        'post_type' => 'product',
        'tax_query' => array(
            'relation' => 'OR', //不要ですが
            array(
                'taxonomy' => $termObj->taxonomy, 
                'field' => 'slug',
                'terms' => $termObj->slug,
            ),
        ),
        'posts_per_page' => 9,
    );
    $myposts = new WP_Query($args);
    (略)
endforeach;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20878questions

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

  • WordPress

    7450questions

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