技術と経験で、価値のあるホームページ制作を。ホームページ制作を通じて、お客様に利益をもたらすことを追求します。

技術と経験で、価値のあるホームページ制作を。ホームページ制作を通じて、お客様に利益をもたらすことを追求します。

ブログ

HOME > 花のやブログ > is_main_queryとpre_get_postsについて
2013/12/26ホームページ制作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

書いた人:wada

エンジニア担当の和田です。
ボウリングの機械のメカニックから、漆を塗ったりトラックの運転手をしたりと
紆余曲折ありましたが最終的にプログラマーへと転職してしまいました。

人気記事ランキング

株式会社 花のや
〒460-0011
愛知県名古屋市中区大須4-1-79 第2ハヤシビル 3F

花のやについて

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

お問い合わせ