• 解決済 tk5

    (@tk5)


    メインページ(index.php)で、複数のカテゴリーの情報を、それぞれのカテゴリーごとに「query_posts」を使ってパラメータにカテゴリー名を指定して(’category_name=xxx’)それぞれの情報を表示しているのですが、「is_main_query」を使った方が効率的であるという記事をみつけたので、「is_main_query」を使って以下のように書き換えてみました。
    一応「query_posts(‘category_name=xxx’)」をそれぞれカテゴリーごとに記述するのと同じような結果は得られるのですが、果たしてこれで効率的になっているのか自分ではわかりません。
    もっと効率的な書き方や、こういう場合は「query_post」を使って書いたほうがいいなどのアドバイスをいただければ大変ありがたいです。

    以下の場合「news」と「products」のカテゴリーにはそれぞれ複数の子カテゴリーがあります。また、実際にはもう少しカテゴリーがあります。
    functions.phpへの記述

    add_action( 'pre_get_posts', 'modify_category_query' );
    function modify_category_query ( $query ) {
     if ( ! is_admin() && $query->is_main_query() ) {
      if ( $query->is_home() ) {
       $query->set( 'category_name',  'news, products'  );
      }
     }
    }

    index.php抜粋

    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php
    $cats = get_the_category();
    $cat = $cats[0];
    $catname = $cat-> slug;
    $parent = get_category($cat->parent);
    $parentname = $parent-> slug;
    if($parentname == 'news'):  //news カテゴリーの情報を表示
    ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
    <?php endif; ?>
    <?php endwhile; ?>
    <?php endif;  ?>
    
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php
    $cats = get_the_category();
    $cat = $cats[0];
    $catname = $cat-> slug;
    $parent = get_category($cat->parent);
    $parentname = $parent-> slug;
    if($parentname == 'products'):  //products カテゴリーの情報を表示
    ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
    <?php endif; ?>
    <?php endwhile; ?>
    <?php endif;  ?>

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック投稿者 tk5

    (@tk5)

    追記です。
    また、news カテゴリーの表示件数のみ「5件」にするような場合、以下のようにしてみましたが(一応機能はしているみたいですが)、functions.php の方に条件分岐で記述する方法はないでしょうか?

    <?php if(have_posts()): ?>
    <?php $count_news = 0; ?>  //件数をカウントするための変数
    <? while(have_posts()): the_post(); ?>
    <?php
    $cats = get_the_category();
    $cat = $cats[0];
    $catname = $cat-> slug;
    $parent = get_category($cat->parent);
    $parentname = $parent-> slug;
    if($parentname == 'news' && $count_news < 5):  //news カテゴリーの情報を5件表示
    $count_news ++;  //件数をインクリメント
    ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
    <?php endif; endwhile; endif; ?>
    
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php
    $cats = get_the_category();
    $cat = $cats[0];
    $catname = $cat-> slug;
    $parent = get_category($cat->parent);
    $parentname = $parent-> slug;
    if($parentname == 'products'):  //products カテゴリーの情報を表示
    ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
    <?php endif; endwhile; endif; ?>

    よろしくお願いします。

    モデレーター gatespace

    (@gatespace)

    is_main_query はその名の通り、メインクエリーを改変する物なので、
    1ページの中に複数のループを使うのであれば、 get_posts あるいは WP Query クラスを使うのがよいかと。

    is_home において 何をメインにするかをご自身で決めないといけませんが、
    news カテゴリーをメイン、その他のカテゴリーをサブとするなら

    functions.php

    add_action( 'pre_get_posts', 'modify_category_query' );
    function modify_category_query ( $query ) {
     if ( ! is_admin() && $query->is_main_query() ) {
      if ( $query->is_home() ) {
       $query->set( 'category_name',  'news' );
       $query->set( 'posts_per_page',  5 );
      }
     }
    }

    index.php

    <?php if(have_posts()): ?>
    	<?php while(have_posts()): the_post(); ?>
    		<?php the_title(); ?>
    		<?php the_excerpt(); ?>
    	<?php endwhile; ?>
    	※ページ送りとか
    <?php else : ?>
    	※投稿がありません
    <?php endif; ?>
    
    <?php
    $args = array(
    	'category_name' => 'staff'
    );
    $my_query = new WP_Query( $args );
    if ( $my_query->have_posts() ) {
    	while ( $my_query->have_posts() ) :
    		$my_query->the_post();
    		/* do stuff
    			the_title(), the_permalink() 等使用可
    		*/
    	endwhile;
    } else {
    	echo "※投稿がありません";
    }
    wp_reset_postdata();
    ?>

    ですかね(未検証です)

    トピック投稿者 tk5

    (@tk5)

    gatespaceさま、

    メインクエリというコンセプトがよく理解できていなかったのですが、ご説明いただきわかったような気がします。

    「news カテゴリーをメイン、その他のカテゴリーをサブと」して考えれば、とってもわかりやすくすっきりしました。

    大変ありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「is_main_query で複数のループを扱う方法」には新たに返信することはできません。