検索で強調する

Web

WordPressの検索結果で、ACFの検索結果を検索ワードで強調

WordPressのsearch.phpで、検索結果にカスタム投稿タイプで使用しているACF(Advanced Custom Fields)の値を対象にできないか探したので、メモ。

カスタム投稿も検索対象にする

通常だと、search.phpでカスタム投稿タイプは検索対象とはなっていないそう。そのため、function.phpにその対応を記述しなければなりません。ついでに、カスタムタクソノミーも対象に含めたかったので探すと、素晴らしいサイトがありました。下記サイトのコードを用いると望み通りの結果に。ありがとう!

WordPress のサイト内検索をプラグインなしでカスタマイズする方法 - デザイナーのタネあかし
サイト内検索を拡張してくれる有名プラグインもあるのですが、今回は functions.php に記述して検索条件をカスタ…

検索ワードで強調する

検索ワードを含む対象ページは表示されるようになりましたが、どの部分に検索ワードが含まれているのかも知りたい。googleの検索結果のようにタイトルや本文が強調されていると使い勝手が良さそうだと思い、調べるとやはりありました。そうそうこういった感じです。

WordPressで検索した文字列をハイライトする方法
WordPressの検索結果ページで、記事タイトルに検索した文字列が含まれていたら、その部分をハイライトしたい…

上記サイトを参考に、検索ワードを強調するのですが、このままでは元の文章が無いことに気づきました。とりあえず、一括して取得する方法を探すとありました。

Advance Custom fields(ACF)の出力方法まとめ【個別・一括】 | ガリレオ アンド ヴィーナス合同会社
「Advance Custom fieldsって何?」という方は、下記記事をご確認ください。出力方法一覧基本の出力テキス…

こちらを参考に全部取得し、強調対象の文字の塊を作ることに。

$content = '';
$fields = get_fields();
foreach($fields as $key => $value) {
 if ($value) {
   $content .= $value;
  }
}

それを元に検索ワードを強調します。念のため、strip_tags()で含まれるタグを除去し、文字の塊の中から一番最初に出現する検索ワードをmb_strpos()で探しました。その最初の位置から50文字をmb_substr()で抜き出し、前述のサイトを参考に強調を施しています。googleの検索結果のように検索ワードの前後をピックアップできるようになれば尚良しですが、どうすれば良いのか思いつかなかったので、次の宿題です。

$sr = $search_query;
$start = mb_strpos(strip_tags($content), $sr);
$content = mb_substr(strip_tags( $content), $start, 50, 'UTF-8');
$keys = explode(" ", $sr);
foreach ($keys as $key) {
 if (strpos($content, $key) !== false) {
   $content = preg_replace('/' . $key . '/', '<span class="highlight">' . $key . '</span>', $content);
    break;
  }
}
echo $content;

コメント