一緒に悩み、考える。
つくるだけでなく、
そのあとの物語も、ともに。
どんな会社もサービスも、それぞれにストーリーがあります。
花のやはそれをサポートしながら、お客様の成長を隣で見ていたいのです。
一緒に悩み、考える。
つくるだけでなく、
そのあとの物語も、ともに。
どんな会社もサービスも、
それぞれにストーリーがあります。
花のやはそれをサポートしながら、
お客様の成長を隣で見ていたいのです。
ブログBLOG
- 名古屋のホームページ制作会社 花のや
- 花のやブログ
- is_main_queryとpre_get_postsについて
is_main_queryとpre_get_postsについて
wordpress3.3から実装されたis_main_queryという関数のおかげでpre_get_postsフィルター全盛期になりましたが、いったい何がいいの?と、どうすればいいの?ということを少しだけ掘り下げて説明していきます。
pre_get_postsのメリット
・テーマファイルが汚くならない
・DBクエリが多重発行されない
・メインクエリを元に戻す手間が省ける
・phpも余計なコストがかからない
・他にもいろいろあるよ
といいことづくめです。
今迄よく使用されていたget_postsやquery_posts、WP_Queryクラスでは
1.デフォルトで表示されるべき投稿を最初にデータベースから読み込んだうえで
2.本文の部分に差し掛かった時に無理やり目的の情報をデータベースから取得し直して表示していました。
pre_get_postsを使用すると1の部分で目的の情報をデータベースに問い合わせて取得するので
2がまるっと必要なくなるという点です。
さらに、ページナビゲーションをつけていた場合も今までは新しく取得しなおしたクエリを渡してー
if(function_exists('wp_pagenavi')) wp_pagenavi(array('query' => $my_query));
という形をとっていましたが、デフォルトで取得したデータ自体が目的のデータなのでそのような手間はかけず
if(function_exists('wp_pagenavi')) wp_pagenavi();
だけで問題なくページングしてくれます。
もちろん、デフォルトの表示部分以外では今まで同様get_postsやquery_postsなどを使用して取得・表示する必要はあります。
運用例
さて、このようなメリットだらけのpre_get_postsとis_main_queryですがまずは通常の用例として
function my_default_query($wp_query) { if (is_admin()) return; if ($wp_query->is_main_query() && $wp_query->is_home()) { $wp_query->set('post_type','my_type'); $wp_query->set('posts_per_page',6); } } add_action('pre_get_posts','my_default_query');
このような形が挙げられます。
L2~3で管理画面の場合を除外
4行目でメインクエリ、且つ、TOPページかどうかの判定をして
trueであればmy_typeというカスタム投稿を6件取得という形になっています
で、この2~3行目で管理画面の場合を除外の部分に目を向けて
ここを触ってしまえば
・管理者以外、一部のカスタム投稿は自分の投稿のみしか管理画面の一覧で表示させない
function my_default_query($wp_query) { if (is_admin()){ $post_type = $wp_query->get('post_type'); $user = wp_get_current_user(); if(!current_user_can('level_10') && $post_type == 'my_post_type'){ $wp_query->set('author', $user->ID); } } } add_action('pre_get_posts','my_default_query');
・固定ページのこの記事はある部品として使っているので管理者しか触らせたくない
function my_default_query($wp_query) { if (is_admin()){ $post_type = $wp_query->get('post_type'); if(!current_user_can('level_10') && $post_type == 'page'){ $wp_query->set('post__not_in',array(100,200,300)); } } } add_action('pre_get_posts','my_default_query');
ということも簡単にできてしまいます。
(権限自体ある場合パラメーターを直接書き換えたら触れるんですけどね)
人気記事ランキング
カテゴリ
書いた人別一覧
お問い合わせ
Webサイト制作・その他お仕事のご依頼、
ご相談についてお気軽にお問い合わせください。
052-211-9898