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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

4回答

2199閲覧

WordPressのターム取得で、「ID」と「discription」を取得したい

chikachi

総合スコア33

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/06/08 10:04

###実現したいこと
WordPressで全てのタームを取得するとき、そのタームの「ID」と「discription」を取得したいです。

###発生している問題・エラーメッセージ
下記の「試したこと」を実行するとこのようなエラーが吐き出されます。

<div id="error"> <p class="wpdberror"> <strong>WordPress データベースエラー:</strong> [You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near &#039; FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id &#039;at line 1] <br /> <code> SELECT FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN (&#039;music_tag&#039;) AND tt.count &gt; 0 ORDER BY tt.count ASC </code> </p> </div> []

###試したこと
下記の『'fields' => 'id=>discription'』という指定では上記エラーでした。

もちろん 『'fields' => 'all'』にすれば「discription」や他のデータまですべて含めて取得できますが、他のデータがいりません。

どうすれば「ID」と「discription」だけを取得できますでしょうか?

php

1 $args = array( 2 'orderby' => 'count', // 多い順 3 'order' => 'ASC', 4 'hide_empty' => true, 5 'number' => '', // 最大個数 6 'fields' => 'id=>discription', // エラーになる 7 'hierarchical' => false, // 子タームはない 8 ); 9 10 $terms = get_terms( $taxonomies, $args );

###補足
意図しているのはターム検索の利便性アップです。
まず「FB」で検索したときに「FBI」だけでなく「Facebook」も表示したいと思いました。
そのために「FBI」と「Facebook」の両方の「discription」に、「FBI,Facebook」と入力しておき、その「discription」を検索対象にすれば片方の入力で両方表示できて利便性がアップできるのでは?と考えた感じです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

すべて取得してから wp_list_pluck を利用すると、array( [term_id] => [description] ) という連想配列にすることが可能です。

php

1<?php 2 3$args = array( 4 'taxonomy' => $taxonomies, 5 'orderby' => 'count', 6 'hide_empty' => true, 7 'hierarchical' => false, 8); 9 10$terms = wp_list_pluck( get_terms( $args ), 'description', 'term_id' );

投稿2019/06/18 01:35

YukiYamashina

総合スコア1011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chikachi

2019/06/18 01:48 編集

これすごいっすね!実は結局わからず、とりあえず下記のようにループ回してました。 $terms_array = []; foreach( $terms as $term ) : $num = count( $terms_array ); $terms_array[$num]['id'] = $term->term_id; $terms_array[$num]['description'] = $term->description; endforeach; でもご回答の方が断然すっきりして便利です。ありがとうございます。
guest

0

まず「FB」で検索したときに「FBI」だけでなく「Facebook」も表示したい

存在だけ確認してて試してないんだけどwp_insert_termにはalias_ofってパラメータがあって
WPには元々そういう機能があるっぽい、ってことはそれを使うプラグインもあるはず

投稿2019/06/12 11:10

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chikachi

2019/06/16 00:02

おー、これは知りませんでした。descriptionに配列をいれるよりもそれ専用って感じっぽいですね。調べて試してみたいと思います。良い情報をありがとうございます。
chikachi

2019/06/16 00:27

でもこれ、肝心のget termsでalias_ofを指定できないっていうw、どうやってalias_ofで登録した「FBI」を「FBの別名」として引っ張ってくるんでしょうかね。
KazuhiroHatano

2019/06/17 02:09

実際そうなってるのを見たことないですがWPのterm関連のDBの構造は 「違うtermを同じカテゴリとして扱う」仕組みを作るための構造をしてるんですよね term_idとterm_taxonomy_idが別々に存在してるってことはそういうことでしょう 基本カテゴリ関連の処理はterm_taxonomy_idで行われているので term_taxonomy_idを同じくするtermは同じとして扱われるようになるはずです alias_ofを指定することでそのように処理されるってことなんかもしれません 試してないんでなんとも言えないですが
KazuhiroHatano

2019/06/17 02:16

見てみたけど予想はハズレっぽいです alias_ofはterm_groupを同じくするだけで term_taxonomy_idが同じtermを作るようにはなってないですね だったらなんのためにterm_taxonomy_idとterm_id分けてんのかなってのが感想ですが
chikachi

2019/06/18 01:44

たしかにそれらのID区別が謎でした。 ハズレでしたか笑 でもありがとうございます。調べるキッカケになりました。
guest

0

get_terms関数には、そのような機能はなかったと思います。(コードまで見たわけではないので、確証が欲しい場合は公開されているコードを見て確認するのが楽です)

なので、欲しいデータだけを迅速に取得したいのであれば、先の回答者様の回答にあるように、自前でSQLを書いてしまうのが手っ取り早いと思います。

以下のページが参考になるかと思います。

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class

投稿2019/06/11 10:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chikachi

2019/06/11 11:21

ありがとうございます。結局全部 $terms で取得した後に、下記のようにループで抽出しようと思ったのですが、変ですか? $terms_array = []; foreach( $terms as $term ) : $num = count( $terms_array ); $terms_array[$num]['id'] = $term->term_id; $terms_array[$num]['description'] = $term->description; endforeach;
guest

0

もちろん 『'fields' => 'all'』にすれば「discription」や他のデータまですべて含めて取得できますが、他のデータがいりません。

fieldsはそのような指定が出来ません。他の要素を持っていたとして使わなければよいのでは。

【WP_Term_Query::__construct() | Method | WordPress Developer Resources】
https://developer.wordpress.org/reference/classes/wp_term_query/__construct/#parameters

'fields'
(string) Term fields to query for. Accepts 'all' (returns an array of complete term objects), 'all_with_object_id' (returns an array of term objects with the 'object_id' param; works only when the $object_ids parameter is populated), 'ids' (returns an array of ids), 'tt_ids' (returns an array of term taxonomy ids), 'id=>parent' (returns an associative array with ids as keys, parent term IDs as values), 'names' (returns an array of term names), 'count' (returns the number of matching terms), 'id=>name' (returns an associative array with ids as keys, term names as values), or 'id=>slug' (returns an associative array with ids as keys, term slugs as values). Default 'all'.

投稿2019/06/09 04:39

kei344

総合スコア69400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chikachi

2019/06/09 08:00

ありがとうございます。'fields' => 'all' できますよ。'fields' => 'id=>name' とかもできますし。 他の取得はデータが大きくなりすぎるので避けたいんです。(タグだけで10万個とかなので)
kei344

2019/06/09 08:14

回答は「他のデータがいりません」という指定が無い、というものです。 > 他の取得はデータが大きくなりすぎるので避けたいんです。 それであればSQLを最適な物に書き換えるしかないですね。
chikachi

2019/06/18 01:49 編集

できました!もしよかったらベストアンサーのYukiYamashinaさんのご回答をご覧ください。ありがとうございました。
kei344

2019/06/18 03:43

get_termsで全部取得して整形しているだけで、「取得した値を使っていないだけ」ですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問