一緒に悩み、考える。
つくるだけでなく、
そのあとの物語も、ともに。

どんな会社もサービスも、それぞれにストーリーがあります。
花のやはそれをサポートしながら、お客様の成長を隣で見ていたいのです。

一緒に悩み、考える。
つくるだけでなく、
そのあとの物語も、ともに。

どんな会社もサービスも、
それぞれにストーリーがあります。
花のやはそれをサポートしながら、
お客様の成長を隣で見ていたいのです。

ブログBLOG

  1. 名古屋のホームページ制作会社 花のや
  2. 花のやブログ
  3. is_main_queryとpre_get_postsについて
2013/12/26Web制作WordPress

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がまるっと必要なくなるという点です。

20131210

さらに、ページナビゲーションをつけていた場合も今までは新しく取得しなおしたクエリを渡してー

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');

ということも簡単にできてしまいます。
(権限自体ある場合パラメーターを直接書き換えたら触れるんですけどね)

この記事を書いた人:wada

エンジニア担当の和田です。 漆を塗ったりしていましたが最終的にプログラマーへと転職してしまいました。

LINEで送る
Pocket

人気記事ランキング

お問い合わせ

Webサイト制作・その他お仕事のご依頼、
ご相談についてお気軽にお問い合わせください。

  • ホームページ制作で”補助金・助成金”使えます!
  • WEBに関する無料個別相談会
株式会社 花のや
〒460-0008
愛知県名古屋市中区栄2-14-5 山本屋本店栄ビル7階

花のやについて

お仕事のご依頼やご相談は、下記の電話番号
または、メールフォームよりお問い合わせください。
TEL.052-211-9898 / FAX.052-211-9899

お問い合わせ