「 複数の条件を指定可能なウェブサイト内検索 | PowerCMS X」にて解説されているダイナミック・パブリッシングを利用した検索で独自の絞り込み条件を利用したい場合のカスタマイズ方法をご紹介します。
例えば、select要素で選択した年月で記事を絞り込みを行いたいケースです。select要素(name属性値がrelease_month)で「2023年10月」を選択した場合に公開日が2023年10月1日〜2023年10月31日の間にある記事を抽出するには、プラグインを準備して記事(entry)モデルのpre_listingコールバックの第3引数$terms
に条件を追加設定します。
public function pre_listing_entry( $cb, $app, &$terms, &$args, &$extra, &$ex_vals ) {
// pt-view.phpの時だけ処理を継続
if ( $app->id !== 'Bootstrapper' ) {
return;
}
$release_month = $app->param( 'release_month' ); // 年月を受け取る
if ( ! empty( $release_month ) && preg_match( '/^\d{4}-\d{2}$/', $release_month ) ) {
$date = date_create( "{$release_month}-01" );
$date->modify('last day of this month'); // 月の最終日を算出
$terms[ 'published_on' ] = [ 'BETWEEN' => [
"{$release_month}-01 00:00:00",
$date->format('Y-m-d') . ' 23:59:59',
] ];
}
}
$terms
をカスタマイズして独自の絞り込みを行う(抽出条件を変更する)ことはよく使うので覚えておくと良いでしょう。テキストデータが入ったカラムを収集してフリーワード検索(Like検索)を行う実装事例などがあります。プラグイン作成については「
プラグインのスケルトンの作成 (PluginStarterプラグイン) | PowerCMS X」も参考になるかと思います。
その他、$extra
・$ex_vals
を利用して独自のクエリ(SQL)を書くことで高度なカスタマイズも実現可能です。このサイトの検索機能もpre_listingコールバックをカスタマイズして実現しています。
NetHeroes.phpを公開していますのでご参照ください。