特定の値、特定のカテゴリーをフィルターするなら超簡単なのだが…チョット工夫するのは難しい…それがCustom Query Filter、カスタムクエリーフィルター
Elementorで、投稿・ポストをフィルタリングして表示、いわゆるQueryで指定できるオプションは下記参照。
- 取得方法
通常は「投稿」を選べば問題ないが、カスタム投稿の場合は、セレクトメニュ-からカスタム投稿名を選択する。 - INCLUDE/EXCLUDE
参照する条件「INCLUDE」、除外する「EXCLUDE」のどちらかを選択する。
まあ、通常は「INCLUDE」を利用がメインであろう。 - Include By
Term(カテゴリー、タグを設定してフィルタリング可能)
Author(寄稿者アカウントでフィルタリング) - EXCLUDEに設定するとAvoid Duplicates(重複投稿の非表示)、Offset(先頭から除外する投稿の数)の設定ができる。
- Date
Past Day(過去1日)
Past Week(過去1週間)
past Month(過去1カ月)
past Quarter(過去3カ月)
past Year(過去1年)
カスタム(開始と終了で期間を設定) - Order By
Date(日時でソート)
タイトル(タイトルでソート)
Menu Order(プラグインMenu Orderの設定を利用する)
ランダム(ランダムに表示) - Order
DECS(降順)
ACS(昇順) - Ignore Sticky Posts
先頭の固定ポストを無視する
こうして復習…振り返りをしてみると、いろんな設定がそろっており、カテゴリーやタグを使えば、この機能で十分な場合も多いと思われるが…やはりカスタムフィールドでフィルター&ソートができて欲しい!Elementorはデフォでは投稿一覧ではカスタムフィールドは表示ができず、かつカスタムフィールドでのフィルター&ソートができない!
そんなときに役立つのが何回もとりあげてる、Custom Query Filterなのだ!
Custom Query Filterの基本の基本もおさえておく!
下記は基本の形。「my_custom_filter」がユーザー自身が命名するクエリーの名称。もちろんショートコードのように、ひとつのWordPress内ではユニークにする必要がある。このクエリー名称をElementor編集ページの「Query」の「Query ID」に入力しておくと、ポスト、投稿リストが、自作のクエリーで表示されるという寸法。
add_action( 'elementor/query/my_custom_filter', function( $query ) {
// ここに表示したい検索クエリーを書く!
} );
下記のようにすると、デフォの投稿とカスタム投稿「custom-post-blog」の両方を参照した投稿一覧が作成できる。
add_action( 'elementor/query/my_custom_filter', function( $query ) {
$query->set( 'post_type', [ 'post', 'custom-post-blog' ] );
} );
条件が複数ある場合は追記すればいいだけ。2行目の「query->set」はカテゴリーID「5」を除外して作成するということ。
add_action( 'elementor/query/my_custom_filter', function( $query ) {
$query->set( 'post_type', [ 'post', 'custom-post-blog' ] );
$query->set( 'cat', '-5' );
} );
Custom Query Filterの応用編 条件を追加 並び変え ついでに文字列検索
まあ、抽出・フィルタリングしたらソートしたくなるのが心情。最後の2行はタイトルで昇順でソートするという内容になっている。
add_action( 'elementor/query/my_custom_filter', function( $query ) {
$query->set( 'post_type', [ 'post', 'custom-post-blog' ] );
$query->set( 'cat', '-5' );
$query->set( 'orderby', 'title' ); // ソートで利用するパラメータ
$query->set( 'order', 'ASC' ); // 昇順でソート
} );
でもって、以上でも素晴らしい機能なんだけど、やはり、カスタムフィールドを使ったフィルタリングとソートが可能というのが、もっとも特筆すべき点だろう。これができれば最強じゃないですか!ノーコードじゃないけどね!
でもって下記がカスタムフィールドを利用する場合の例。とはいいつつも前半で、このクエリーがあるページ、あるいは投稿と同じタグがある投稿のみを取得する設定をしている。そして最後にカスタムフィールドの「theme_number」を数値として昇順でソートさせている。
カスタムクエリーフィルターとは呼んでいても、中身はPHPなので、検索クエリー以外のコードも書ける。いや、本当に可能性を感じるでしょう!Custom Query Filter! しつこいようだが、ノーコードじゃなくなるけどね。
add_action( 'elementor/query/limitpost', function( $query ) {
$tag_objects = get_the_tags();
foreach( $tag_objects as $temp_tag) {
$tag_slugs[] = $temp_tag->slug;
}
$query->set( 'tag_slug__in', $tag_slugs );
$query->set( 'post_type', 'post' );
$query->set( 'meta_key', 'theme_number' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
} );
でもって最後は特定キーワードの検索をするCustom Query Filter。下記はカスタムフィールド「product_neme」に「電子レンジ」が含まれる投稿をカスタムフィールド「product_price」で昇順でソートした内容を返すカスタムクエリーフィルター。
ここを見て、オヤッと思う諸兄。そうなんです。比較演算子「LIKE」が出てきた!
add_action( 'elementor/query/theme_list_cs', function( $query ) {
$query->set( 'post_type', 'post' );
$query->set( 'meta_query',array( 'key'=>'product_name',
'value'=>'電子レンジ',
'compare'=>'LIKE' ) );
$query->set( 'meta_key', 'product_price' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
});
カスタムクエリーフィルター内で利用できる比較演算子はLIKEだけでなく下記のものが用意されている。
- LIKE(指定した文字列に一致)
- NOT LIKE(指定した文字列に一致しない)
- IN(配列で指定した値のどれかに一致)
- NOT IN(配列で指定した値に一致しない)
- BETWEEN(2つの値で指定した範囲)
- NOT BETWEEN(2つの値で指定した範囲外)
カスタムフィールドが利用できて、比較演算子も使えたら…これはもう何も必要ないでしょう。タグを使ってフィルタリングをするとしても、フィルタリングのためのタグ付けを投稿ひとつひとつに設定する必要がある。この状態で何か新たにクライアントに要求されて、最初からタグ付けがし直し…なんてことも想定できる。
となると、タイトルやカテゴリーから、あるいは追加したカスタムフィールドの値を使ってCustom Query Filterを利用するのが最適かと思う。できるだけ投稿全体に新しい追加処理をしないですますのもテクニック、発想だと思う管理人であった。
するってぇとやっぱり、作業の序盤ではCustom Query Filterを使っての作業を想定しておいて間違いないんではないだろうか!