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

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

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

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

PHP

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

Q&A

0回答

1239閲覧

wordpress pre_get_postsでmeta_queryを追加して条件をつけると取得できない。

Iya712

総合スコア158

WordPress

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

PHP

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

0グッド

2クリップ

投稿2018/02/28 14:32

wordpressのテーマ修正をおこなっています。
やりたいことは、フリーワード検索して一覧表示させる際に、カスタムポストを検索対象にすることです。
しかし、そのカスタムポストはタイトル以外、ACFで作成したカスタムフィールドで構成されています。

それらカスタムフィールドに対して、フリーワードでlike検索をかけた上で、検索結果を出したいというものです。

そこで、pre_get_postsフックを使って、検索条件を追加しようと、以下のようなコードをfunctions.phpに追加しました。

php

1function sample_func($query) { 2 if ( is_admin() || ! $query->is_main_query() ) 3 return; 4 if ( $query->is_search() ){ 5 $word = $_GET['s']; 6 $query->set('post_type', 'your_english'); 7 8 $metas = array( 9 'relation' => 'OR', 10 array( 11 'key' => 'field1', 12 'value' => $word, 13 'compare' => 'LIKE' 14 ), 15 array( 16 'key' => 'field2', 17 'value' => $word, 18 'compare' => 'LIKE' 19 ) 20 ); 21 $query->set('meta_query',$metas); 22 return; 23 } 24} 25add_action( 'pre_get_posts', 'sample_func', 20 ); 26

これを適用させて、ちゃんと設定したqueryが反映されていることは確認しました。
しかし、実際にあるカスタムポストのfield2にのみ存在する単語を検索フォームにいれても、検索結果として取得できませんでした。

試しにWPで実行されたクエリを確認してみると、meta_queryで追加した条件が、ANDで繋がっている状態でした。
たしかにこれでは取得できません。ANDで繋がっている部分をORに変えた状態で直接DBで実行させてみると、正しく取得されました。

念のため、同じことをpre_get_postsは使わずに、search.phpで直接new WP_Query($args)させてやってみましたが、
出力されたクエリは、meta_queryがANDで繋がっている状態でした。

SQL

1SELECT 2 SQL_CALC_FOUND_ROWS wp_posts.ID 3FROM 4 wp_posts 5 INNER JOIN wp_postmeta ON ( 6 wp_posts.ID = wp_postmeta.post_id 7 ) 8WHERE 9 1 = 1 10 AND ( 11 ( 12 ( 13 wp_posts.post_title LIKE '%チャンス%' 14 ) 15 OR ( 16 wp_posts.post_excerpt LIKE '%チャンス%' 17 ) 18 OR ( 19 wp_posts.post_content LIKE '%チャンス%' 20 ) 21 ) 22 ) 23 AND ( 24 ( 25 wp_postmeta.meta_key = 'field1' 26 AND wp_postmeta.meta_value LIKE '%チャンス%' 27 ) 28 OR ( 29 wp_postmeta.meta_key = 'field2' 30 AND wp_postmeta.meta_value LIKE '%チャンス%' 31 ) 32 ) 33 AND wp_posts.post_type IN ('post', 'acf1') 34 AND ( 35 (wp_posts.post_status = 'publish') 36 ) 37GROUP BY 38 wp_posts.ID 39ORDER BY 40 wp_posts.post_title LIKE '%チャンス%' DESC, 41 wp_posts.post_date DESC 42LIMIT 43 0, 20

このようなクエリが出力されている状態です。
wp_postmeta.meta_key = 'field1'
この記述の2行上のANDが原因です。ここをORにかえると正常に取得できます。

知りたいのは、ここのANDをORに変えた状態でクエリを出力させるには、pre_get_postsフックでどのように記述すれば良いのか?ということです。

もしくは、WP_Queryでもいいです。

フリーワード検索で、投稿タイトル・本文と、カスタムポストのタイトル・カスタムフィールドの値に対して、各々OR条件でLike検索をかける方法をご教授いただきたいです。

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問