サポート » 使い方全般 » query_postsを使わず、pre_get_postsで代用したい。

  • こんばんわ。

    wordpress初心者です。query_postsを使いHPを作っていたのですが、ページ送りのプラグインが利用できないので調べてみると、query_postsは使わない方が良い、今はpre_get_postsを使うべきだと書いてありました。

    よって、query_postsの部分をpre_get_postsで代用したいのですが、使い方がいまいちわかりません。

    このサイトによると、functions.phpを使うとあるのですが、私のサイトの場合どうすればいいのかがわかりません。

    現在のindex.phpです。

    <?php if (is_front_page()): ?>
           <?php query_posts( 'category_name=A&posts_per_page=12' ); ?>
             <div class="title"><a href="http://suliko.moo.jp/?page_id=190">副題</a></div>
    
               <?php if (have_posts()) : ?>
                 <?php while (have_posts()): ?>
                  <?php the_post(); ?>
                  <div style="width:240px; height:180;margin:15px; " class="thumb">
                     <a href="<?php the_permalink(); ?>">
                     <div class="pic" ><?php the_post_thumbnail('my_thumbnail'); ?></div><h3><?php the_title(); ?></h3></a>
    
                   </div>
                 <?php endwhile; ?>
             <?php endif; ?>
          <?php wp_reset_query(); ?>
    
    同じ物でquery_postsの部分だけが下記のものが下に続く。
    <?php query_posts( 'category_name=B&posts_per_page=6' ); ?>

    topページにカテゴリーがAのものを12記事、Bのものを6記事のせ、カテゴリーページではAのページではAの記事が18記事、Bも同様。

    という作りになっています。(作っているサイトです。
    )

    このサイトを見ながら自分なりにこうかなーと思ってやったのですが(下)、エラーばかりでわかりません。

    もしわかる方がいましたら、教えて頂けないでしょうか。よろしくお願いします。

    function customize_main_query($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
        $query->is_front_page(){
              $query->set( 'category_name=A&posts_per_page=12');
         $query->set( 'category_name=B&posts_per_page=6');
        }
    }
    add_action( 'pre_get_posts', 'customize_main_query' );
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター gatespace

    (@gatespace)

    topページにカテゴリーがAのものを12記事、Bのものを6記事のせ、カテゴリーページではAのページではAの記事が18記事、Bも同様。

    という作りになっています

    トップページは条件の違うループが二個あるから get_postsの方が良いかも。

    カテゴリーアーカイブで、かつカテゴリーA(またはカテゴリーB)の場合だけ18記事でページ送りになる用にすれば良いんじゃないですかね?

    PHPの条件文の書き方分からないと、適当に書いてもエラーになるだけですよ。

    トピック投稿者 nipper1122

    (@nipper1122)

    ありがとうございます。本1冊読んで、あとはネットで調べながらむりくり作ってきたんですが、やっぱり知らない事が多すぎて、難しくなってきました。もう少し勉強し直してから出直します。

    functions.php

    function toppage_pre_get_posts($wp_query){
    	if($wp_query->is_main_query() && $wp_query->is_home()){
    		$wp_query->set('category_name','カテゴリーAのスラッグ');
    		$wp_query->set('posts_per_page',12);
    	}
    }
    add_action('pre_get_posts', 'toppage_pre_get_posts');

    トップページとか

    <?php if(have_posts()):
         while(have_posts()):the_post();?>
    カテゴリーAのループ
    <?php endwhile;endif; ?>
    
    $cat_query = new WP_Query('category_name=カテゴリーBのスラッグ&posts_per_page=6&paged='.get_query_var( 'paged' ));
    if($cat_query->have_posts()):
    while($cat_query->have_posts()):$cat_query->the_post();?>
    カテゴリーBのループ
    <?php endwhile;endif;wp_reset_postdata() ;?>

    カテゴリーごとに出力してページ送りってできるのかなと面白そうだったのでやってみました。
    カテゴリーAのほうにpre_get_postsでメインクエリーを書き換えています。
    ページ送りはカテゴリーAを基準に書き出されるので、Aが3ページ、Bが5ページに渡っても3ページしか表示されないと思います。ページ数が増えそうな方をpre_get_postsとis_main_queryで設定したらいいんじゃないかと思います。
    ↑のサンプルにページネーションの部分は含んでいません。ご参考になれば。

    モデレーター Takuro Hishikawa

    (@hissy)

    リンク先でpre_get_postsを使おうねって書いている本人です。整理して書きます。

    ・query_postsはメインクエリーを改変するためのもの
    ・query_postsはメインクエリーを改変するには効率が悪いので、pre_get_postsに切り替えていきましょう
    ・サブクエリーを発行するにはget_postsまたはWP_Queryのインスタンスを新規に作成しましょう

    サイトのトップページで表示されるものは本来なんでしょうか。初期設定であれば10件の投稿、新着順です。もし固定ページに設定していれば指定した固定ページです。それがメインクエリーです。
    「カテゴリーがAのものを12記事」というのは、本来トップページで表示されるデータではありません。そのように付加的にページに表示するものをサブクエリーと言います。

    ですので、ご希望のカスタマイズを行うには、get_postsまたはWP_Queryのインスタンスを新規に作成するのが正解、となります。プログラミング初心者の方にWP_Queryを使いこなすのはハードルが高いと思いますので、Codexのget_postsのページを読んでチャレンジしてみてください。

    なお、多くの書籍でquery_postsをサブクエリーを取得するのに使用していますが、WordPress公式ドキュメントとしては正しくない使い方になりますので、Codexで最新の情報を参照するようにしてください。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「query_postsを使わず、pre_get_postsで代用したい。」には新たに返信することはできません。