タイトルのみをキーワード検索する

タイトルのみをキーワード検索する - タイトルだけとか、本文だけを検索したいときってあるよね

説明

WordPressのキーワード検索は、投稿タイトルと本文のどちらかに指定したキーワードが含まれているかを調べるわけだが、時々タイトルだけとか、逆に本文だけ検索したいケースがある。

query_posts関数(WP_Queryクラス)のキーワード検索はsパラメータで指定する。例えば'abc'を検索する場合は、内部では次のような検索条件文となる(テーブルプレフィックスは標準の'wp')。

// ログイン中の場合
$search = " AND (((wp_posts.post_title LIKE '%abc%') OR (wp_posts.post_content LIKE '%abc%'))) ";

// 未ログインの場合
$search = " AND (((wp_posts.post_title LIKE '%abc%') OR (wp_posts.post_content LIKE '%abc%')))  AND (wp_posts.post_password = '') ";

「wp_posts.post_title」が投稿タイトル、「wp_posts.post_content」が本文の検索条件で、後者の条件を削除すれば、タイトルのみのキーワード検索を実現できる。そんな都合のいいフィルターがあるかというと、実際あったりするのがWordPressのいいところ。フィルター名は'posts_search'で、次のようなコードをテーマのfunctions.phpに追加することでタイトルのみの検索を実現できる。

add_filter( 'posts_search', 'search_for_title' );

function search_for_title( $search ) {
	return preg_replace( "/ OR \([^\(\.]+.post_content LIKE '%.+%'\)/u", "", $search );
}

ついでに、本文のみのキーワード検索を実現する場合は、次のようにすればいい。

add_filter( 'posts_search', 'search_for_content' );

function search_for_content( $search ) {
	return preg_replace( "/\([^\(\.]+.post_title LIKE '%.+%'\) OR /u", "", $search );
}

なお検索条件を置き換える正規表現は、若干甘さがあるかもしれない(何度か試した限り、上記で問題なかった)。うまくいかない場合は、適宜調整してほしい。

関連

  • add_filter - フィルター関数を追加する
  • query_posts - 条件を指定して投稿情報をロードする

お勧めコンテンツ

wp_send_json_error(2012年12月12日 登録)

void wp_send_json_error( mixed $response, int $status_code = null )
AJAXリクエストの失敗レスポンスとしてJSON情報を返す。

have_comments(2009年11月30日 登録)

bool have_comments( )
次のコメントデータが存在するかを調べる。

get_the_author_posts_link(2015年12月10日 登録)

string get_the_author_posts_link( )
投稿者アーカイブページのリンクを取得する。

previous_posts_link(2009年11月12日 登録)

void previous_posts_link( [ string $label = '« Previous Page' ] )
カテゴリーやタグなどのアーカイブページにおいて、1ページの投稿件数以上の投稿があった場合に前ページへのリンクを表示する。

post_custom(2012年6月21日 登録)

mixed post_custom( [ string $key = '' ] )
カスタムフィールドの値を取得する。

最終更新日時 : 2014-04-03 12:34