WP Custom Fields Searchでカスタム投稿との関連付けとかやってみた

WP案件でカスタムフィールドで検索する機能を付加するプラグインである、WP Custom Fields Searchを使いましたのでメモ。

ダウンロード・設置

本体:WP Custom Fields Search
日本語版:WP Custom Fields Searchの日本語版配布 | WordPressのプラグイン日本語版を配布 | Lovelog+*

WP3.1で使用しているのですが、設置、日本語化とも特に問題ありませんでした。
設置自体は比較的簡単なことと、既に解説されたサイトがいくつかありますので設置の説明は割愛します。

設定

プラグインを有効化すると左メニューにWP Custom Fields Searchというメニューが増え、専用の管理画面から設定を行います。検索フィールドの検索項目を指定し、生成されるショートコードを記事やテンプレに埋め込むば、その箇所に検索フィールドが表示されるという流れです。

「プリセット」というのが検索フィールドの単位となります。プリセットそれぞれに、各検索フィールドの内容を設定します。デフォルトのプリセットを例に簡単に設定を説明します。

「検索タイトル」「プリセットを使う」の下にある黒い境界線で囲まれた枠一つが検索項目一個となります。「表示/非表示の設定」をクリックすると設定の詳細が表示され、詳細な内容が設定できます。

各項目の概要は以下の通りです。

ラベル:入力枠に表示されるタイトルとなります。
データタイプ:何に対して検索をするのかを定義します。
ウィジェット:検索枠の入力形式を設定します。
比較:ウィジェットに入力された内容をどのような形で検索するかを設定します。

上記を設定して、テンプレートコード、またはポストのためのタグを埋め込めば設定した内容で検索フォームが生成されますので、CSS等でデザインを調整すれば完了です。検索結果の表示にはsearch.phpが使われているようです。

設定画面を見るとわかるのですが、カスタムフィールドを検索する為のものというよりは、Wordpressの色々な項目に関しての限定的な検索をかけられるプラグイン、という認識のほうが正しいようです。かなり便利だなと思いました。

カスタム投稿タイプへの対応

カスタム投稿タイプで絞りたい場合はデータタイプにpost_typeと設定し、ウィジェットへの入力の値でpost_typeを設定するようにします。この際ウィジェットを「非表示の定数」に設定すると右下に「ウィジェットの設定 一定値」という入力欄が出現します。ここに入力すると、hiddenで検索項目として扱われます。予め特定のカスタム投稿のみを検索対象とする場合には、ここに設定すればOKです。

例えば。○○というカスタム投稿タイプのエントリの中で、△△というカスタムフィールドの値に任意の言葉を持っているものを検索する、などの場合。以下の二つの設定が必要です。

ラベル:カスタム投稿タイプ
データタイプ:post_type
ウィジェット:非表示の定数
比較:の中の言葉
ウィジェットの設定 一定値:○○

ラベル:カスタムフィールド
データタイプ:カスタムフィールド
データフィールド:△△
ウィジェット:テキストの入力
比較:の中の言葉

カスタム分類への対応

カスタム分類については、データタイプに選択項目として出てきません。タグは選択項目にあるのでそれでなんとかならないかと色々やってみましたが、意図通りの結果とならずお手上げ。なんかやれそうな雰囲気はあるのですが・・・。「比較」の使い方を十分に理解していないからかもしれません。

で、これについては出力側で対応することにしました。

先に述べた通り、検索結果はsearch.phpで表示されます。ということはそこで条件を追加してクエリをとり直せばカスタム分類でのフィルタリングも可能となります。

global $query_string;
$paged = get_query_var('paged') ? get_query_var('paged') : 1
query_posts($query_string . "&posts_per_page=10&originaltags=tag_A&paged=".$paged);

$query_stringでまずはそもそもの検索条件を取得して、続けてページングのために$pagedも取得。そして追加パラメータとして1ページの表示数と「originaltagsというカスタム分類のtag_Aというタグの場合」という条件を追加しています。

この手法自体は検索結果の絞り込みで広く使われているやり方で、それにカスタム分類でのフィルタリングを併用した感じです。あとは普通にwhileを回してやればエントリを並べることができます。

上記にて、「特定のカスタム投稿で特定のカスタム分類にタグ付けされている記事に対し、特定のカスタムフィールドの値で検索できるフォーム」の出来上がりです。

組み合わせることで検索条件の幅は自由に設定できると思います。

もっといい手があるよと言う場合は是非ご教示いただければ幸いです。