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

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

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

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

PHP

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

Q&A

解決済

2回答

3050閲覧

WordPressのWP_Queryを使った検索で、タグ名を部分一致検索したい

morimasa

総合スコア15

WordPress

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

PHP

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

0グッド

2クリップ

投稿2019/04/10 04:58

WordPress 5.0.3で、独自テーマを開発中です。

WP_Queryのタグの検索で、
タグ名を部分一致で検索したいと思っています。

タグIDでもなく、タグのslugでもなく、タグ名(表示用の名前)に対して、部分一致で検索したいと思います。
本来の「タグ」としての使用方法ではないとは思うのですが、旧仕様との兼ね合いで必要に迫られています。

SQLで言うと、

WHERE wp_terms.name LIKE '%SEARCH_KEY%'

というようなことになるのですが、
これはWP_Queryのtax_queryで実現可能でしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

回答がつかないようなので...

WP_Query 単体では難しいと思います。

WP_Query の tax_query で、比較条件として使用できるのは、

operator (文字列) - 演算子。使用可能な値は 'IN'(デフォルト), 'NOT IN', 'AND', 'EXISTS' (4.1.0以降) と 'NOT EXISTS'(4.1.0以降) です。

となっていて、LIKE は、含まれていません。

関数リファレンス/WP_Query 参照


SQL を使わずにということであれば、get_terms でタグの一覧を取り出して、ループで部分一致させて対象の slug を取り出して WP_Query 検索することで対応できると思うのですが、効率のよい簡便な方法は思いつかないですね。

投稿2019/04/11 03:12

CHERRY

総合スコア25171

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

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

morimasa

2019/04/17 05:33

ありがとうございます! ご返信遅くなりました。 結局、タグ以外にもカテゴリなどにも部分一致させたいという要望があったところ、 WP_Queryが実際に発行しているSQLを確認したら、 検索(パラメータ「s」)の場合、タグ名やスラッグに対して部分一致検索していることが分かりました。 ※他にカテゴリと抜粋と本文に対しても部分一致 最終的な要求としては、「本文の要素以外に対して部分一致で検索」という仕様だったので、 ---------- function my_search($search, $wp_query){ $search = preg_replace("/ OR (wp_posts.post_content LIKE '{[0-9a-z]+}".$search_key."{[0-9a-z]+}')/",'',$search); return $search; } add_filter('posts_search','my_search', 10, 2); ※いつのバージョンからか、SQLの中の「%」がランダム文字列にエスケープされているようなのですが、「{[0-9a-z]+}」が実際のところ「%」です。 ---------- この処理を加えた、標準の検索に委ねるということで、解決しました。 ご回答ありがとうございました!
morimasa

2019/04/17 05:35

※上のコードは、実際には、$search_keyの決定などをはしょっています。ご注意・ご留意ください。
guest

0

自己解決

クリップが2件もついているので、結論をまとめます。

まず、やはりWP_Queryの標準状態では実現不可能でした。

その上で、基本的な考えとしては、「s」での標準検索が、タグやカテゴリに対しても部分一致で検索しているので、それを有効活用します。

ただし、「本文に対しては検索しなくて良い」「タグだけで良い」「タグとカテゴリだけで良い」といった場合は、不要なものを実行されるSQLから削除します。

具体的には、以下のようなコードをfunctions.phpに追記します。

PHP

1function my_search($search, $wp_query){ 2 // var_dump($wp_query); 3 $s = $wp_query->get('s'); 4 $s_arr = explode(' ',$s); 5 foreach($s_arr as $search_key){ 6 $search = preg_replace("/ OR (wp_posts.post_content LIKE '{[0-9a-z]+}".$search_key."{[0-9a-z]+}')/",'',$search); // 本文に対する検索を削除 7 } 8 return $search; 9} 10add_filter('posts_search','my_search', 10, 2);

var_dumpでクエリの中の"request"(実行されるSQL)を確認しながら作業することになります。

部分一致検索を自分で追加するよりもこの標準検索から不要なものを削るほうが簡単なようです。

ご参考にされてください。
よろしくお願いいたします。

投稿2019/04/17 05:47

morimasa

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問