拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
ブログ記事詳細検索プラグイン(その9・カスタムフィールドでの検索の基本)
SearchEntriesプラグインでは、カスタムフィールドでの検索を行うこともできます。
1.MTSearchConditionCFSectionタグ
カスタムフィールドで検索するには、フィールドごとに「MTSearchConditionCFSection」というタグのブロックを作り、そのブロックの中に条件を指定するタグを書きます。
<mt:SearchConditions> <mt:SearchConditionCFSection field="カスタムフィールドのベースネーム"> カスタムフィールドの検索条件を指定するタグ </mt:SearchConditionCFSection> </mt:SearchConditions>
fieldモディファイアで、検索対象のカスタムフィールドのベースネームを指定します。
ベースネームは、カスタムフィールドの作成の際に、「ベースネーム」の欄に設定した値です。
2.検索条件を指定するテンプレートタグ
カスタムフィールドでの検索条件は、以下のテンプレートタグで指定します。
いずれのテンプレートタグも、ブログ記事のフィールドを検索する場合と書き方は同じです。
ただし、テンプレートタグ名に「CF」が入っていることと、fieldモディファイアを指定しない点が異なります。
条件 | テンプレートタグ |
---|---|
値が○○に等しい | <$mt:SearchConditionCFValues values="値1","値2",・・・,"値n"$> |
値に○○を含む | <$mt:SearchConditionCFLike values="値"$> |
値が○○より大きい等 | <$mt:SearchConditionCFCompare 演算子="値"$> |
値が○○以上□□以下等 | <$mt:SearchConditionCFCompare 演算子1="値1" 演算子2="値2"$> |
ただし、MTSearchConditionCFCompareタグで値を数値として比較できるようにしたい場合は、拙作のNumericCustomFieldsプラグインをインストールして、数値型のカスタムフィールドに値を入力しておく必要があります。
Movable Type標準のカスタムフィールドの型では、値は文字列として扱われますので、数値としての比較が正しく行われません。
3.検索の事例
ブログ記事に商品のデータを入力することを想定して、以下の表のようにカスタムフィールドを定義しているとします。
また、値も入力しているものとします。
カスタムフィールド | カスタムフィールドの種類 | ベースネーム | テンプレートタグ |
---|---|---|---|
値段 | 整数 | entry_price | MTEntryPrice |
サイズ | テキスト | entry_size | MTEntrySize |
おすすめ | チェックボックス | entry_recommend | MTEntryRecommend |
値段は、拙作のNumericCustomFieldsプラグインを使って、整数の値で入力してあるものとします。
また、サイズには「S,M,L」など、複数のサイズをコンマで区切って入力してあるものとします。
3-1.おすすめ商品を検索
お勧め商品(「おすすめ」のチェックボックスがオンになっている)商品を検索する場合、MTSearchConditionCFValuesタグを使って、「entry_recommendカスタムフィールドの値が1になっている」という条件で検索します。
<mt:SearchConditions> <mt:SearchConditionCFSection field="entry_recommend"> <$mt:SearchConditionCFValues values="1"$> </mt:SearchConditionCFSection> </mt:SearchConditions> <mt:IfNonZero tag="SearchLoadedEntryCount"> <ul> <mt:Entries> <li><$mt:EntryTitle$>(<$mt:EntryRecommend$>)</li> </mt:Entries> </ul> </mt:IfNonZero>
3-2.SかMのサイズがある商品を検索
SかMのサイズがある商品を検索するには、MTSearchConditionsCFLikeタグを使って、「entry_sizeフィールドの値にSかMを含む」という条件で検索します。
<mt:SearchConditions> <mt:SearchConditionCFSection field="entry_size"> <$mt:SearchConditionCFLike values="S,M"$> </mt:SearchConditionCFSection> </mt:SearchConditions> <mt:IfNonZero tag="SearchLoadedEntryCount"> <ul> <mt:Entries> <li><$mt:EntryTitle$>(<$mt:EntrySize$>)</li> </mt:Entries> </ul> </mt:IfNonZero>
3-3.1,000円以上2,000円未満の商品を検索
1,000円以上2,000円未満の商品を検索するには、MTSearchConditionsCFCompareタグを使って、「entry_priceフィールドの値が1,000以上2,000未満」という条件で検索します。
<mt:SearchConditions> <mt:SearchConditionCFSection field="entry_price"> <$mt:SearchConditionCFCompare ge="1000" lt="2000"$> </mt:SearchConditionCFSection> </mt:SearchConditions> <mt:IfNonZero tag="SearchLoadedEntryCount"> <ul> <mt:Entries> <li><$mt:EntryTitle$>(<$mt:EntryPrice$>)</li> </mt:Entries> </ul> </mt:IfNonZero>
4.SearchEntriesプラグイン関係の記事の一覧
SearchEntriesプラグイン関係のその他の記事は、以下のリンクから参照できます。
- ブログ記事詳細検索プラグイン(その1・概要/インストール/ライセンス)
- ブログ記事詳細検索プラグイン(その2・「ブログ記事のフィールドの値が○○に等しい」場合の検索)
- ブログ記事詳細検索プラグイン(その3・「ブログ記事のフィールドの値に○○を含む」場合の検索)
- ブログ記事詳細検索プラグイン(その4・「ブログ記事のフィールドの値が○○以上」等の場合の検索)
- ブログ記事詳細検索プラグイン(その5・ブログ記事のフィールドどうしでのOR検索)
- ブログ記事詳細検索プラグイン(その6・カテゴリのOR検索)
- ブログ記事詳細検索プラグイン(その7・カテゴリのAND検索)
- ブログ記事詳細検索プラグイン(その8・タグの検索)
- ブログ記事詳細検索プラグイン(その9・カスタムフィールドでの検索の基本)
- ブログ記事詳細検索プラグイン(その10・カスタムフィールドでの検索の応用)
- ブログ記事詳細検索プラグイン(その11・各種の検索条件の指定)
- ブログ記事詳細検索プラグイン(その12・ブログ記事の並べ替え)
- ブログ記事詳細検索プラグイン(その13・検索結果の一部を読み込む)
- ブログ記事詳細検索プラグイン(その14・複雑なOR検索)
- ブログ記事詳細検索プラグイン(その15・検索結果の件数の出力)
- ブログ記事詳細検索プラグイン(その16・検索フォーム作成の基本)
- ブログ記事詳細検索プラグイン(その17・検索結果表示テンプレート作成の基本)
- ブログ記事詳細検索プラグイン(その18・検索を動作させるための設定)
- ブログ記事詳細検索プラグイン(その19・検索フォーム/検索結果表示の事例・1つの数値で検索)
- ブログ記事詳細検索プラグイン(その20・検索フォーム/検索結果表示の事例・数値の範囲で検索)
- ブログ記事詳細検索プラグイン(その21・検索フォーム/検索結果表示の事例・数値の範囲をselectで選択)
- ブログ記事詳細検索プラグイン(その22・検索フォーム/検索結果表示の事例・日付で検索)
- ブログ記事詳細検索プラグイン(その23・検索フォーム/検索結果表示の事例・期間で検索)
- ブログ記事詳細検索プラグイン(その24・検索フォーム/検索結果表示の事例・カテゴリのOR検索)
- ブログ記事詳細検索プラグイン(その25・検索フォーム/検索結果表示の事例・カテゴリのAND検索)
- ブログ記事詳細検索プラグイン(その26・検索フォーム/検索結果表示の事例・タグのOR検索)
- ブログ記事詳細検索プラグイン(その27・検索フォーム/検索結果表示の事例・タグのAND検索)
- ブログ記事詳細検索プラグイン(その28・検索フォーム/検索結果表示の事例・ドロップダウン/ラジオボタンのカスタムフィールドの検索)
- ブログ記事詳細検索プラグイン(その29・検索結果のページ分割/静的な検索の場合)
- ブログ記事詳細検索プラグイン(その30・検索結果のページ分割/動的な検索の場合)
- ブログ記事詳細検索プラグイン(その31・検索結果のページ分割/PHPによるキャッシュ)
- SearchEntriesプラグインでMore Custom FieldsプラグインのCheckbox Groupを検索する(静的編)
- SearchEntries プラグインでMore Custom FieldsプラグインのCheckbox Groupを検索する(動的編)
- SearchEntriesプラグイン不具合修正
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください
mari
こんにちは。いつも作業上大変お世話になっています。ありがとうございます。
さて、システムで作成したカスタムフィールドの場合は、どのような記述になるんでしょうか?
特に変わらないですか?
うまく動作しなくて・・・。
教えていただけますか。
m(__)m
壱からmariへの返信
>mariさん
こんにちは。
バージョン1.03まででは、システムのカスタムフィールドを検索できない不具合がありました。
バージョン1.04をお使いください。
http://www.h-fj.com/mt_plugin/SearchEntries_1_04.zip
mari
お忙しいところご回答ありがとうございました!
hiro
いつも参考にさせていただいており、大変助かっています。ありがとうございます。
一つご質問がございます。検索フォームでユーザーが入力した値がカスタムフィールドの値と一致した場合に検索結果に表示させたいと思いまして、titleやkeywordsと同様に組んで見ましたがうまくいきませんでした。
■検索フォーム
<form method="get" action="<$mt:RealtimeRebuildCGIPath$>">
<input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
<input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="詳細検索結果"$>" />
<p>
<label for="title">カスタムフィールド</label><br />
<input type="text" id="entrycustom" name="entrycustom" />
</p>
<p>
<input type="submit" value="送信" />
</p>
</form>
(inputのid="entrycustom"はカスタムフィールドのbasenameです。)
■検索結果
<$MTGetQueryParamsToVars$>
<mt:SearchConditions>
<mt:If name="qp_entrycustom">
<mt:SearchConditionCFSection field="entrycustom" values="$qp_entrycustom">
</mt:SearchConditionCFSection>
</mt:If>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
<p>条件に合う記事が<$mt:SearchLoadedEntryCount$>件ありました。</p>
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
<mt:Else>
<p>条件に合う記事がありませんでした。</p>
</mt:IfNonZero>
こちらどこが良くないのか教えていただけないでしょうか。。
どうぞよろしくお願いいたします。
壱
>hiroさん
こんにちは。
いただいたテンプレートだと、MTSearchConditionCFSectionタグの書き方が間違っています。
MTSearchConditionCFSectionタグではフィールドの名前だけを指定し、そのブロックの中に検索条件を指定するタグを入れます。
「検索フォームでユーザーが入力した値がカスタムフィールドの値と一致した場合」という条件だと、MTSearchConditionCFSectionタグのブロックを以下のようにすれば良いはずです。
hiro
藤本様
ありがとうございました。教えていただいた方法でうまくいきました。
お手数おかけして申し訳ございませんでした。
ono
はじめまして。こちらのプラグインを使用させていただいております。
非常に有用なプラグインをありがとうございます。
1点質問なのですが、カスタムフィールド(テキストボックスまたはテキストエリア)が
「空」であるときの検索はどのように行えば良いでしょうか。
空の時は出力をしたくないのですが、
データベース上で NULL であれば出力がなく期待する通りの動作をするのですが、
一度データを入力し削除した場合、データベース上では NULL にならないためか、
出力がされてしまいます。
大変お手数なのですが、こちらを回避可能な記述方法がございましたら
ご教授いただければ幸いです。
壱からonoへの返信
>onoさん
こんにちは。
ご指摘の件を修正したバージョンを公開しました。
http://www.h-fj.com/blog/archives/2014/01/28-122436.php
みっく
AnotherCustomFieldを便利に使わせていただいています。
そのAnotherCustomFieldで追加したフィールドを検索しようと思っているのですが
うまくいきません。
bname:
tag: EntryBname
このフィールドを検索しようと思ったら
<mt:SearchConditions>
<mt:SearchConditionCFSection field="bname">
<$mt:SearchConditionCFLike values="772"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
このように書くということであっていますでしょうか?
壱
>みっくさん
こんにちは。
AnotherCustoMFieldsプラグインで追加したフィールドは、MT標準のカスタムフィールドとは異なり、記事本来のフィールドと同じ方法で検索します。
具体的な検索方法はマニュアルに記載してありますので、マニュアルをご参照ください。
みっく
返信ありがとうございます。
マニュアル読み返し、正しい方法を理解しました。失礼いたしました。
で、検索はきちんと動いたのですが、結果がうまく出てこなくて困っています。
全くヒットしない文字列だと、結果がありませんでしたという表示になるのですが
一つでもヒットすると、全部の記事が表示されるような感じに見受けられます。
検索の結果は
で、取り出しているのですが、問題ないはずですよね。
なにかヒントをいただければ幸いです。
みっく
追記です。
念のため、1件しかヒットしない文字列を検索にかけてみて
で、ヒット数を調べたのですが、きちんと
1件とでてきます。
しかし、MTEntriesで出てくるのは、全部の記事 という感じです。
壱
>みっくさん
こんにちは。
検索結果の出力には、MTEntriesタグではなく、MTSearchLoadedEntriesタグをお使いください。
http://www.h-fj.com/blog/archives/2012/12/19-162148.php
みっく
カスタムフィールドの中身も検索対象にできますが
カテゴリやウェブページにつくったカスタムフィールドも同様にして検索できますか?
あと、カテゴリディスクリプションなども検索できますか?
壱
>みっくさん
こんにちは。
ウェブページのカスタムフィールドは検索することができますが、カテゴリはカテゴリ名のみが検索対象です。