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

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

ただいまの
回答率

90.48%

  • PHP

    24451questions

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

  • WordPress

    9098questions

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

WordPressの「get_terms」で複数条件を組み合わせたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 85

chikachi

score 13

前提・実現したいこと

次のような「noun」「adjective」というタクソノミーがあり、それぞれに親として「ja」「en」というタームがあります。

noun(タクソノミー)
|─ ja(親ターム)
|─ en(親ターム)

adjective(タクソノミー)
|─ ja(親ターム)
|─ en(親ターム)

そしてこの親の中に、色々な子タームがあるのですが、その子タームを次の3つを組み合わせて取得したいです。

➀「noun」の、「en」の子ターム
➁「noun」の、「ja」の子ターム
➂「adjective」の、「ja」の子ターム

試したこと

手間ですがいちいちすべてを書いたらできるかもと思い、下記のように3回にわけて取得してみたのですが、最後にarray_marge ができないようでした。

「// ここで連結できなかった」という部分です。

//-----------------------------------------------------
// 目的の子タームを➀➁➂に分けて取得
//-----------------------------------------------------

// ➀ 「noun」の、「en」の子ターム
$en_term = get_term_by( 'slug', 'en', 'noun' );
$en_noun_id = $en_term->term_id;    
$noun_en = array(
    'hide_empty'    => true, // 空も出す 
    'child_of'      => $en_noun_id, // この子を取得したい
); 
$noun_en_array = get_terms( 'noun', $noun_en );

// ➁「noun」の、「ja」の子ターム
$ja_term = get_term_by( 'slug', 'ja', 'noun' );
$ja_noun_id = $ja_term->term_id;
$noun_ja = array(
    'hide_empty'    => true, // 空も出す 
    'child_of'      => $ja_noun_id, // この子を取得したい
); 
$noun_ja_array = get_terms( 'noun', $noun_ja );

// ➂「adjective」の、「ja」の子ターム
$ja_adjective = get_term_by( 'slug', 'ja', 'adjective' );
$ja_adjective_id = $ja_adjective->term_id;
$adjective_ja = array(
    'hide_empty'    => true, // 空も出す 
    'child_of'      => $ja_adjective_id, // この子を取得したい
); 
$adjective_ja_array = get_terms( 'adjective', $adjective_ja );

// ここで連結できなかった
$merge_array = array_merge( $noun_en_array, $noun_ja_array, $adjective_ja_array );


なお、最終的には下記のようにして出力する予定です。

//-----------------------------------------------------
// 取得できた子タームを出力
//-----------------------------------------------------

// $merge_arrayに上の➀➁➂が実現できたと仮定し、IDとdescriptionだけにする
$terms_array = [];
foreach( $merge_array as $term ) :
    $num = count( $terms_array );
    $terms_array[$num]['id'] = $term->term_id;
    $terms_array[$num]['description'] = unserialize( $term->description );
endforeach;

// 出力
var_dump( $terms_array );


そこで、どうすれば上の3つの条件で取得できるかをお伺いしたいです。

あと、上のようにいちいち3回に分けて書かなくても済むような、例えば「get_terms」の第二引数で巧く指定する方法などございましたら教えて頂ければ幸いです。

どうぞ宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tohkai

    2019/06/11 19:44

    「ここで連結できなかった」とはどのようになったのでしょうか。質問文に追記していただけますか。

    キャンセル

  • chikachi

    2019/06/11 20:03

    あれっ?申し訳ございません。勘違いだったみたいで、質問のコードでできてました。失礼致しました。ついでといってはなんですが、もっと良い書き方などございませんでしょうか?なんだか同じことを繰り返し書いていて初心者ながら違和感があります。

    キャンセル

回答 1

checkベストアンサー

0

あと、上のようにいちいち3回に分けて書かなくても済むような、例えば「get_terms」の第二引数で巧く指定する方法などございましたら教えて頂ければ幸いです。

カスタムタクソノミーのタームには「説明」という項目がありますが(親のタームを選ぶセレクトボックスの下に入力欄があります)、もしこの欄を利用していないのであれば、対象となる

➀「noun」の、「en」の子ターム
➁「noun」の、「ja」の子ターム
➂「adjective」の、「ja」の子ターム

のすべてについて、「説明」欄にこの対象グループを特定できる共通のワード(例えば target)を入れておくと、get_terms の引数で 'description__like' を指定することでまとめて取得することが可能です。

<?php

$taxonomies = array(
    'noun',
    'adjective',
);
$args = array(
    'taxonomy' => $taxonomies,
    'hide_empty' => false,
    'description__like' => 'target',
);
$terms = get_terms( $args );

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/16 13:26

    すみません確認遅れました。良いアイディアありがとうございます。

    キャンセル

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

  • PHP

    24451questions

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

  • WordPress

    9098questions

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