如何讓 WordPress 搜尋頁面標記出搜尋的關鍵字?

在 WordPress 的搜尋頁裡,通常搜尋的結果會顯示摘要 (excerpt),但摘要裡面很有可能是沒有包含相關的搜尋關鍵字,但我們會有需求希望可以在搜尋摘要裡面標記出搜尋的關鍵字,因此我們會需要從原本的文章抓出關鍵字後進行標記。

演算法

  1. 取得文章的整個內文
  2. 在移除 HTML 後將空白、換行這些特殊字元換掉
  3. 找到關鍵字發生的位置,並在前後保留 60 個字元 (可自行調整)
  4. 在關鍵字前後帶入 <strong> 做標記

完整程式碼

    $post = get_post($post_id);
    $text = strip_tags(preg_replace(array("/\r?\n/", '@<\s*(p|br\s*/?)\s*>@'), array('', "\n"), apply_filters('the_content', $post->post_content)));

    $position = mb_strpos($text, $keyword);

    if ($position !== false) {
      $start = max(0, $position - 30);
      $end = min(mb_strlen($text), $position + mb_strlen($keyword) + 60);
      $substring = mb_substr($text, $start, $end - $start);
      $highlightedSubstring = str_replace($keyword, "<strong>{$keyword}</strong>", $substring);
      return $highlightedSubstring . '...';
    }
    return get_the_excerpt($post_id);