サポート » 使い方全般 » posts_nav_linkでのページ送りがうまくいかない(同じ内容が表示される)

  • 解決済 yua0209

    (@yua0209)


    index.php内のloop.phpにおいて、ページ送りがうまくいきません。
    「前(次)のページ」を押しても、1ページ目の内容しか表示されないのです。

    このフォーラム内や各サイトを調べて回り、いろいろ試したのですが、
    数年前の記事だからなのかどれもうまくいきませんでした。

    現在のコードは以下のようになっています。

    <?php
    $paged = get_query_var('paged');
    query_posts("cat=-1&posts_per_page=10&paged=$paged");
    ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?> 
    
    <!--ここに内容-->
    
    <?php endwhile; ?>
    <div class="center"><?php posts_nav_link(' | ','≪次の10件','前の10件≫'); ?></div>
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    ためしに 上の部分を下記のように変更してみても
    結果は同じでした。

    <?php
    $paged = get_query_var('paged');
    query_posts('cat=-1&posts_per_page=10&paged='. $paged);
    ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>

    また、http://www.webcreatorbox.com/tech/wordpress-help-code/ を参考に
    以下のコードを試しましたが、これは最新記事が1件しか表示されなくなってしまいました。

    <?php
    $paged = get_query_var('paged');
    query_posts("cat=-1&posts_per_page=10&paged=$paged");
    ?>
    <?php if (have_posts()) :  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    query_posts( $query_string . "&paged=$paged" );  ?>
    <!--ここに内容-->
    
    <?php endif; ?>
    <div class="center"><?php posts_nav_link(' | ','≪次の10件','前の10件≫'); ?></div>
    <?php wp_reset_query(); ?>

    どなたかご教授いただければと思います。

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

    (@gatespace)

    query_postsを使っているのでページ送りがうまくいかないのだと思います。

    最近のおすすめはpre_get_postsというアクションフックを用いることで、
    query_postsを使わずにメインクエリ(この場合はカテゴリー毎に表示件数を変える)の改変が可能です。

    これはテンプレートファイルにアクセスする前にクエリを改変しますので、
    二重にクエリの呼び出しを行わなくて済むというメリットがあります。

    Codex:is_main_query

    こちらのブログでは「カテゴリーアーカイブだったら表示する件数を5件にする」と言うコードが紹介されています。
    3.3の新しい関数 is_main_query を使おう
    ※3.3となっていますが、3.2以前でも対応可能なコードが紹介されています。

    いったんテンプレートを元に戻して
    テーマのfunctions.phpにこちらのコードを書いてみてください。

    未検証ですが、
    index.phpということで、今回は「フロントページの場合」として例示しますが、
    条件分岐タグを使えば、他の場合でも使えます。

    function mont_posts_per_page( $wp_query ) {
        if (!is_admin()) { //管理画面以外で
            if ( $wp_query->is_main_query() && $wp_query-> is_front_page() ) { // // メインクエリーがホーム(フロントページ)
                $wp_query->set( 'cat', -1 ); // カテゴリーID = 1 を除外
                $wp_query->set( 'posts_per_page', 10 ); // 10件ずつ
            }
        }
    }
    add_action( 'pre_get_posts', 'mont_posts_per_page' );

    他のスレッドでも条件が異なりますが、同様のコードを紹介しています。
    「月内の書き込みを全部表示させたい」
    「wp-pagenaviを使用し、カテゴリごとに記事数を変更したい」

    こんにちは

    query_postsを使っているのでページ送りがうまくいかないのだと思います。

    という事ではないと思います。

    yua0209さんが、最初に示されたコードも、gatespaceさんが「未検証ですが、」として示されたコードも、どちらも動作すると思います

    cat=-1は、普通なら、アンカテゴライズにチェックが入っていない投稿ということになるので、もともと、yua0209さんがテストしておられるブログの投稿が、少ないのではないかと想像していますが、cat=-1をはずしてもページ送りが出来ないですか?

    twentyelevenのindex.php get_header()直後にコピペして動作確認したコードです。

    <?php
    if( is_main_query() ){
    $paged= get_query_var('paged');
    query_posts("cat=-1&posts_per_page=3&paged=$paged");
    }
    
    if( ! is_main_query() ){
        echo '<p style="text-align:center;">Not main query</p>';
    }
    ?>
    <div style="margin:50px;">
    <?php if( have_posts() ){?>
    <?php while ( have_posts() ) : the_post(); ?>
    
                        <?php get_template_part( 'content', get_post_format() ); ?>
    
    <?php endwhile; }?>
    <?php posts_nav_link(' | ','≪','≫'); ?></div>
    <?php wp_reset_query(); ?>
    <?php
    wp_reset_query();
    if( is_main_query() ){
        echo '<p style="text-align:center;">main query</p>';
    }
    ?>

    件数がそんなにないので、3件に変更しましたけど、動作しているようでした。

    トピック投稿者 yua0209

    (@yua0209)

    gatespaceさま、nobitaさま、ありがとうございます。

    cat=-1をはずし、

    <?php
    $paged = get_query_var('paged');
    query_posts('posts_per_page=10&paged='. $paged);
    ?>

    現在このコードになりましたが、変わらないままです。

    また、nobitaさんがおっしゃる通り、まだ運営を始めたばかりで記事は少ないです。
    社内で運用しているブログで、公開後にこのバグ?に気づいたため、
    gatespaceさんのおっしゃるテンプレートを元に戻すというのが困難なのですが、
    仮の環境をつくってやってみます。

    ちなみに、実はindex.php内であと2つquery_postsを使っています。
    loop.php内でリセットタグをいれてるのはこのためなのですが、
    ページ送りができないのはこれが関係していたりするのでしょうか…。

    ※loop.phpより上の部分に、カスタム投稿タイプで作ったお知らせ情報をいれる以下の2つがあります。

    <?php query_posts('post_type=info&posts_per_page=1'); ?>
    <?php if(have_posts()) : while(have_posts()) :the_post(); ?>
    
    	<?php the_content(); ?>
    
    <?php endwhile;endif; ?>
    <?php wp_reset_postdata(); ?>
    <?php query_posts('post_type=topnews&posts_per_page=1'); ?>
    <?php if(have_posts()) : while(have_posts()) :the_post(); ?>
    
    	<?php the_content(); ?>
    
    <?php endwhile;endif; ?>
    <?php wp_reset_postdata(); ?>

    トピック投稿者 yua0209

    (@yua0209)

    失礼しました。慌てて、nobitaさんが検証してくださったコードを試さずにレスを投稿してしまいました。
    挑戦してみて、またご報告します。ありがとうございます!

    こんにちは

    その状態ですと、私の書いたコードは、動作しないと思います。

    ちなみに、実はindex.php内であと2つquery_postsを使っています。

    wp_reset_postdata() を、wp_reset_query() に変更してみてください

    それから、コードをテストしてみてください。

    トピック投稿者 yua0209

    (@yua0209)

    wp_reset_postdata() を、wp_reset_query() に変更してみてください

    ためしたところ、正常に動作しました!!ありがとうございます!!
    ためしに、条件にcat=-1を追加しても問題なく動作できました。

    リセットタグが間違っていることはわかっていたのですが、
    制作中の動作確認で、wp_reset_query()にすると
    なぜかカスタム投稿のすべて表示されるという現象が起きていたので
    よくわからないままpostdataにしておりました・・・
    今なぜ正常になったのかもわかっていませんが、勉強します。

    新しい関数という is_main_query についても勉強します。
    お二人とも、ありがとうございました!

    余談ですが、このリセットタグを修正することにより、
    実はもうひとつの悩みのタネであった
    ≪次の5件 | 前の5件≫ が ≪次の5件前の5件≫ と表示されてしまう
    というバグも直りました。
    ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「posts_nav_linkでのページ送りがうまくいかない(同じ内容が表示される)」には新たに返信することはできません。