回答編集履歴

1 連番降り忘れ

manabufukai

manabufukai score 670

2016/07/08 02:58  投稿

> ①特集記事(カテゴリー名special、カテゴリーID 30)を2つ呼び出し、
②それ以外の投稿を一覧で6つずつ表示する
という仕様にする上で、普通はそういった実装は行いませんね。
1.functions.phpにて`pre_get_posts`で
```
function my_pre_get_posts($query) {
 if ( $query->is_home() && $query->is_main_query() ) { //条件は使っているテンプレートファイルに応じて適宜変更(今は「ホーム(トップページ)の時には」)
       $query->set('posts_per_page', 6); //表示数
       $query->set( 'post__not_in','カテゴリーID' ); //除外するカテゴリーID(複数ならarray()で渡す)
       return;
 } else {
    // それ以外のページでの設定(必要であれば)
 }
}
add_action('pre_get_posts', 'my_pre_get_posts');
```
のようにして表示数及び、(ページによって変更したいのであれば)クエリを設定しておくのがセオリーです。
こうすればトップページの時には通常のWordPressループ処理` <?php while ( have_posts() ) : the_post(); ?>`で指定したカテゴリーIDが除外された投稿が表示されます。
そのうえで、
2.そのうえで、
> ①特集記事(カテゴリー名special、カテゴリーID 30)を2つ呼び出し
を**サブループとして**`new WP_Query`等で作成します。(どちらがメインループかと考えれば、こちらがサブでしょう。)
- [pre_get_postsについて](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/pre_get_posts)
- [関数リファレンス/WP Query](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query)
#### メインループとサブループを理解しましょう。
ばっくりと言うと、本来そのテンプレートファイルで呼び出されるメインクエリがメインループです。
そこに対して、別の一覧であったりピックアップなどを行いたい時に「追加する」のがサブループです。
このあたりの記事なども読んでみると理解が深まるかと思います。
[http://oxynotes.com/?p=1496](http://oxynotes.com/?p=1496)
#### そもそも`query_posts()`自体、よほどのことがない限り使いません。
`query_posts()`というのは、一度組み立てられたメインクエリを
「新たに設定しなおし」、「もう一度組み立てて」、「元々のメインクエリを上書き」します。
(この時点で、「`query_posts()`が二つ並ぶ」という実装がおかしいとお分かりになるのでは?)
当然通常のループに比べてかなり遅くなるうえに、ページを組み立てるベースになるメインクエリを上書きする為に、**ある程度メインクエリの実体と改変時の影響範囲がわかっていないとエラーやバグを量産します**。
本来、`query_posts()`は使うためにはそこそこの知識と技術が必要な関数です。
しかしながら、`query_posts()`を使うメリットというのは実際ほとんど無く、
使わなければならないケースや使わなければ実装できない機能もほぼなく、
使う必要は無いと言っても過言ではありません。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る