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

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

ただいまの
回答率

89.19%

WPでカスタム投稿のターム順に投稿を表示させたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,312

yukiko

score 41

WPでカスタム投稿のターム順に投稿を表示させたいと思っています。
seasonというタクソノミーのタームが春・夏・秋・冬になっており、それぞれに投稿データが複数ぶらさがっています。

ソースは下記のように書いています。

$args=array(
     'tax_query' => array(
           array(
           'taxonomy' => 'season', //タクソノミーを指定
           'field' => 'slug',
           'terms' => 'spring',
           'operator' => 'NOT IN',
           ),
       ),
   'post_type' => 'brand', //カスタム投稿名
   'posts_per_page'=> -1, //表示件数(-1で全ての記事を表示)
   'orderby' => 'term_order',
   'order' => 'ASC',
);

$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
  while ( $the_query->have_posts() ) : $the_query->the_post();
?>
このあと、表示用のループ

投稿データ自体は春以外のものが表示されるのですが、並び順が、夏秋冬めちゃくちゃです。というか、投稿日時の逆順で並んでいます。

http://www.naoyu.net/wordpress/tax_query/583/
↑ここを参考に考えたのですが、まだWPを触りはじめて2週間なので、いまひとつ理解が進んでいません。
'orderby' => 'term_order',
↑これで並ぶのかと思ったのですが、何か勘違いしているのでしょうか。
Category Order and Taxonomy Terms Orderなるプラグインは導入・有効化してあります。

なにかヒントなどあれば教えていただけると助かります。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 8-0_nyan5

    2017/06/04 21:08

    参考にされたコードではダメなのでしょうか?

    キャンセル

  • yukiko

    2017/06/04 22:03

    すみません。書き漏らしていました。参考サイトのコードの最初にあるソース(「これでitem_categoryのtermを取得し、h2タグでくくられたterm名を表示させました」と書いてあるすぐ上のコード)をまず動かそうとしたのですが、一件も抽出されませんでした。タクソノミー名やターム名は自分のプログラム用に変更したつもりなのですが…。PHPもよくわかっていないので、理解ができていないのだと思います。今、PHPの参考書を見ながら、基本的なことを勉強しているところです。うまく説明ができていなくて、申し訳ありません。

    キャンセル

回答 2

checkベストアンサー

+2

ほぼ参考にされた記事のままのコードです。

<?php
    $args = array(
        'parent' => 0,
        'hierarchical' => 0,
        'orderby' => 'term_order', // Category Order and Taxonomy Terms Order を使用
        'order' => 'ASC'
    );
    $taxonomy_name = 'season';
    $taxonomys = get_terms($taxonomy_name, $args);
if(!is_wp_error($taxonomys) && count($taxonomys)):
    foreach($taxonomys as $taxonomy):
    $url = get_term_link($taxonomy->slug, $taxonomy_name);
    $tax_posts = get_posts(array(
        'post_type' => 'brand',
        'posts_per_page' => -1, // 表示させたい記事数
        'tax_query' => array(
            array(
                'taxonomy' => 'season',
                'terms' => array( $taxonomy->slug ),
                'field' => 'slug',
                'include_children' => true,
                'operator' => 'IN'
            ),
            array(
                'taxonomy' => 'season',
                'terms' => 'spring',
                'field' => 'slug',
                'operator' => 'NOT IN'
            ),
            'relation' => 'AND'
        )
    ));
if($tax_posts):
?>
<h2 id="<?php echo esc_html($taxonomy->slug); ?>" class=""><a href="<?php echo $url; ?>"><?php echo esc_html($taxonomy->name); ?></a></h2>
<ul>
<?php foreach($tax_posts as $tax_post): ?>
<!--ループで表示したい内容-->
    <li>
        <span class="thumb">
            <a href="<?php echo get_permalink($tax_post->ID); ?>">
            <?php
                if(has_post_thumbnail($tax_post->ID)) {
                echo get_the_post_thumbnail($tax_post->ID,'post-thumbnail'); }
            ?>
            </a>
        </span>
        <span class="title"><?php echo get_the_title($tax_post->ID); ?></span>
    </li>
<!--/ループで表示したい内容-->
<?php endforeach; ?>
</ul>
<?php endif; endforeach; endif; ?>


最初の$argsは、プラグインのterm_orderをもとに、
ターム順に記事を出力するためのものなのでこれがないと意味がありません。

まず、参考にされた記事のコードをそのまま試されて、
動くようなら自分のやりたいカスタマイズをしてみてはどうでしょう。

あと、
>タクソノミー名やターム名は自分のプログラム用に
と書かれていますが、最初のコードではタクソノミー名しか変更箇所はないはずですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/06 22:16

    ご助言ありがとうございます。体調を崩しておりまして、返信が遅くなりました。
    おっしゃる通りの情報を参考に動きましたm(__)m

    うまくいかなかった原因は、自分がまだWP触って2週間目で、カスタム投稿・タクソノミー・タームの意味を混同していたからでした。(それと、サーバが遅くて、再読込のタイミングも悪かったりしたかもしれません)。
    アレンジしたソースは後半にコピペします。

    ソース自体は下記の通りなのですが、ちゃんと動き出すにはまた罠が…。
    ソースをtaxonomy.phpに書き込んで動かしたのですが、さっぱりそのソースを読んでいる感じではなく…。いったいどのプログラムが動いているのか調べたら、taxonomy.phpではなくindex.php(アーカイブを表示するphp)が動いていました。
    いろいろ試行錯誤した結果、archive-brand.phpという名前のソースにしたら、意図した動きをしてくれました。
    テンプレートの優先順位(??まだよくわかっていない??)に対する理解が間違っていたということでしょうか。

    何にせよ、動き出したので、ほんとうに助かりました。
    ありがとうございます。
    (teratail自体にも慣れなくて、ソースの貼り方もなんだか汚くてすみませんm(__)m)

    -----------------
    <?php

    $args = array(
    'parent' => 0,
    'hierarchical' => 0,
    'orderby' => 'term_order', // Category Order and Taxonomy Terms Order を使用
    'order' => 'ASC'
    );
    $taxonomy_name = 'season';
    $taxonomys = get_terms($taxonomy_name,$args);
    if(!is_wp_error($taxonomys) && count($taxonomys)):
    foreach($taxonomys as $taxonomy):
    $url = get_term_link($taxonomy->slug, $taxonomy_name);
    $tax_posts = get_posts(array(
    'post_type' => get_post_type(),
    'posts_per_page' => -1, // 表示させたい記事数
    'tax_query' => array(
    array(
            'taxonomy'=>'season',
            'terms'=>array( $taxonomy->slug ),
            'field'=>'slug',
            'operator'=>'IN'
          ),
          'relation' => 'AND'
        )
       ));
    if($tax_posts):
    ?>

    <h2 id="<?php echo esc_html($taxonomy->slug); ?>" class=""><a href="<?php echo $url; ?>"><?php echo esc_html($taxonomy->name); ?></a></h2>

    <?php foreach($tax_posts as $tax_post): ?>

    <article id="post-<?php the_ID(); ?>" <?php post_class('topNews Block'); ?>>
    <div class="topImg">
    <a href="<?php the_permalink(); ?>">
    <?php if (has_post_thumbnail($tax_post->ID)): ?>
    <?php echo get_the_post_thumbnail($tax_post->ID,'thumbnail'); ?>
    <?php else: ?>
    <img src="<?php echo get_template_directory_uri(); ?>/img/noimage_180x180.png" alt="">
    <?php endif; ?>
    </a>
    </div>
    <div class="topText">
    <a href="<?php echo get_the_permalink($tax_post->ID); ?>">
    <h3><?php echo get_the_title($tax_post->ID); ?></h3>
    <p><?php echo get_the_excerpt($tax_post->ID); ?></p>
    <time datetime="<?php echo get_the_time('Y-m-d',$tax_post->ID); ?>"><?php echo get_the_time('Y年m月d日(l)',$tax_post->ID); ?></time>
    </a>
    </div>
    </article>

    <?php endforeach; ?>

    <?php endif;  endforeach; endif; ?>

    キャンセル

  • 2017/06/06 22:19

    あ、すみません。最終的に、春以外を表示じゃなくて、春夏秋冬順に商品を一覧表示する…というソースにしました。

    キャンセル

+1

解決方法:
使ったことないですが逆順になってるとおもうので、オーダーを昇順から降順にしたら
いいんじゃないでしょうか。

'order'        => 'ASC'
// 以下に変更
'order'        => 'DESC'

説明:
日付というのは、内部的には規定された時からの経過時間をもとに日付を算出します。
規定された日(多分PHPだとUNIX時間の1970/01/01かな)からの経過時間なので、
昇順にするということは、経過時間が若い状態、すなわち、古い日付の順番になるので
はないでしょうか。

参考サイトを見ましたが、参考サイトの場合は活用用途が「2013年の春物」と絞り込み
をしていました。その場合、その年の1月のアイテムから見れた方が時系列的にみやすい
のではないでしょうか?となると、「古い日付のモノから表示する」ということになります。
なので、昇順を表す「ASC」をしていする。

今回のケースは、最新順すなわち新しい日付の順番から表示したいということになるので
経過時間が古い状態、すなわち、新しい日付の順番なので降順を表す「DESC」になるかと。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/06 21:53

    ご助言ありがとうございます。体調を崩しておりまして、返信が遅くなりました。
    昇順と降順についてのご説明ありがとうございました。

    わたしの質問の書き方が良くなかったですm(__)m。
    (例)春商品が10品目/夏商品が5品目/秋商品が2品目/冬商品が1品目
    であったとすると、一覧表示したときに、春商品が10品目並んだあと、夏商品が5品目並び…というふうに表示したかったのですが、春夏秋冬を無視した投稿日時の逆順に並んでいる…という悩みでした。

    解決したので、これからまた投稿します。

    キャンセル

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

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