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

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

ただいまの
回答率

89.06%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 1,867

Iya712

score 114

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

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

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

function sample_func($query) {
  if ( is_admin() || ! $query->is_main_query() )
    return;
  if ( $query->is_search() ){
    $word = $_GET['s'];
    $query->set('post_type', 'your_english');

    $metas = array(
            'relation' => 'OR',
            array(
              'key' => 'field1',
              'value' => $word,
              'compare' => 'LIKE'
            ),
            array(
              'key' => 'field2',
              'value' => $word,
              'compare' => 'LIKE'
            )
            );
    $query->set('meta_query',$metas);
    return;
  }
}
add_action( 'pre_get_posts', 'sample_func', 20 );

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

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

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

SELECT 
  SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM 
  wp_posts 
  INNER JOIN wp_postmeta ON (
    wp_posts.ID = wp_postmeta.post_id
  ) 
WHERE 
  1 = 1 
  AND (
    (
      (
        wp_posts.post_title LIKE '%チャンス%'
      ) 
      OR (
        wp_posts.post_excerpt LIKE '%チャンス%'
      ) 
      OR (
        wp_posts.post_content LIKE '%チャンス%'
      )
    )
  ) 
  AND (
    (
      wp_postmeta.meta_key = 'field1' 
      AND wp_postmeta.meta_value LIKE '%チャンス%'
    ) 
    OR (
      wp_postmeta.meta_key = 'field2' 
      AND wp_postmeta.meta_value LIKE '%チャンス%'
    ) 
  ) 
  AND wp_posts.post_type IN ('post', 'acf1') 
  AND (
    (wp_posts.post_status = 'publish')
  ) 
GROUP BY 
  wp_posts.ID 
ORDER BY 
  wp_posts.post_title LIKE '%チャンス%' DESC, 
  wp_posts.post_date DESC 
LIMIT 
  0, 20


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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る