この記事は最後に更新してから1年以上経過しています。

タイトルが一致する投稿を検索する

説明

WordPressが提供する投稿ページの文字列検索機能の実現には、 query_posts関数(WP_Queryクラス)が大きな役割を担っている。ここで紹介するのは、高機能ゆえに使いこなすのが難しいquery_posts関数(WP_Queryクラス)の使用法の一例である。

query_posts関数(WP_Queryクラス)による文字列検索では、「投稿タイトル」および「投稿内容」を対象に指定された文字列が含まれる投稿情報を検索する部分一致検索が標準である。また、文字列をスペースやカンマなどで区切った文字列で検索すれば、それぞれの単語に分解し、すべて含んだ投稿情報を検索する。

このような仕様に特に不満を感じることはないわけだが、指定した文字列のタイトルの投稿情報を取得したいとした場合、残念ながら標準のままでは意図した結果を得ることはできない。

<?php $q1 = new WP_Query( array( 's'=>'Hello, world!' ) ); ?>
投稿タイトル検索結果
Hello, world!
Hello, world! again
world!, Hello

「Hello, world!」で検索した場合、上記投稿タイトルすべてがヒットする

検索する文字列を"(ダブルコーテーション)で囲む

一致する投稿タイトルを検索するためには、次のような対応が必要となる。

先に述べたように、通常はスペースやカンマなどを含んだ文字列は、分解されそれぞれが単語となって検索されるが、文字列を"(ダブルコーテーション)で囲むことでこのような分割を回避できる('(シングルコーテーション)で囲んでも分割されるので注意)。これにより、スペースを含んだ投稿タイトルのみを検索できるようになる。

<?php $q2 = new WP_Query( array( 's'=>'"Hello, world!"' ) ); ?>
投稿タイトル検索結果
Hello, world!
Hello, world! again
world!, Hello×

「"Hello, world!"」で検索した場合、投稿タイトル「world!, Hello」はヒットしない

exactパラメータを使う

query_posts関数(WP_Queryクラス)のパラメータには、exactパラメータがある。このexactパラメータは、省略またはfalse(0)が指定されている場合には部分一致となるが、true(1)が指定されている場合は完全一致として検索が行われる。

<?php $q3 = new WP_Query( array( 's'=>'"Hello, world!"', 'exact'=>true ) ); ?>
投稿タイトル検索結果
Hello, world!
Hello, world! again×
World!, hello×

exact=1を指定して「"Hello, world!"」で検索した場合、投稿タイトル「Hello, world!」のみがヒットする

exactパラメータについては、検索フォームにname属性値にexactを指定したチェックボックスなどを追加することで、既存サイトでも完全一致機能を容易に利用することができる。query_posts関数(WP_Queryクラス)は、投稿タイトルと投稿内容の両方を検索するので、投稿タイトルと同じ文字列が投稿内容に書かれている投稿情報をヒットしてしまうが、実用的には問題ないだろう。


最終更新 : 2014年02月20日 16:28


お勧め

is_home(2018年5月27日 更新)

bool is_home( )
要求されているページが、ホーム(トップ)ページか調べる。

update_comment_meta(2014年3月9日 更新)

bool update_comment_meta( int $comment_id, string $meta_key, mixed $meta_value [ , mixed $prev_value = '' ] )
コメントメタ情報の値を更新する。

wp_robots_noindex(2021年3月13日 更新)

array wp_robots_noindex( array $robots )
robotsメタ要素のcontent属性にnoindexを適用する。

is_taxonomy_hierarchical(2018年5月27日 更新)

bool is_taxonomy_hierarchical( string $taxonomy )
タクソノミーに階層(親子)関係があるか調べる。

get_comment_pages_count(2015年12月16日 更新)

int get_comment_pages_count( [ array $comments = null [ , int $per_page = null [ , bool $threaded = null ] ] ] )
コメントページ数を取得する。