「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。
Kindle本で、定価250円です。
ブログ記事詳細検索プラグイン(その14・複雑なOR検索)
SearchEntriesプラグインを若干バージョンアップして、複雑なOR検索を行う機能を追加しました。
1.ダウンロードとインストール
新しいバージョンは、以下からダウンロードすることができます。
ダウンロードしたZipファイルを解凍すると、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先にアップロードします。
2.セクション間のOR検索
最初のバージョンでは、検索条件のセクション(ブログ記事のフィールド/カテゴリ/タグ/カスタムフィールド)の間で、OR検索を行うことができませんでした。
例えば、「タイトルに『プラグイン』を含むか、または『CMS』というタグがついている」という検索を行いたいとします。
「タイトルに『プラグイン』を含む」という条件は、ブログ記事のフィールドのセクションで条件を指定します。
一方、「『CMS』というタグがついている」という条件は、カスタムフィールドのセクションで条件を指定します。
この検索は、異なるセクションの間のORになるので、行うことができませんでした。
3.手順
今回のバージョンでは、このような検索を行う機能を追加しました。
ただし、検索条件を指定する際には、やや頭を使う必要があります。
3-1.検索条件の分割
まず、ORでつなぎたい検索条件を、以下の各部分に分けます。
- (a)ブログ記事のフィールド以外の1つのセクションだけで表せる条件
- (b)ブログ記事のフィールドのセクションと、ブログ記事以外のセクションとのANDで表せる条件
- (c)ブログ記事のフィールド以外のセクションどうしのANDで表せる条件
- (d)ブログ記事のフィールドのセクションだけで表せる条件
3-2.各部分の検索
次に、(a)~(c)の各条件をMTSearchConditionsタグのブロックで表し、検索されたブログ記事のIDを、それぞれ変数に代入します。
それには、MTSearchConditionsタグに「entry_ids="変数名"」というモディファイアを指定します。
<mt:SearchConditions entry_ids="変数名"> 検索の条件を指定するテンプレートタグ </mt:SearchConditions>
3-3.ORによる結合
最後に、「ブログ記事のIDが、上の(a)~(c)の結果の変数の値になっている」という条件と、(d)の条件とのORを取ります。
そして、その条件を満たすブログ記事を読み込みます。
例えば、前述の(a)~(c)にあたる条件が3種類あり、それぞれの結果を、変数eid1~eid3に代入したとします。
この場合、以下のようにテンプレートを組みます。
<mt:SearchConditions> <$mt:SearchConditionValues field="id" values="$eid1"$> <$mt:SearchConditionUnion op="or"$> <$mt:SearchConditionValues field="id" values="$eid2"$> <$mt:SearchConditionUnion op="or"$> <$mt:SearchConditionValues field="id" values="$eid3"$> <$mt:SearchConditionUnion op="or"$> <mt:SearchConditionSection> (d)の条件を表すテンプレートタグ </mt:SearchConditionSection> </mt:SearchConditions>
なお、(d)で表せる条件がない場合は、上のリストのMTSearchConditionSectionタグのブロックと、その直前の<$mt:SearchConditionUnion op="or"$>のタグを省略します。
4.事例
例えば、以下のようなブログがあるとします。
- 1.記事にサブタイトルを付けるために、テキスト型のカスタムフィールドを追加しているとします。
- 2.1.のカスタムフィールドのベースネームは、「entry_subtitle」にしているとします。
- 3.タイトル/サブタイトルのどちらかに「Movable Type」を含むか、もしくは「Movable Type」のタグを付けているブログ記事を検索します。
まず、上記の条件を、前述の3-1.の手順に沿って、複数の条件に分解します。
実際に分解すると、3-1.の(a)~(d)のそれぞれに当てはまる条件は、以下の表のようになります。
パターン | 条件 |
---|---|
(a)ブログ記事のフィールド以外の1つのセクションだけで表せる条件 |
|
(a)ブログ記事のフィールドのセクションと、ブログ記事以外のセクションとのANDで表せる条件 | なし |
(c)ブログ記事のフィールド以外のセクションどうしのANDで表せる条件 | なし |
(d)ブログ記事のフィールドのセクションだけで表せる条件 | タイトルに「Movable Type」を含む |
まず、(a)の2つの条件を、それぞれMTSearchConditionsタグのブロックで表し、検索されたブログ記事のIDを、変数に代入します。
そして、それらのIDと、(d)の条件とのORを取ります。
(a)の2つの条件の結果を、それぞれ変数eid1/eid2に代入するとすれば、この検索条件は以下のようなテンプレートで表すことができます。
<mt:SearchConditions entry_ids="eid1"> <mt:SearchConditionCFSection field="entry_subtitle"> <$mt:SearchConditionCFLike values="Movable Type"$> </mt:SearchConditionCFSection> </mt:SearchConditions> <mt:SearchConditions entry_ids="eid2"> <mt:SearchConditionTagSection> <$mt:SearchConditionTag tag="Movable Type"$> </mt:SearchConditionTagSection> </mt:SearchConditions> <mt:SearchConditions> <$mt:SearchConditionValues field="id" values="$eid1"$> <$mt:SearchConditionUnion op="or"$> <$mt:SearchConditionValues field="id" values="$eid2"$> <$mt:SearchConditionUnion op="or"$> <mt:SearchConditionSection> <$mt:SearchConditionLike field="title" values="Movable Type"$> </mt:SearchConditionSection> </mt:SearchConditions>
1~5行目で、サブタイトルのカスタムフィールドに「Movable Type」を含むブログ記事を検索し、それらの記事のIDを、変数eid1に代入します。
次の6~10行目で、「Movable Type」のタグがついているブログ記事を検索し、それらの記事のIDを、変数eid2に代入します。
そして、残りの部分で、前述の2つの条件のどちらかを満たすブログ記事か、またはタイトルに「Movable Type」を含むブログ記事を検索します。
5.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」をぜひご利用ください
toitoi
こんにちは。
現在SearchEntriesプラグインを使わせていただき、簡単なCMSを構築しています。そこで質問させていただきます。
カスタムフィールド(ドロップダウン)を10個作成し、それぞれに名前を設定しました。
ドロップダウンの中身:田中太郎,鈴木一郎,山田花子,山本順子
最初の5個を、cf_1,cf_2,cf_3,cf_4,cf_5とし、
後の5個を、cf_6,cf_7,cf_8,cf_9,cf_10としました。
そこで、cf1~5のどれかに「田中太郎」が入力されていて、
かつ、cf6~10のどれかに「山田花子」が入力されている記事を検索したいのですがどのようにしたら良いでしょうか?
MT初心者なのでMT5標準のタグでは「or」を設定できず、SearchEntriesプラグインでならと思い使わせていだたいております。
何かアドバイスなどがありましたらご教授願いませんでしょうか。よろしくお願い致します。
壱からtoitoiへの返信
>toitoiさん
こんにちは。
ご質問の件ですが、以下のように書けばできるはずです。
toitoiからtoitoiへの返信
早速の返信ありがとうございます!
思ったとおりの結果が出せました。
SearchEntriesプラグインにはこれからも大変お世話になりそうです。
とてもすばらしいプラグインの数々を提供していただき、本当にありがとうございます。
自分でもプラグインが作成できるようMovable Type Developer's Guide Volume 1を見ながらがんばりたいと思います。
では、失礼します。
hiro
いつもお世話になっております。
一つご質問させていただきます。
ブログ記事に下記ソースを記述したとして、valuesやtagに対して各エントリーごとの値を動的に代入する方法を教えていただけないでしょうか。
すみませんがご教授いただきたくよろしくお願いします。
<mt:SearchConditions entry_ids="eid1">
<mt:SearchConditionCFSection field="entry_subtitle">
<$mt:SearchConditionCFLike values="※※※※"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid2">
<mt:SearchConditionTagSection>
<$mt:SearchConditionTag tag="※※※※"$>
</mt:SearchConditionTagSection>
</mt:SearchConditions>
<mt:SearchConditions>
<$mt:SearchConditionValues field="id" values="$eid1"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid2"$>
</mt:SearchConditions>
壱からhiroへの返信
>hiroさん
こんにちは。
「※※※※」が2か所ありますが、それらには、具体的にはどのような値を入れたいのでしょうか。
MTSearchConditionTagタグの方は、「対象のブログ記事についているのと同じタグ」を指定したいのだと思いますが、MTSearchConditionCFLikeタグに指定したい値が何なのかがはっきりしません。
hiro
早速のご返答ありがとうございます。
あいまいな書き方ですみません。
たとえば検索フォームに入力された値freewordsをvalueにして結果を表示したいと思いまして下記のように記述いたしました。
<mt:SearchConditions entry_ids="eid1">
<$mt:SearchConditionLike field="title" values="$qp_freewords"$>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid2">
<mt:SearchConditionCFSection field="titledirector">
<$mt:SearchConditionCFLike values="$qp_freewords"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
壱からhiroへの返信
>hiroさん
こんにちは。
valuesモディファイアに「$qp_freewords」を指定するのは正しいので、おそらくMTSearchConditionsタグの前にMTGetQueryParamsToVarsタグが抜けているのではないかと思います。
詳しくは、以下の記事を参照してください。
http://www.h-fj.com/blog/archives/2010/05/02-100257.php
hiro
お世話になっております。
アドバイスいただきありがとうございました。
ご指摘の通り、MTGetQueryParamsToVars が抜けておりました。
今後実装なさる方の参考までにソースを添付いたします。
検索クエリをfreewordsで受け取り、タイトル・本文・カスタムフィールド2つからのor検索でページ分割する際のサンプルです。
(個人的にmt:DivPagesCGILink のname="" の指定ミスでページ分割がうまくいかずにはまってしまいました。)
<$mt:GetQueryParamsToVars$>
<mt:If name="qp_first_time">
<$mt:SetVar name="count_only" value="dp_total_count"$>
<$mt:SetVar name="dp_per_page" value="12"$>
<$mt:SetVar name="dp_offset" value="0"$>
<mt:Else>
<$mt:SetVar name="set_only" value="0"$>
<mt:DivPagesInit>
</mt:If>
<mt:SearchConditions entry_ids="eid1">
<$mt:SearchConditionLike field="title" values="$qp_freewords"$>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid2">
<mt:SearchConditionCFSection field="titledirector">
<$mt:SearchConditionCFLike values="$qp_freewords"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid3">
<mt:SearchConditionCFSection field="titlecast">
<$mt:SearchConditionCFLike values="$qp_freewords"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid4">
<$mt:SearchConditionLike field="text" values="$qp_freewords"$>
</mt:SearchConditions>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
<$mt:SearchConditionValues field="id" values="$eid1"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid2"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid3"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid4"$>
<$mt:SearchLimit limit="$dp_per_page"$>
<$mt:SearchOffset offset="$dp_offset"$>
<mt:SetVar name="title_text" value="$qp_freewords" />
</mt:SearchConditions>
<mt:If name="qp_first_time">
<mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:If>
<mt:DivPagesIfMulti>
<ul class="resultNav">
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="詳細検索結果_フリー" build_params="1" name="freewords"$>&page=</mt:SetVarBlock>
<p>
<mt:DivPagesIfPrevPage>
<li class="back"><a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesPrevPageNumber$>">Back</a></li>
</mt:DivPagesIfPrevPage>
<mt:DivPagesLoop>
<mt:DivPagesIfCurPage>
<li><span><$mt:DivPagesNumber$></span></li>
<mt:Else>
<li><a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesNumber$>"><$mt:DivPagesNumber$></a></li>
</mt:DivPagesIfCurPage>
</mt:DivPagesLoop>
<mt:DivPagesIfNextPage>
<li class="next"><a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesNextPageNumber$>">Next</a></li>
</mt:DivPagesIfNextPage>
</ul>
</mt:DivPagesIfMulti>
<$mt:LoadSearchedEntries$>
<mt:IfNonZero tag="SearchLoadedEntryCount">
(以下結果表示のソース続きます。)
mt_co
いつも拝見させております。
検索結果が表示されずにこまっておりましたので、ご質問をさせて頂きました。
下記のような内容で構成していますが、検索フィールド(カスタムフィールド部分)に
何も入力せず、空の状態で検索すると、ブログ記事のフィールド部分に入力をしても、
検索結果がゼロと表示されてしまいます。
ここではentryextra1とentryextra2に相当する部分に何もテキストを入れず、
タイトルや本文フィールドに情報を入力すると検索結果がゼロとなってしまいます。
何か設定が間違っていないか、お教え頂ければ幸いです。
条件に合う記事が件ありました。
条件に合う記事がありませんでした。
mt_co
すみません。ソースコードを貼り付けようと思ったらエラーになりましたので、再度送付させていただきます。
いつも拝見させております。
検索結果が表示されずにこまっておりましたので、ご質問をさせて頂きました。
下記のような内容で構成していますが、検索フィールド(カスタムフィールド部分)に
何も入力せず、空の状態で検索すると、ブログ記事のフィールド部分に入力をしても、
検索結果がゼロと表示されてしまいます。
ここではentryextra1とentryextra2に相当する部分に何もテキストを入れず、
タイトルや本文フィールドに情報を入力すると検索結果がゼロとなってしまいます。
何か設定が間違っていないか、お教え頂ければ幸いです。
壱からmt_coへの返信
>mt_coさん
こんにちは。
テンプレートを拝見した感じでは、And検索とOr検索がごちゃまぜになっているように思います。
どのような条件で検索をしたいのかをお書きください。
mt_co
早速の返信ありがとうございます。
こちらで実現したいな、と思っていることは項目別検索(詳細検索)のような
ものを作成したいと考えております。
1)期間を指定(eid1の部分)
AND
2)カスタムフィールド(entryextra1)に入った内容(eid2の部分)
AND
3)カスタムフィールド(entryextra2)に入った内容(eid3の部分)
AND
4) タイトル
AND
5) 本文
AND
6) 追記
AND
7) キーワード
このような感じで項目内容同士でAND検索して絞り込めるようなそんな
検索結果をイメージしております。
壱からmt_coへの返信
>mt_coさん
こんにちは。
すべての条件をANDで結ぶなら、以下のようにすれば良いはずです。
なお、ブログ記事の標準のフィールドには「duration」という名前のものはないので、カスタムフィールドだと仮定しています。
mt_co
無事にできました!
検索条件の指定、混乱してゴチャゴチャになっていましたが、
シンプルに設定すれば良かったんですね。(^_^;)
また、mt:Ifによる空白フィールドの対応、素晴らしいですね!
ありがとうございました!
これからも宜しくおねがい申し上げます。
yas
いつも拝見させていただいています。
可能かどうかの質問です。
親カテゴリ1
子カテゴリ1
子カテゴリ2
子カテゴリ3
親カテゴリ2
子カテゴリ4
子カテゴリ5
子カテゴリ6
という場合
子カテゴリ1
AND
子カテゴリ4
OR
子カテゴリ5
OR
子カテゴリ6
という検索は可能でしょうか。
また逆パターンになった場合についても
可能かどうか教えて頂けると幸いです。
よろしくお願い致します。
さの
藤本様、いつもサイトと本を参考にさせて頂いております。
どうしても上手に検索結果が得られず、
ご質問させて頂きます。
以下の構造で絞込み検索を作りたいと考えております。
titleだけ入力した場合でもヒットせず困っております。
絞り込み検索の場合は入力されなかった場合、
すべて表示といったことも可能でしょうか?
お忙しいところすみませんが、
よろしくお願い致します。
結果
壱からさのへの返信
>さのさん
こんにちは。
結果のテンプレートを書き換え、以下の赤字の部分を追加して、フォームでアーティストを入力していなければ、その検索条件を使わないようにすれば良いはずです。
さのからさのへの返信
藤本様
ありがとうございます!
ご指摘の通り設定したところ理想の動きになりました。
何度もご親切にご対応頂き本当にありがとうございます。
sano
藤本様
何度もすみません、どうしてもできずご教授いただけますでしょうか?
カスタムフィールドのor検索をしたく。
1つの値から2箇所のカスタムフィールドを検索し、いずれかに入っていたら表示としたいのですが下記の用に記述したのですがうまく動かず・・・。
お忙しいところすみませんが、間違っている部分など教えて頂けますでしょうか?
さの
藤本様
何度もすみません、どうしてもできずご教授いただけますでしょうか?
カスタムフィールドのor検索をしたく。
1つの値から2箇所のカスタムフィールドを検索し、いずれかに入っていたら表示としたいのですが下記の用に記述したのですがうまく動かず・・・。
お忙しいところすみませんが、間違っている部分など教えて頂けますでしょうか?
壱からさのへの返信
>さのさん
こんにちは。
おそらく以下で希望の動作になると思います。
さのからさのへの返信
藤本様
ありがとうございます!
今回もちゃんと動きました。
度々申し訳ございません!今回このプラグインがなかったら
サイトが制作できませんでした!ありがとうございます!