検索条件を変えるなら、pre_get_postsが便利
所沢市でホームページ制作、欧州輸入品の販売などを行っているRishunTradingです。Wordpressで「カスタム投稿」を宣言し、そのカスタム投稿のデータを取得して一覧表示するような場合、もし、表示する条件(検索条件)を変えたい場合、どのようにしていますか。もちろん、archive-(post_type名).phpの中で検索条件を再設定して再度検索して表示しても良いのですが、ページングの処理なども考慮すると、コーディングの量も増え、ちょっと複雑になってきます。
出来ない事はないのですが、そんな時には、pre_get_postsを知っておくと便利です。
メインクエリについて
WordPressでは、ウェブページに表示するときに、データベースにアクセスして記事データを取得しています。この記事データが格納されたオブジェクトをメインクエリといいます。
メインクエリは、表示するウェブページにあった記事データ(アーカイブページ、投稿ページ、固定ページなど)を格納しており、例えばアーカイブページでは、メインクエリには投稿の記事一覧が格納されており、while文だけですべての投稿を呼び出す事ができます。
アーカイブページ(archive-xxxx.phpなど)
1 2 3 4 5 6 7 8 9 10 11 12 | if(have_posts()): //メインクエリにデータ有り while ( have_posts() ) : the_post(); //繰り返し処理 endwhile; else: //メインクエリにデータ無し endif; |
アーカイブページの条件を変える
例えば、自分が作成したあるカスタム投稿だけ、1ページ辺りに表示できる件数をデフォルトの件数から6件に変更したいような場合には、WP_Queryを使い、以下のような形でアーカイブファイル(archive-XXXX.php)で呼び出せば、実現する事ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $arg = array( 'post_type' => '(カスタム投稿名)'; 'posts_per_page' => 6, ); $wp_query = new WP_Query($arg); if(have_posts()): //クエリにデータ有り while ( have_posts() ) : the_post(); //繰り返し処理 endwhile; else: //メインクエリにデータ無し endif; |
ただ、実際はこんなに単純ではありません。ページングの処理を意識しなければなりませんので、$argで引き渡すパラメーターには、paged(現在の表示しているページ)や、または、offset(何件目から取得するか)を渡す必要があります。
(込み入った条件文やカスタマイズなどでは、このようなやり方もあるかと思います。)
pre_get_postsの使い方
前述したテンプレートファイルに直接記載する方法とは違い、pre_get_postsを使うと、functions.phpにまとめて該当の条件だけを記載する事になりますので、わかりやすいです。
1 2 3 4 5 6 7 8 9 | add_action('pre_get_posts', 'my_pre_get_posts'); function my_pre_get_posts($query){ if ( is_admin() || ! $query->is_main_query() ) { return ; } //条件 } |
3行目のif文について簡単に解説しておきます。pre_get_postsは管理画面を表示する際やサブクエリでも呼ばれます。そのため管理画面で適用されないように、is_admin()で管理画面かどうかを確認しています。また同様に、サブクエリで適用されないように、is_main_query()でメインクエリかどうか確認しています。
例えば、自分で作成したカスタム投稿(column:コラム)だけ、1ページ辺り6件づつ表示したいような場合は以下のように記載します。
1 2 3 4 5 6 7 8 9 10 | add_action('pre_get_posts', 'my_pre_get_posts'); function my_pre_get_posts ( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return ; } if($query->is_post_type_archive( 'column' ) ){ $query->set( 'posts_per_page', '6' ); return ; } } |
条件の書き方は、get_posts()とほぼ同じですので、以下のような条件の記載もできます。
コラム(post_type=column)のカテゴリ(taxonomy=tax_category)がwordpressの記事だけを取得する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | add_action('pre_get_posts', ' my_pre_get_posts '); function my_pre_get_posts ( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return ; } if($query->is_post_type_archive( 'column' ) ){ $meta_query = array(array( 'taxonomy'=>'tax_category', 'field'=>'slug', 'terms'=>'wordpress' ); $query->set( 'posts_per_page', '6' ); $query->set(‘meta_query’, $meta_query); return ; } } |
まとめ
pre_get_postsの使い方を知っていると、コーディング量が減りますので、是非ご参考にして見て下さい。
WEB DESIGN全てお任せ!ホームページ制作
RishunTradingでは、日本にはないコンセプトや高いデザイン性をもったヨーロッパ製品の輸入販売、及び、Webサイト制作事業などをおこなっております。
「全てお任せ!ホームページ制作」は、ドメイン取得からサーバー設定、レスポンシブルデザイン(スマホ、タブレット対応)、SEO対策がすべて含まれたお得なホームページを制作するサービス商品です。
運用開始後に「Webサイト運用管理サービス(保守)」と組み合わせて購入しますと、メンテナンス、更新も含めてすべて弊社で実施しますので、お客様は安心して本業に集中する事ができます。
しかもなんと、「全てお任せ!ホームページ制作」は、¥100,000!で提供しております。
本業が忙しい中小企業様に大変ご好評を頂いている商品です。
独自ドメイン取得
サーバー開設&設定
レイアウト設計
レスポンシブルデザイン
(*1)検索エンジン最適化
(SEO対策)場所Maps
お問い合わせフォーム
SSL化
各種SNS連携
運用マニュアル