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

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

ただいまの
回答率

89.55%

WordPress|カスタム投稿の記事ループで、特定のタームの表示・非表示について

解決済

回答 3

投稿

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

yukabyo

score 129

現在、WordPressにてサイトを作っています。

トップページに、カスタム投稿のループを表示させています。

カスタム投稿名【blog】
タクソノミー名【blog-cat】
ターム名【news, staff, plan】

現在は下記のコードように、
【news】のタームの記事のみを除外するように設定しています。

記事が【news】のタームだけに属している場合は、下記のループから除外されてもいいのですが、
【news】のタームに属している記事が、他のタームとも複数チェックが入っている場合は除外させないようにしたいのです。

例えば(A)という記事に【news】と【staff】のタームの両方にチェックが入った場合、(A)の記事は、【news】に属していたとしても【staff】のタームの記事として、除外されず、表示されるようにしたいです。

このようなことは、なんらかの方法で可能でしょうか?
いろいろ調べてみたのですが、なかなかわからず、わかる方に教えて頂けたらと思っています。
よろしくお願いいたします。

<ul>
   <?php $args = array(
   'post_type' => 'blog', //投稿タイプ
   'posts_per_page' => 6,
   'tax_query' => array( //タクソノミー、タームの設定
       array(
          'taxonomy' => 'blog-cat', //タクソノミー
          'field' => 'slug', //基本的にslugに指定します(必須)
          'terms' => 'news', //ターム
          'operator' => 'NOT IN'
      )
   )
   );
   $domestic_post = get_posts($args);
   if($domestic_post) : foreach($domestic_post as $post) : setup_postdata( $post ); ?>
   <li>
      <div class="category">
         <?php
         //ひとつだけタームを取得
         $terms = get_the_terms( get_the_ID(), 'blog-cat' );
         if ( !empty($terms) ) {
            foreach( $terms as $term ) {
               echo $term->name;
               break; // ブレイクして他のタームを取得させない
            }
         } else {
            echo "カテゴリなし";
         }
         ?>
      </div>
      <div class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
   </li>
   <?php endforeach; ?>
   <?php else : //記事が存在しない場合 ?>
   <li class="top_noentry">表示する記事がありません。</li>
    <?php endif;
    wp_reset_postdata(); ?>
</ul>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

このようなことは、なんらかの方法で可能でしょうか?

多分無理だと思います。
「記事に関連付けられたタームが1件の時」というSQLが書けるならできるでしょう。
またページングしないのであれば、多めに記事を取得しておいて当該カテゴリのみの記事を非表示、という方法はあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/28 11:30

    お返事遅れてしまい、申し訳ありません。
    いつもご回答いただき助かります。
    SQLなどはわからなかったので、
    今回はカスタムフィールドを作成して表示・非表示を操作するようにしました。
    ありがとうございました。

    キャンセル

+2

記事を保存する際にカスタムフィールド等にnewsのみかどうかのフラグを保存するようにして、
表示の際にそのフラグを条件にデータを取得する、ということであれば可能そうです。

(追記)
カスタムフィールドには手動で入力してもいいですし、フック関数を作って自動化することも可能です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

やりたいことを言い換えると
「news以外のカテゴリーが含まれる記事を表示する」
ということでしょうか。
数学の集合を思い出すとわかりやすいかもしれません。

termsは配列で複数指定ができます。

'tax_query' => array( //タクソノミー、タームの設定
   array(
       'taxonomy' => 'blog-cat', //タクソノミー
       'field' => 'slug', //基本的にslugに指定します(必須)
       'terms' => array( 'staff', 'plan' ), //ターム
   ),
)

これだけで要望に応えられる気がします。

もしもカテゴリなしも表示させたいなら、
以下でどうでしょうか。

'tax_query' => array( //タクソノミー、タームの設定
    'relation' => 'OR',
    array(
        'taxonomy' => 'blog-cat', //タクソノミー
        'field' => 'slug', //基本的にslugに指定します(必須)
        'terms' => array( 'staff', 'plan' ), //ターム
    ),
    array(
        'taxonomy' => 'blog-cat', //タクソノミー
        'field' => 'slug', //基本的にslugに指定します(必須)
        'terms' => array( 'news', 'staff', 'plan' ), //ターム
        'operator' => 'NOT IN',
    ),
)

実際にはカテゴリーが増えることもあると思います。
その場合は登録されているタームを取得(get_terms関数)し、配列にしてtermsの値にしてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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