Written by Kasumi

【簡単】デフォルト検索にACFカスタムフィールドの値を含める方法【wordpress】

こんにちは、カスミです。

さて、以下のようなお悩みをお持ちでしょうか?

wordpress(ワードプレス)のデフォルト検索では、記事のタイトル、コンテンツ内のテキストに紐づいた検索結果がでるが、これにACFカスタムフィールドで設定した値も検索に含めたい。

このような悩みを解決致します。

本記事では、functions.phpにコードを追加し、デフォルト検索にACFカスタムフィールドで設定した値も含めるようにする方法について解説致します。

functions.phpにコードを記述

//-----------------------------------------------------
// 【ACFカスタムフィールドで設定した値を検索に追加】
//-----------------------------------------------------
function ACF_custom_searchadd( $where, $wp_query ) {
  // ACFカスタムフィードのフィールド名を配列で入力します
  $search_acf_add = array('address','hoge','hoge02');

  global $wpdb;

  if ( empty( $where )){
      return $where;
  }

  $terms = $wp_query->query_vars[ 's' ];

  $exploded_terms = explode( ' ', $terms );
  if( $exploded_terms === FALSE || count( $exploded_terms ) == 0 ){
      $exploded_terms = array( 0 => $terms );
  }

  $where = '';
  
  foreach( $exploded_terms as $tag ) :
      $where .= " 
        AND (
          (".$wpdb->prefix."posts.post_title LIKE '%$tag%')
          OR (".$wpdb->prefix."posts.post_content LIKE '%$tag%')
          OR EXISTS (
            SELECT * FROM ".$wpdb->prefix."postmeta
              WHERE post_id = ".$wpdb->prefix."posts.ID
                AND (";

      foreach ($search_acf_add as $searcheable_acf) :
        if ($searcheable_acf == $search_acf_add[0]):
          $where .= " (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') ";
        else :
          $where .= " OR (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') ";
        endif;
      endforeach;

        $where .= ")
          )
          OR EXISTS (
            SELECT * FROM ".$wpdb->prefix."comments
            WHERE comment_post_ID = ".$wpdb->prefix."posts.ID
              AND comment_content LIKE '%$tag%'
          )
          OR EXISTS (
            SELECT * FROM ".$wpdb->prefix."terms
            INNER JOIN ".$wpdb->prefix."term_taxonomy
              ON ".$wpdb->prefix."term_taxonomy.term_id = ".$wpdb->prefix."terms.term_id
            INNER JOIN ".$wpdb->prefix."term_relationships
              ON ".$wpdb->prefix."term_relationships.term_taxonomy_id = ".$wpdb->prefix."term_taxonomy.term_taxonomy_id
            WHERE (
            taxonomy = 'post_tag'
              OR taxonomy = 'category'
              OR taxonomy = 'myCustomTax'
            )
              AND object_id = ".$wpdb->prefix."posts.ID
              AND ".$wpdb->prefix."terms.name LIKE '%$tag%'
          )
      )";
  endforeach;
  return $where;
}

add_filter( 'posts_search', 'ACF_custom_searchadd', 500, 2 );

上記コードをfunctions.phpにコピペしてください。

コピペしたら以下$search_acf_add変数内の配列に追加したいACFカスタムフィールドのフィールド名を入力します。

以上で実装完了です。

実際に検索してみて、ACFカスタムフィールドの値が検索結果に紐づいているか確認してみてください。

まとめ

住所で検索をかけたい時など、ACFカスタムフォールドに住所を入力し、上記方法を用いれば、簡単に住所検索が実装できます。

以上で解説を終わります。

目次

関連記事

WordPress

【WordPress】プラグインの旧バージョンをダウンロード・有効化したい。

2023.10.16
509
WordPress

トップページの記事一覧で2ページ目以降のタイトルタグにページ番号を入れる方法

更新日:2019.11.28
1388
WordPress

【WordPress】ターム一覧を表示する方法【結論:get_termsを使おう】

2022.05.28
3773
プログラミング

URLにパラメータが付与されてる場合のアンカーリンク作成方法

2022.08.02
3751