【WordPress】検索対象にカスタムフィールドやコメントを追加する例(プラグインなし)

WordPressのサイト内検索では、検索の対象は「タイトル」と「本文」の文字列となりますが、今回は、その検索対象に、その他の項目を追加する例となります。また、プラグインは利用しない方法となります。

【WordPress】サイト内検索の対象にカスタムフィールド・コメントを追加する例

WordPressではページを表示する際に、データベースに対してSQLクエリを発行しデータを取得しますが、ページに表示する情報をカスタマイズしたい場合に、クエリを修正するカスタムクエリを利用する方法があります。

今回は、そのカスタムクエリを利用する方法となります。

例では、クエリを修正できるフィルターフックを利用し、サイト内検索の対象にカスタムフィールドの値と、コメントの内容を追加しています。

以下、ソースコードの例となりfunctions.phpに記述します。

// 検索する対象のテーブルを結合
function my_posts_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
		$join .= "LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
		$join .= "LEFT JOIN $wpdb->comments ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID ";
	}

    return $join;
}
add_filter('posts_join', 'my_posts_join' );

// 検索を行う条件を追加 
function my_posts_where( $where ) {
	global $wpdb;
	
	if ( is_search() ) {
		$where = preg_replace(
			"/\($wpdb->posts.post_title LIKE (\'[^\']+\')\)/",
			"($wpdb->posts.post_title LIKE $1) OR ($wpdb->postmeta.meta_value LIKE $1) OR ($wpdb->comments.comment_content LIKE $1)",
			$where
		);
	}

	return $where;
}
add_filter( 'posts_where', 'my_posts_where' );

// カスタムクエリの重複する投稿データを除外
function my_posts_distinct() {
    if ( is_search() ) {
        return "DISTINCT";
    }
}
add_filter( 'posts_distinct', 'my_posts_distinct' );

フィルターフックの説明

以下、上記コードで利用したフィルターフックの説明となります。

検索する対象のテーブルを結合|posts_join

フィルターフックのposts_joinは、クエリにJOIN句を追加できるフックとなり、コールバック関数の引数に渡される値に、JOIN句を追加します。

例では、検索結果ページの場合に、クエリに対して「カスタムフィールド」と「コメント」の情報がセットされているテーブルを結合しています。

検索の条件を追加|posts_where

フィルターフックのposts_whereは、クエリの WHERE句を修正できるフックとなり、コールバック関数の引数にWHERE句の値が渡されます。

例では、検索結果ページの場合に、WHERE句をpreg_replace関数で置換し、「カスタムフィールドの値」と「コメントの内容」の検索を行う条件を追加しています。

また、preg_replace関数については以下のリンク先を参考にしてみてください。

カスタムクエリの重複する投稿データを除外|posts_distinct

フィルターフックのposts_distinctは、カスタムクエリの結果に重複したレコードがある場合に、その重複を除外します。

例では、検索結果ページの場合に、重複したレコードを除外しています。

また、フィルターフックのposts_distinctについては以下のリンク先を参考にしてみてください。

まとめ

以上がサイト内検索の対象にカスタムフィールドの値と、コメントの内容を追加する例となります。

カスタムクエリの詳細などは、文末の参考サイト内を確認してみてください。

参考サイトなど

コメント投稿コメント投稿欄を開く

コメントは項目欄(*は必須項目)を入力し、「コメントを送信」ボタンをクリックしてください。 (メールアドレスは公開されることはありません。コメントの公開は承認制となります。)

また、多忙によりコメントには返信できない場合があります。

Twitterで返信する場合はこちらから。