ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

WordPressのget_termsで、ターム名完全一致による抽出を行う方法。

get_termsを使うと、タクソノミー内に存在しているタームの中から、引数で指定した条件のものだけを抽出することができます。

しかし今回、ターム名が条件と完全一致するものだけを抽出したかったのですが、なぜかそのような引数は存在しませんでした。

スラッグなら完全一致検索可能なのに、ターム名だとname__likeによる部分一致しかありません。

広告

二重の抽出処理を行うしかない。

ターム名による抽出がname__likeしかない以上、まずはそれで抽出を行います。

そして、部分一致で抽出できた複数のタームの中から、if文による完全一致検索を行いましょう。

実質二度の抽出処理を行うわけですが、その流れを関数に収めることで、完全一致による検索のように見せることができるでしょう。

function get_terms_by_name($taxonomy, $name) {
	$terms = get_terms($taxonomy, [
		"name__like" => $name,
	]);
	$output = [];
	foreach($terms as $term) {
		if($term->name === $name) {
			array_push($output, $term);
		}
	}
	return $output;
}

スラッグによる完全一致検索じゃダメなの?

URLに関わるスラッグにもいちおう、日本語を入力することができます。

ターム名とスラッグ名を同じにする運用にしていれば、それでもOK。と思い込んでいました。

しかし、スラッグだとむしろ、日本語よりも英語に難点があります。

大文字アルファベットをスラッグに入れても、勝手に小文字アルファベットに変わってしまうので、これではターム名完全一致の検索ができません。

やはりターム名完全一致による検索をするなら、上記のコードのほうが確実でしょう。

追記。(2018/9/8)

いただいた情報によると、「name__like」から「name」に変えることで、ターム名完全一致による抽出が可能になりました。

どうやらバージョン4.2の時点で、すでに可能だったもよう。

get_terms – WordPress私的マニュアル
関数リファレンス/get terms – WordPress Codex 日本語版

しかし、Wordpressについて調べていたら必ず行き着くであろう、上記2サイトにはこの引数の情報は載っていませんでした。

$terms = get_terms($taxonomy, [
	"name" => $name,
]);

というわけで、コードは上記だけで充分となりました。

情報提供ありがとうございます。