サポート » テーマ » foreachページャーを実装する。

  • 解決済 fst usr

    (@rtrkwkm)


    [解決済み] カスタム投稿1覧ページでタクソノミーの1件目のみ表示

    こちらを投稿させたものです。度々すみません。

    意図した出力は叶ったのですが、
    こちらの
    ・一覧上限を付ける
    ・ページャーの実装
    というのを実現したく、また皆様のお知恵をお借りできればと思い投稿させていただきました。

    先ほどのソースが以下の物です。

    <?php
    $args=array(
      'name' => 'date'
    );
    $output = 'objects';
    $taxonomies=get_terms($args,$output);
    if  ($taxonomies) {
    	arsort($taxonomies,SORT_NUMERIC);
      foreach ($taxonomies  as $taxonomy ) {
        $taxdate = $taxonomy->name ;
    	//ここまでタクソノミー取得とforeach開始
    	query_posts( array(
            'post_type' => 'works',
    		'orderby' => 'date',
    		'order' => 'DESC',
            'posts_per_page' => '1',
    		'paged' => $paged,
    		'tax_query' => array(
    			array(
    				'taxonomy'=>'date',
    				'terms'=>$taxdate,
    				'field'=>'slug',
    				'include_children'=>true,
    				'operator'=>'IN'
    			),
    		'relation' => 'AND'
    		)
    	));
    if (have_posts()) :while (have_posts()) :
    	the_post();
    
    //html
    //html
    //html
    
    endwhile;
    endif;
    wp_reset_query();
    //ここまでPostTypeとタクソノミー指定してのループ
    
      }
    }
    //foreach終了
    
    ?>

    htmlが$taxdateのあるかず分表示される形となるため、
    foreachの回数上限を設けたのですが、
    WP-pageNaviなどのプラグインを
    上記ソース終わりに設置したのですが、
    foreachで設定した上限にてloopが終了しているため、
    次ページへと送るものがないのか、次ページが表れない状態となっております。

    少し考え方を変え、

    <?php
    $args=array(
      'name' => 'date'
    );
    $output = 'objects';
    $taxonomies=get_terms($args,$output);
    if  ($taxonomies) {
    	foreach ($taxonomies  as $taxonomy ) {
    	$taxdate = $taxonomy->name ;
    	//ここまでタクソノミー取得とforeach
    ?>
    
    <?php
    query_posts( array(
            'post_type' => 'works',
    		'orderby' => 'date',
    		'order' => 'DESC',
            'posts_per_page' => '15',
    		'paged' => $paged,
    	));
    if (have_posts()) :while (have_posts()) :
    	the_post();
    ?>
    
    <?php
    query_posts( array(
            'post_type' => 'works',
    		'orderby' => 'date',
    		'order' => 'DESC',
            'posts_per_page' => '1',
    		'paged' => $paged,
    	'tax_query' => array(
    		array(
    			'taxonomy'=>'date',
    			'terms'=>$taxdate,
    			'field'=>'slug',
    			'include_children'=>true,
    			'operator'=>'IN'
    			),
    		'relation' => 'AND'
    		)
    	));
    if (have_posts()) :while (have_posts()) :
    	the_post();
    ?>
    
    //html出力個所
    
        <?php
    endwhile;
    endif;
    wp_reset_query();
    ?>
    
        <?php
    endwhile;
    endif;
    wp_reset_query();
    ?>
    
    <?
    //ここまでループ
      }
    }
    //ここまでforeach
    
    ?>
      </ul>
      </div>
    
      <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>

    と、
    foreach

    posttypeと表示上限(15件)を設定したquery_post、その1

    posttypeと表示上限(1件)とtax_queryでタクソノミを限定したquery_post、その2

    html出力

    その1終了

    その2終了

    foreach終了

    ページャー

    としてみたのですが、

    ・その1で設定した15件が無効となり、全件表示される。
    ・その2の条件(タクソノミ内の最新を選択)は有効
    ・全く同じものが2つ横並びに表示される。

    という形になっております。

    query_postの中にquery_postを入れ、という構造が不味いのでしょうか。

    なにか他によい方法などございましたら、お教えいただけますと幸いです。

    よろしくお願いいたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 以降、可能性を検討してみましたが、どうしてもうまくいかなかったため、
    一度根本的に組み立て直してみたいと思います。

    query_postsを外/内の二重にすると、内が外のquery_postsを上書きしてしまうそうです。(二重ループをご紹介しておきながら申し訳ありません。)
    テンプレートタグ/query posts

    それから次のようにも書かれていますので、組み立て直すのが本当に良いと思います。

    注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えば pre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。

    > ghvstさま。

    度々ありがとうございます。
    私も同様の注2にあたり、ご教授いただきました手法の実現をあきらめ、
    カテゴリベースで新たに組み立ててみております・・・
    本当にいろいろとありがとうございます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「foreachページャーを実装する。」には新たに返信することはできません。