【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については以下のリンク先を参考にしてみてください。
まとめ
以上がサイト内検索の対象にカスタムフィールドの値と、コメントの内容を追加する例となります。
カスタムクエリの詳細などは、文末の参考サイト内を確認してみてください。
- Plugin API/Filter Reference/posts join « WordPress Codex
- posts_where | フック| WordPress開発者向けリソース
- カスタムクエリ – WordPress Codex 日本語版
- クエリ概要 – WordPress Codex 日本語版
- データベース構造 – WordPress Codex 日本語版
- 関数リファレンス/wpdb Class – WordPress Codex 日本語版
- Search WordPress by Custom Fields without a Plugin | Adam Balée Designs, LLC