サポート » 使い方全般 » get_query_var('paged')でページ数と投稿数があわない

  • 解決済 mclcl

    (@mclcl)


    素人なのでうまく説明できるかどうか分かりませんが、ご回答いただければ大変助かります。

    ページネーションはきちんと表示されているし、ページ送りも問題がないのですが、数が合わないんです。

    ・固定1
    ・エントリー1
    ————————-
    ・エントリー2
    ・エントリー3
    ————————-
    ・固定2

    本来なら投稿数5件、3ページにならなきゃいけないのが、

    ・固定1
    ・エントリー1
    ————————-
    ・エントリー2

    と、エントリーの数だけを取得しているみたいです。

    テーマはTwenty Tenを使用しています。

    loop.phpを変更して、投稿一覧に固定ページも表示させるようにしています。

    <?php
    $args = array( 'orderby' => 'date', 'post_status' => 'publish', 'post_type' => array( 'post', 'page' ), 'paged'=>$paged );
    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    $wp_query = new wp_query( $args ); ?>
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php if ( get_post_type() === 'page') : //固定ページの場合 ?>
    固定ページ用の表示
    <?php else : //通常投稿の場合 ?>
    エントリーページ用の表示
    <?php endif; ?>
    <?php endwhile; ?>
    
    <?php wp_reset_query(); ?>
    <?php
    if ( $wp_query->max_num_pages > 1 ) : /* ページが複数ある場合 */ ?>
    <!-- ▼▼▼ Page Navigation ▼▼▼ -->
    <div id="PageNavi" class="ClearFix">
    <?php global $wp_rewrite;
    $paginate_base = get_pagenum_link(1);
    if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
    	$paginate_format = '';
    	$paginate_base = add_query_arg('paged','%#%');
    }
    else {
    	$paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
    	user_trailingslashit('page/%#%/','paged');;
    	$paginate_base .= '%_%';
    }
    echo paginate_links(array(
    'base' => $paginate_base,
    'format' => $paginate_format,
    'total' => $wp_query->max_num_pages,
    'mid_size' => 4,
    'current' => ($paged ? $paged : 1),
    'prev_text' => '前のページ',
    'next_text' => '次のページ',
    )); ?>
    <?php endif; ?>

    上記で何かおかしな部分がありますか?
    何卒宜しくお願い致します。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    とりあえず、パラメーターに$pagedを使っていますが
    $args = array( 'orderby' => 'date', 'post_status' => 'publish', 'post_type' => array( 'post', 'page' ), 'paged'=>$paged );
    $pagedに代入しているのは次の行ですね
    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    逆じゃないと動かないと思います。

    トピック投稿者 mclcl

    (@mclcl)

    >hissy様

    ご指摘ありがとうございます。逆にしないと動かない…はずなんですが、なぜか機能してしまっています。
    そして順序を変えても投稿数が合わない状態です。

    「$paged」というパラメーター名が問題なのかもと思い、「$sample」に変えてみましたが、結果は一緒でした。

    「get_query_var」はエントリーの数しか勘定しないんでしょうか??

    モデレーター Takuro Hishikawa

    (@hissy)

    未検証ですがposts_per_pageも指定したほうがいいかもしれない。

    トピック投稿者 mclcl

    (@mclcl)

    >hissy様

    ダッシュボードでの設定で表示件数を1件にして、「’posts_per_page’ => 3」を追加しました。
    そうするとすべて表示されたんですが、本来2ページしか表示されなくてはいけないのが、4ページになってしまいました。

    3〜4ページ目には何も表示されずページネーションだけが表示されました…。

    モデレーター gatespace

    (@gatespace)

    ちょっと気になったので確認させてください。

    loop.phpを変更して、投稿一覧に固定ページも表示させるようにしています。

    これは、専用の固定ページ用のテンプレートを用意し、固定ページ内で投稿一覧を出していると言う解釈で良いですか?

    トピック投稿者 mclcl

    (@mclcl)

    色々試してみました。

    投稿している記事の順番

    ・固定1
    ・エントリー1
    ・エントリー2
    ・エントリー3
    ・固定2

    ■ダッシュボード1件、’posts_per_page’ => 3の場合

    ・固定1
    ・エントリー1
    ・エントリー2
    ——————–
    ・エントリー3
    ・固定2
    ——————–
    【空ページ】
    ——————–

    ■ダッシュボード3件、’posts_per_page’ => 3の場合

    ・固定1
    ・エントリー1
    ・エントリー2
    ——————–
    ※ページネーションは表示されず

    ■ダッシュボード2件、’posts_per_page’ => 3の場合

    ・固定1
    ・エントリー1
    ・エントリー2
    ——————–
    ・エントリー3
    ・固定2
    ——————–
    ※正しく表示されるものの、固定、エントリーの投稿数で偶然正しくなっている模様。

    トピック投稿者 mclcl

    (@mclcl)

    >gatespace様

    素人なのでこれでうまく伝わるかどうか不安ですが。

    「index.php」には

    <?php get_header(); ?>
    <?php get_template_part( ‘loop’, ‘index’ );?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>

    のみです。
    通常だとget_template_part部分は投稿記事しか表示されないんですが、「loop.php」を変更して、固定ページも投稿ページと同様に表示させている…という状態です。

    私がgatespace様の質問を勘違いしてしまっていたら申し訳ございません。

    モデレーター gatespace

    (@gatespace)

    テンプレート階層を見てもらえれば分かりますが、テーマのindex.phpは全てのページの種類において優先されるテンプレートがない場合、最後に適用されるテンプレートです。

    固定ページも投稿ページと同様に表示させている

    というのは、例えば「投稿一覧」と言ったタイトルの「固定ページ」ですか?
    それとも(テンプレート階層の説明で言えば)「ブログ投稿インデックスページ」に当たりますか?

    トピック投稿者 mclcl

    (@mclcl)

    >gatespace様

    category.php、archive.phpなどは削除しており、index.php、404.phpのみです。

    index.phpなんですが、条件分岐を利用して

    <?php get_header(); ?>
    <?php
    //シングルの場合
    if( is_single() ) {
    	get_template_part( 'loop', 'single' );
    }
    //ページの場合
    elseif( is_page() ) {
    	get_template_part( 'loop', 'page' );
    }
    //その他の場合
    else {
    	get_template_part( 'loop', 'index' );
    }
    ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>

    となっています。loop.php、loop-single.php、loop-page.phpがあります。

    なので「固定ページ」自体はindex.phpで条件分岐でloop-page.phpを表示させています。

    うまく言えず申し訳ございません。

    モデレーター gatespace

    (@gatespace)

    いえいえ、大丈夫ですよ。
    テンプレートファイルの種類は分かりました。

    mclclさんが書かれている「投稿一覧」は、実際には固定ページの中身を改変しているのか、それとも「ブログ投稿インデックスページ」どちらなんでしょう?

    固定ページで「hogehoge」みたいなタイトルをつけて http://example.com/hogehoge/ で表示するなら、「投稿一覧」は前者の固定ページになります。

    ただし、設定>表示設定で「フロントページの表示」で「固定ページ」にし、フロントページ、投稿ページに何かしらの固定ページを割り当てているなら、後者です。

    一見、コードとは関係無いようですが、この設定の違いで条件分岐タグの判定結果や使われるテンプレートファイル(厳密にはテンプレート階層に基づく優先順位)が変わります。

    トピック投稿者 mclcl

    (@mclcl)

    >gatespace様

    パーマリンク設定をデフォルトのhttp://example.com/?p=123にしているんですが、
    固定ページは「http://example.com/?page_id=123」と表示されます。
    (http://example.com/hogehoge/と同じ解釈でよろしいですか?)

    フロントページの表示は「最新の投稿」を設定しております。

    トピック投稿者 mclcl

    (@mclcl)

    色々調べてみてloop.phpの最初の部分を以下に書き換えました。

    <?php $paged = get_query_var('paged') ? get_query_var('paged') : 1; ?>
    <?php query_posts( array(
        'post_type' => array('post', 'page'),
    	'posts_per_page' => 3,
    	'orderby' => 'date',
        'paged' => $paged
    	));
    ?>
    <?php while ( have_posts() ) : the_post(); ?>

    posts_per_pageの数はダッシュボードで設定した数と同じ、もしくは多くすると問題なくいけました。

    ただ、「http://example.com/?paged=2」の数字部分を3にした場合、空ページが出てきますが、ページネーションには表示されないですし、「posts_per_pageでの設定の数=ダッシュボードで設定した数」で設定すれば問題なさそうです。

    原因が全く分かりませんが、ご協力いただいたhissy様、gatespace様ありがとうございました。

    もっと勉強して、今回のエラーの原因がわかるようになるまで頑張ります。

    モデレーター gatespace

    (@gatespace)

    解決されたようなので補足になっちゃいますが。

    フロントページの表示は「最新の投稿」を設定しております。

    この状態でいわゆる「最新の投稿」(投稿一覧)に対し、投稿の他に固定ページも含めるなら、テンプレートファイルにコードを書くよりも、finctions.phpに

    add_action( 'pre_get_posts', 'foo_modify_main_query' ); // pre_get_postsにフック
    function foo_modify_main_query( $query ) {
      if ( is_admin() || ! $query->is_main_query() )
        return;
    
      if ( $query->is_home() ) { // is_home が tureの時
        $query->set( 'post_type', array( 'post', 'page' ) ); // 投稿と固定ページを含める
        return;
      }
    }

    とした上で、ページ送りのコードを書いてみてください。

    トピック投稿者 mclcl

    (@mclcl)

    >gatespace様

    function.phpに頂いたコードを記述してloop.phpから同様の記述を削除しました。
    うまく行きました!

    ありがとうございます!スッキリしました!

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「get_query_var('paged')でページ数と投稿数があわない」には新たに返信することはできません。