WordPressのキーワード検索でタグを対象に含める

noimage wordpress

新規サイトを立ち上げる時に検索機能をカスタマイズしました。内容としては通常の検索に加え、検索キーワードと一致するタグを持つ投稿も引っかかるようにするといったものです。

タグやカテゴリーを指定+キーワードを含む投稿というのは簡単だったのですが、検索ボックスだけで実装する情報がほとんど見当たらなかったので共有したいと思います。

スポンサーリンク

実装内容


function custom_request($sql, $query) {
	if( $query->is_main_query() && is_search()) {
		global $wpdb;
		$s = $query->get('s');

		$sql = str_replace(
			"SELECT SQL_CALC_FOUND_ROWS",
			"SELECT DISTINCT SQL_CALC_FOUND_ROWS",
			$sql
		);
		
		$select = "FROM $wpdb->posts
	                LEFT JOIN $wpdb->term_relationships
	                    ON ( $wpdb->posts.ID = $wpdb->term_relationships.object_id )
	                LEFT JOIN $wpdb->term_taxonomy
	                    ON ( $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id )
	                LEFT JOIN $wpdb->terms
	                    ON ( $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id ) ";

		$sql = str_replace(
			"FROM $wpdb->posts",
			$select,
			$sql
		);

		$where = $wpdb->prepare("{$wpdb->terms}.name = %s", $s);

		$sql = str_replace(
			"(wp_posts.post_content ",
			" ($where) OR (wp_posts.post_content ",
			$sql
		);
	}
	return $sql;
}
add_filter('posts_request', 'custom_request', 10 , 2);

実装方法としてはかなり無理やりで、ターム関連のテーブルとpostsテーブルを結合して、そこからsql文をターム(今回は主にタグ)と一致するものも含める条件に置き換えました。

多分wordpressに詳しい人ならもっと簡単だったり効率のいい方法で実装したり出来ると思うのですが、私が調べた限り方法が見つからなかったのでここに残しておきます。

もっといい方法があればぜひコメントで教えていただけると幸いです。

コメント

タイトルとURLをコピーしました