回答:
これらの2つの関数をfunctions.phpに追加します
function search_excerpt_highlight() {
$excerpt = get_the_excerpt();
$keys = implode('|', explode(' ', get_search_query()));
$excerpt = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $excerpt);
echo '<p>' . $excerpt . '</p>';
}
function search_title_highlight() {
$title = get_the_title();
$keys = implode('|', explode(' ', get_search_query()));
$title = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $title);
echo $title;
}
検索結果にthe_contentを使用するには、次の関数を使用します。
function search_content_highlight() {
$content = get_the_content();
$keys = implode('|', explode(' ', get_search_query()));
$content = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $content);
echo '<p>' . $content . '</p>';
}
あなたのループまたはsearch.phpファイルの呼び出しで<?php search_title_highlight(); ?>
はなく、<?php the_title(); ?>
かつ使用<?php search_excerpt_highlight(); ?>
の代わりに、<?php the_excerpt(); ?>
cssで、検索ハイライトクラスを追加して、検索されたすべての単語を黄色で強調表示します。
.search-highlight {
background:#FFFF00
}
the_excerpt
、the_content
代わりにフィルタである必要があります。とにかく良い答えですが、@ Geertからのコメントは次のように処理できます:)
上記はうまくいきますが、同様のコードを実行しましたが、タイトルと抜粋を結び付けます。しかし、誰かが検索クエリ用語の最初または最後にスペース ""を入力すると、それが壊れることがわかりました。
だから私はこの行を追加しました:
$keys = array_filter($keys);
// Add Bold to searched term
function highlight_results($text){
if(is_search() && !is_admin()){
$sr = get_query_var('s');
$keys = explode(" ",$sr);
$keys = array_filter($keys);
$text = preg_replace('/('.implode('|', $keys) .')/iu', ''.$sr.'', $text);
}
return $text;
}
add_filter('the_excerpt', 'highlight_results');
add_filter('the_title', 'highlight_results');
これが他の人を助けることを証明することを望みます。
上記のソリューションでは、検索語がHTMLタグ内にある場合、ページが破損します。次のようなものを使用する必要があります。
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
$text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
preg_quote()
し$keys
て、括弧や括弧などの特殊文字の場合に正規表現が爆発しないようにします。