検索結果を表示する仕組み

ワードプレスの標準の検索機能では、タイトルと本文に検索文字列が含まれるかどうかだけを調べて、検索結果を表示するだけなので、htmlのタグや属性値なども検索結果としてヒットします。

ワードプレスを構築する中で、検索機能は重要なテーマの一つです。

検索範囲や内容のカスタマイズの手がかりをpost_search hookを使い探してみました

coreファイルの検索の仕組みと、snippet

wp-includes/query.php

		// If a search pattern is specified, load the posts that match
		if ( !empty($q['s']) ) {
			// added slashes screw with quote grouping when done early, so done later
			$q['s']= stripslashes($q['s']);
			if ( !empty($q['sentence']) ) {
				$q['search_terms']= array($q['s']);
			} else {
				preg_match_all('/".*?(" |$) |((?<=[\r\n\t ",+]) |^)[^\r\n\t ",+]+/', $q['s'], $matches);
				$q['search_terms']= array_map('_search_terms_tidy', $matches[0]);
			}
			$n= !empty($q['exact']) ? '' : '%';
			$searchand= '';
			foreach( (array) $q['search_terms'] as $term ) {
				$term= esc_sql( like_escape( $term ) );
				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
				$searchand= ' AND ';
			}

			if ( !empty($search) ) {
				$search= " AND ({$search}) ";
				if ( !is_user_logged_in() )
					$search .= " AND ($wpdb->posts.post_password= '') ";
			}
		}
		// Allow plugins to contextually add/remove/modify the search section of the database query
		$search= apply_filters_ref_array('posts_search', array( $search, &$this ) );

ワードプレスの標準の検索機能では、タイトルと本文に検索文字列が含まれるかどうかだけを調べて、検索結果を表示するだけなので、htmlのタグや属性値なども検索結果としてヒットします。

この問題に対応するためには、post_search hookを使います。

add_filter( 'posts_search', 'my_test' );

function my_test($content){
 return str_replace('wp_posts.post_content', 'wp_posts.post_excerpt', $content );
}

引数$contentの中身は、以下のようになるので、

string() " AND (((wp_posts.post_title LIKE '%keyword%') OR (wp_posts.post_content LIKE '%keyword%'))) "

my_test()では、投稿内を検索するSQLを抜粋を検索するように変更しています。

抜粋の中に検索対象文字列が存在するように対処が必要です。

[emulsion_relate_posts]