拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
ブログ記事詳細検索プラグイン(その30・検索結果のページ分割/動的な検索の場合)
SearchEntriesプラグインを、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせると、検索フォームでの動的な検索結果もページ分割することもできます。
1.検索フォームの作り方
検索フォームの作り方は、これまでに解説してきた方法とほぼ同じです。
ただし、フォーム(<form・・・>~</form>)の中に、以下のタグを追加する必要があります。
<input type="hidden" name="first_time" value="1" />
例えば、ブログ記事のタイトルで検索するフォームを作る場合だと、以下のようにform要素の部分を作ります。
<form name="srh" method="get" action="<$mt:RealtimeRebuildCGIPath$>"> <p> <label for="title">キーワード</label><br /> <input type="text" id="title" name="title" /> </p> <p> <input type="submit" name="submit" value="送信" /> </p> <input type="hidden" name="blog_id" value="<$mt:BlogID$>" /> <input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="詳細検索結果"$>" /> <input type="hidden" name="first_time" value="1" /> </form>
なお、このフォームを含むテンプレートの例は、以下のリンクからダウンロードすることができます。
2.検索結果テンプレートの作り方
次に、これまでの動的検索と同様に、検索結果を出力するためにテンプレートモジュールを作成し、その中にSearchConditionsタグのブロック等を入れます。
ページ分割を行う場合、検索結果テンプレートの中で、検索を行う部分は、以下のように書きます。
<$mt:GetQueryParamsToVars$> <mt:If name="qp_first_time"> <$mt:SetVar name="count_only" value="dp_total_count"$> <$mt:SetVar name="dp_per_page" value="1ページあたりの出力件数"$> <$mt:SetVar name="dp_offset" value="0"$> <mt:Else> <$mt:SetVar name="set_only" value="1"$> <mt:DivPagesInit> </mt:If> <mt:SearchConditions count_only="$count_only" set_only="$set_only"> 検索条件を表すテンプレートタグ <$mt:SearchLimit limit="$dp_per_page"$> <$mt:SearchOffset offset="$dp_offset"$> </mt:SearchConditions> <mt:If name="qp_first_time"> <mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count"> </mt:If>
4行目の「1ページあたりの出力件数」の箇所で、検索結果の1ページに出力するブログ記事の件数を指定します。
また、11行目の「検索条件を表すテンプレートタグ」の部分に、MTSearchCondition系の各種のタグを書いて、検索条件を指定します。
例えば、以下のような場合を考えます。
- 手順1.のフォームのように、ブログ記事のタイトルで検索したいとします。
- タイトルの入力欄のname属性を「title」にしているとします。
- 検索結果は1ページあたり10件ずつ出力したいとします。
この場合、検索を行う部分は以下のように書きます。
<$mt:GetQueryParamsToVars$> <mt:If name="qp_first_time"> <$mt:SetVar name="count_only" value="dp_total_count"$> <$mt:SetVar name="dp_per_page" value="10"$> <$mt:SetVar name="dp_offset" value="0"$> <mt:Else> <$mt:SetVar name="set_only" value="1"$> <mt:DivPagesInit> </mt:If> <mt:SearchConditions count_only="$count_only" set_only="$set_only"> <$mt:SearchConditionLike field="title" values="$qp_title"$> <$mt:SearchLimit limit="$dp_per_page"$> <$mt:SearchOffset offset="$dp_offset"$> </mt:SearchConditions> <mt:If name="qp_first_time"> <mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count"> </mt:If>
3.検索結果の出力
検索結果を出力する方法は、静的に検索してページ分割する場合と同じです。
具体的な手順は、静的なページ分割の場合の「3.検索結果の出力」を参照してください。
4.ページ移動リンクの出力
ページ移動リンクを出力する方法は、静的に検索してページ分割する場合とほぼ同じです。
具体的な手順は、静的なページ分割の場合の「4.ページ移動リンクの出力」を参照してください。
だたし、リンクのアドレスを変数に代入する処理が、以下のように変わります。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" build_params="1" name="検索フォームの各要素のname属性"$>&page=</mt:SetVarBlock>
「検索フォームの各要素のname属性」の部分には、検索フォーム内で検索条件の入力に使っている各要素のname属性を、コンマで区切って並べます。
また、「テンプレート名」には、検索結果表示テンプレートの名前を入れます。
例えば、手順1.の検索フォームだと、検索フォーム内には、キーワードを入力する欄があり、そのname属性が「title」になっています。
検索結果を「詳細検索結果」というテンプレートに沿って出力するなら、MTSetVarBlockタグを以下のように書きます。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="詳細検索結果" build_params="1" name="title"$>&page=</mt:SetVarBlock>
なお、手順2.~手順4.を含む検索結果テンプレートの例は、以下のリンクからダウンロードすることができます。
5.リアルタイム再構築の許可
テンプレートを作り終わったら、検索結果テンプレートのリアルタイム再構築を許可します。
手順は以下の通りです。
- ブログの「ツール」→「プラグイン」メニューを選びます。
- プラグイン一覧の中で、「RealtimeRebuild」の「設定」のタブを開きます。
- 「再構築を許可するテンプレート」の欄で、ここまでで作った検索結果テンプレートのチェックをオンにします。
- 「変更を保存」ボタンをクリックします。
6.検索結果ページのキャッシュ
静的な検索結果をページ分割する場合と同様に、検索フォームを使った検索結果をページ分割する場合でも、検索結果のページをキャッシュすることができます。
ただし、その手順は静的な検索結果のページ分割とはやや異なります。
手順は後日解説します。
7.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」をぜひご利用ください
SH
藤本様
いつもお世話になっております。
質問なのですが、動的分割を試したのですが、firefoxだと表示がおかしくなる…と言う事は考えられますでしょうか?
他タブブラウザ等ではきちんと動作するのですがfirefoxのみ件数表示とページ分割が正常に動かないような…
当方のミスでしたら申し訳ありません。お手間を取らせますがご教授願います。
壱
>SHさん
こんにちは。
ご質問の件ですが、こちらで試した限りは、Webブラウザに関係なく同じ検索結果を得ることができています。
テンプレートの組み方をもう一度ご確認ください。
SH
藤本様
確認してみたところ、解決致しました。テンプレートの問題ではなかった様なのですが、翌日確認した所なぜかきちんと動いていましたwお忙しいところ迅速な回答ありがとうございました。今後ともよろしくお願い致します。
maru
SearchEntriesプラグインを大変便利につかわせていただいております
検索のテストを作っており、検索と検索結果は無事に動作し、ページ分割もできているのですが、「ページ移動リンクの出力」をテンプレートに入れると、
テンプレートでエラーが見つかりました。
は存在しません
と言われてしまいます。
検索部分はインデックステンプレート、検索結果部分はテンプレートモジュールで作成しています。
maruからmaruへの返信
すいません。タグを入れたら表記されていませんでした。
エラーは「DivPagesCGILinkは存在しません」です。
お忙しいところ申し訳ありませんが、よろしくお願いします。
>SearchEntriesプラグインを大変便利につかわせていただいております
>
>検索のテストを作っており、検索と検索結果は無事に動作し、ページ分割もできているのですが、「ページ移動リンクの出力」をテンプレートに入れると、
>テンプレートでエラーが見つかりました。
>は存在しません
>と言われてしまいます。
>
>検索部分はインデックステンプレート、検索結果部分はテンプレートモジュールで作成しています。
壱からmaruへの返信
>maruさん
こんにちは。
DivPagesプラグインのダウンロードのリンクが古いままになっていました。申し訳ありません。
最新版をダウンロードしてお使いください。
http://www.h-fj.com/mt_plugin/DivPages_1_21.zip
maruからmaruへの返信
了解しました。
早速試してみます。
maru
DivPages_1_21.zipを使ってみました。
実はMTのバージョンが4.25だったため上手くいきませんでしたが、MTOS活用テクニックを再度見直し、アレンジして使用させていただいた結果、上手くページ分割して表示することができました。
最初からもっと良く本を見て作業するべきでした。
お手間をおかけし、申し訳ありません。
ありがとうございました。
みや
いつもお世話になっております。
「ページ移動リンクの出力」をテンプレートに入れると以下のエラーが表示されます。
Realtime Rebuild 1.62再構築に失敗しました。 : Can't locate object method "invoke_handler" via package "MT::Template::Context" at /var/www/home/●●/public_html/●●/mt4/plugins/RealtimeRebuild/../../plugins/DivPages/DivPages.pl line 571.
テンプレートは以下のように作成しております。
検索フォーム:テンプレートウィジェット
検索結果:テンプレートモジュール
MTのバージョンは4.2です。
ご教授頂ければ幸いです。
壱
>みやさん
こんにちは。
現状のDivPagesプラグイン(バージョン1.21)は、MT4.xには対応していません(MT5.xの新しいプログラム記法を使っているため)。
DivPages.plの184行目/467行目/571行目にある「$ctx->invoke_handler」を「$ctx->tag」に書き換えれば,
MT4.xでも動作すると思います。
ただし、動作保障はできません。
みやから壱への返信
藤本様
早速のご返信ありがとうございます。
教えて頂いたとおり修正しましたところ問題なく動作しました。
ありがとうございました。
mayona
お世話になります。
動的処理の検索結果をテストしており、ページ分割部分のリンクのみうまくいきません。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" tmpl_type="index"$>&page=</mt:SetVarBlock>
こちらを入れると、1ページは分割件数/検索処理ともに問題ありませんが、2ページ目以降も1ページと同じものがリストされてしまいます。
ちなみに以下の記述も試そうと思いましたが、
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" build_params="1" name="title"$>&page=</mt:SetVarBlock>
検索窓からのリンクではなく、ページ内の処理で完結した処理なので、name="●●●●"の部分に該当するものがありません。
こういった場合は、どう記述しておけば良いのでしょうか。
テンプレート上で分割させていますので、私の場合はこちらの記述のはずなのですが。。
こちらの記述部分がネックだと思いますが、うまくコツをつかめていません。。。
おかしそうなところがあれば、ご指摘いただけると助かります。
壱
>mayonaさん
こんにちは。
ご質問の件ですが、うまくいかないテンプレートを丸ごと送っていただくことはできないでしょうか。
mayona
壱さま
ありがとうございます!
以下、ソースです。
手を加えた箇所に★を付けました。
<MTDate format="%Y%m%d" setvar="date">★
<MTIfRealtimeRebuild>
<MTSetVar name="set_only" value="1">
<MTDivPagesInit>
<MTElse>
<MTSetVar name="count_only" value="dp_total_count">
<MTSetVar name="dp_per_page" value="15">
<MTSetVar name="dp_offset" value="0">
</MTIfRealtimeRebuild>
<MTSearchConditions count_only="$count_only" set_only="$set_only">
<MTSearchConditionCFSection field="カスタムフィールドのベースネームを入れました">★
<MTSearchConditionCFCompare ge="$date">★
</MTSearchConditionCFSection>★
<MTSearchLimit limit="$dp_per_page">
<MTSearchOffset offset="$dp_offset">
</MTSearchConditions>
<MTIfNoRealtimeRebuild>
<MTDivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</MTIfNoRealtimeRebuild>
<ul><MTLoadSearchedEntries>★
<MTIfNonZero tag="SearchLoadedEntryCount">
<MTEntries><li><a href="<MTEntryPermalink>"><MTEntryTitle></a></li></MTEntries>★
</MTIfNonZero></ul>★
<MTDivPagesIfMulti>
<MTSetVarBlock name="pager_link"><MTDivPagesCGILink tmpl_name="テンプレート名を入れました" tmpl_type="index">&page=</MTSetVarBlock>★
<p>
<MTDivPagesIfPrevPage>
<a href="<MTGetVar name="pager_link">1">« 最初</a>
<a href="<MTGetVar name="pager_link"><MTDivPagesPrevPageNumber>">< 前</a>
</MTDivPagesIfPrevPage>
<MTDivPagesLoop>
<MTDivPagesIfCurPage>
<MTDivPagesNumber>
<MTElse>
<a href="<MTGetVar name="pager_link"><MTDivPagesNumber>"><MTDivPagesNumber></a>
</MTDivPagesIfCurPage>
</MTDivPagesLoop>
<MTDivPagesIfNextPage>
<a href="<MTGetVar name="pager_link"><MTDivPagesNextPageNumber>">次 ></a>
<a href="<MTGetVar name="pager_link"><MTDivPagesLastPageNumber>">最後 »</a>
</MTDivPagesIfNextPage>
</p>
</MTDivPagesIfMulti>
壱からmayonaへの返信
>mayonaさん
こんにちは。
いただいたテンプレートで、特に問題はないはずです。
ちなみに、こちらで以下のようなテンプレートを組んで動作を試してみましたが、問題なく動作しました。
sasak0416
はじめまして。
すばらしい検索プラグインだと思い、使わせていただこうと思いましたが、MT 5.12でプラグインを設置語に下記URLを参考にDBI.pmを書き換えてみたところ
http://www.h-fj.com/blog/archives/2011/08/24-112903.php
---
Got an error: Global symbol "$tbl" requires explicit package name
---
と表示されてしまうのですが、何か原因は考えられますでしょうか?
どうかご回答宜しくお願いいたします。
mayonaからmayonaへの返信
壱さま
ソースのご提供ありがとうございました!
テストしてみたところ、いただいたものでも同じ挙動(2ページ目以降も1ページと同じものがリストされる状態)でした。
/cgi-bin/plugins/RealtimeRebuild/mt-realtime-rebuild.cgi?blog_id=2&tmpl_id=128&per_page=15&total_count=32&page=2
2ページ目のリンクもこんな感じですので、特に異常は無さそうなんですが。。。
ソース云々ではないような気がしますので、見直してみます。