新規サイトを立ち上げる時に検索機能をカスタマイズしました。内容としては通常の検索に加え、検索キーワードと一致するタグを持つ投稿も引っかかるようにするといったものです。
タグやカテゴリーを指定+キーワードを含む投稿というのは簡単だったのですが、検索ボックスだけで実装する情報がほとんど見当たらなかったので共有したいと思います。
実装内容
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に詳しい人ならもっと簡単だったり効率のいい方法で実装したり出来ると思うのですが、私が調べた限り方法が見つからなかったのでここに残しておきます。
もっといい方法があればぜひコメントで教えていただけると幸いです。
コメント