クエリについて
クエリの概念がわかりづらいので、丁寧に説明していきます。 クエリとは、WordPress内でどのようにループを行うのか指定する命令です。
クエリとメインクエリがあります。 WordPress標準で備わっているのがメインクエリです。
メインクエリ
メインクエリは表示しているページによって動きが変化します。
例えばindex.phpでは表示設定で入力した数字だけループを行います。 single.phpでは1度だけループし、カテゴリページではカテゴリ指定した記事のみを自動的にループしてくれる仕組みが最初から備わっているわけです。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!--?php if(have_posts()): //もし投稿があるのなら while(have_posts()): //次の記事があれば調べます the_post();// 次の記事を取得します。 ?--> 個々の記事がループする <!--?php endwhile; endif; ?--> |
サブクエリ
メインクエリ以外にループさせたいものがあった場合(例えばサイドバーに最新の記事一覧を表示させる等です。)、新しくクエリを自作しなくてはなりません。そこで使用するのはWP_Queryです。
サブクエリのサンプルです。
1 2 3 4 5 6 7 8 |
$args = array( 'post_type' => 'post' 'posts_per_page' => 5, ); $the_query = new WP_Query( $args ); while ( $the_query->have_posts() ) : $the_query->the_post(); the_title(); endwhile; |
一行ずつ見ていきます。
1 |
$args = array( 'post_type' => 'post' ); |
どんなループを作るのか、決めて$argsに代入しています。
ちょいちょい忘れる『WP_Query』の使い方 | 予習と復習で、どのループをどんなふうに作るか わかりやすいと思います。 膨大にありますが、この組み合わせでWPのコンテンツをどのように見せていくのかが肝になって行きます。ここではposttypeで投稿記事だけを、postsper_pageで5だけ繰り返すと指定しています。
1 |
$the_query = new WP_Query( $args ); |
ここで$argsの入ったクエリを新たに作る宣言をしています。 その塊を$the_queryに代入しています。
1 |
while ( $the_query->have_posts() ) : |
while文でどれだけの間ループを繰り返すのかを決めています。この場合$the_queryの回数分、記事があるだけ繰り返す、という意味になります。
1 |
the_title(); |
は単一のタイトルの表示を示します。
1 |
endwhile; |
ここで、条件以外になったらループをやめます。
参考
WordPressで押さえておきたい!getposts,WPQuery,query_posts の違いと用例|TECHNICAL BLOG|株式会社エムハンド
WordPressテーマの「while (haveposts()) : thepost();」の意味は? | PHPプログラミングの教科書 [php1st.com]
WordPress ループ&クエリーのモヤモヤを解消しよう! | wpxtreme
pregetpostsアクションフックについて
pregetpostsはWordpressがメインクエリを実行する前に呼び出される「アクションフック」と呼ばれるもの。メインクエリの内容を変えたいときに利用するといい。 function.phpに記述していく。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
add_action('pre_get_posts','test_pre_get_posts'); function test_pre_get_posts($query){ //管理画面 if(is_admin()||!$query->is_main_query()){ return; } //トップページ if($query->is_home()){ $query->set('posts_per_page',3); return; } } |
一つづつ解説していきます
1 2 |
add_action('pre_get_posts','test_pre_get_posts'); function test_pre_get_posts($query){ |
ここでフックの指定をしています。testpreget_postsはユーザー定義関数。
1 2 3 |
if(is_admin()||!$query->is_main_query()){ return; } |
ifで条件を指定しています。ここではメインクエリかつ管理画面では適用しない、という条件になっています。ismainqueryは現在のクエリがメインクエリかどうかを判断する関数です。
更にはこんなふうに描くことも出来ます。
1 2 3 |
if ( is_admin() &;&; $query->is_main_query() &;&; $query->is_month() ) return; } |
管理画面でメインクエリーで月別アーカイブの時に適用させる書き方です。
1 |
if($query->is_home()){ |
ここでも条件式を書いています。ishomeでトップページの場合次のクエリーの処理を実行するという意味です。
ishome()をis_category()とすればカテゴリーページのみの対象となります。
1 2 |
$query->set('posts_per_page',3); return; |
$query->set(‘パラメータ’,’値’)
とすることでさまさまな条件を指定できます。 例として
1 2 3 |
$query->set('author_name','yamada'); //ニックネーム山田に対して $query->set('category_name','story');//storyタグのみに対して |
WordPressでホームやアーカイブ毎に表示条件を変える(ismainquery と pregetposts フック) – Gatespace’s Blog