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

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

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

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

Q&A

解決済

2回答

5296閲覧

wordpress カスタムフィールド検索時の条件の書き方

SSaka

総合スコア96

WordPress

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

0グッド

1クリップ

投稿2016/04/27 07:04

編集2016/04/28 07:24

###前提・実現したいこと
wordpressでカスタムフィールドにデータを持った記事を複数保持しています。

search.phpを改良して、metaqueryを使った検索は可能ですが、
検索条件が思うようにカスタマイズできずにいます。

やりたいこと:
input name="s"で指定されたキーワードを元に複数カスタムフィールドから一致するものだけを表示する

現状:
1カスタムフィールドからのみであれば検索できるが、
複数カスタムフィールドを指定すると、全ての記事が表示されてしまう

###発生している問題・エラーメッセージ
1カスタムフィールドからのみであれば検索できるが、
複数カスタムフィールドを指定すると、全ての記事が表示されてしまう

###該当のソースコード

PHP

1$keyWords = $_GET['s']; 2 3//カスタムポストタイプ 4$post_type = 'products'; 5 6 7// 製品名 8$metaquery[] = array( 9 'key' => 'product_name', 10 'value' => $keyWords, 11 'compare' => 'LIKE', 12 'operator' => 'AND' 13); 14// 規格名 15$metaquery[] = array( 16 'key' => 'kikaku_name', 17 'value' => $keyWords, 18 'compare' => 'LIKE', 19 'operator' => 'AND' 20); 21// 仕様 22$metaquery[] = array( 23 'key' => 'description', 24 'value' => $keyWords, 25 'compare' => 'LIKE', 26 'operator' => 'AND' 27); 28// 製品公開日 29$currnet_date = date_i18n( 'y/m/d' ); 30$metaquery[] = array( 31 'key' => 'stage_date', 32 'value' => $currnet_date, 33 'compare' => '<=', 34 'type' => 'DATE', 35 'operator' => 'AND' 36); 37 38$metaquery['relation'] = 'OR'; 39 40global $wp_query; 41query_posts(array( 42 'post_type' => $post_type, 43 'meta_query' => $metaquery, 44 'posts_per_page' => -1, 45 ) 46);

###試したこと
1.relation条件の変更
$metaquery['relation'] = 'OR';を
$metaquery['relation'] = 'AND';とした場合、キーワードにかかわらず全て表示されてしまう

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 5.3.3
WordPress 4.4.2

追記:
おそらく、and条件の組み合わせ方だけの問題ではないか?
という感覚はあるのですが、前に進めていません。
こういう条件を整理するための方法なども探しています。

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

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

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

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

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

guest

回答2

0

自己解決

Metaqueryの配列組み替え方を変えることで対応が可能でした。

  1. OR条件としたいキーワード郡をarrayとしてまとめる
  2. 1.で作ったarrayをmetaqueryに2次元配列要素として代入する
  3. ANDとしたい条件をmetaqueryに配列要素として代入する
  4. 普通にmetaqueryとして処理する

PHP

1$keyWords = $_GET['s']; 2 3//カスタムポストタイプ 4$post_type = 'products'; 5 6 7// 製品名 8$keywords[] = array( 9 'key' => 'product_name', 10 'value' => $keyWords, 11 'compare' => 'LIKE', 12 'operator' => 'AND' 13); 14// 規格名 15$keywords[] = array( 16 'key' => 'kikaku_name', 17 'value' => $keyWords, 18 'compare' => 'LIKE', 19 'operator' => 'AND' 20); 21// 仕様 22$keywords[] = array( 23 'key' => 'description', 24 'value' => $keyWords, 25 'compare' => 'LIKE', 26 'operator' => 'AND' 27); 28$keywords['relation'] = 'OR'; 29 30$metaquery[] = $keywords; 31 32// 製品公開日 33$currnet_date = date_i18n( 'y/m/d' ); 34$metaquery[] = array( 35 'key' => 'stage_date', 36 'value' => $currnet_date, 37 'compare' => '<=', 38 'type' => 'DATE', 39 'operator' => 'AND' 40); 41 42$metaquery['relation'] = 'AND'; 43 44global $wp_query; 45query_posts(array( 46 'post_type' => $post_type, 47 'meta_query' => $metaquery, 48 'posts_per_page' => -1, 49 ) 50);

投稿2016/04/29 17:14

SSaka

総合スコア96

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

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

0

metaquery全体的に「operator」が意味が無い、$metaquery['relation']の挙動で動く。
ということをすっかり抜けたまま考えていました。

operatorを消して、かつ、以下の条件をなくしてしまうことで、
挙動が変わりました。

製品公開日=の公開条件を指定してしまうと、keywordに一致するしないにかかわらず、
OR条件のままだと、全て表示されてしまう、という事象でした。

relationをANDにしてしまうと、今度は全てのフィールドにkeywordが含まれていないと、
条件に合致シないため、以下の条件については事前に記事の公開・非公開を利用して検索条件から除外するように変更しました。

php

1// 製品公開日 2$currnet_date = date_i18n( 'y/m/d' ); 3$metaquery[] = array( 4 'key' => 'stage_date', 5 'value' => $currnet_date, 6 'compare' => '<=', 7 'type' => 'DATE', 8 'operator' => 'AND' 9);

投稿2016/04/29 16:59

SSaka

総合スコア96

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

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

SSaka

2016/04/29 17:15

こちらの回答ではなく、1個上の方へ記入した方法で対応しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問