サポート » 使い方全般 » pagerがうまく作動しない

  • 解決済 ioxrxogi

    (@ioxrxogi)


    こちらの記事「WordPress 投稿一覧に年と月の見出しを付ける方法」を参考に年別の記事一覧を作っています。
    以下のコードで年別の表示ができたのでうまくいっていると思ったのですが、ページあたりの件数をいろいろ変えていくとうまく動作していないようです。
    1ページ1件にしてみると、3ページ目からは表示されなくなってしまいます。

    <article>
    <?php // 投稿一覧に年と月の見出しを付ける
    $args = array(
       'paged' => $paged,
       'cat' => 30, // 任意のカスタム投稿タイプを指定
       'posts_per_page' => -1, // 1ページに表示する最大投稿数を指定、-1は全てを表示
         'order' => 'DESC', // 降順でソート
         'orderby'=>'date' // 日付で並べる
        );
    $wp_query = new WP_Query($args);
    if($wp_query->have_posts()):
        $post_year = false; // 年の比較用変数の初期化
        $post_month = false; // 月の比較用変数の初期化
        echo '<h1>投稿一覧</h1>';
        while ($wp_query->have_posts()): $wp_query->the_post();
    
    if( $post_year != get_post_time('Y') ) { // 比較の値と投稿月が異なる場合に以下を出力
       if ( $post_year !== false ) { // 比較の値と投稿月が異なる場合に以下を出力
          echo '</ul>';
          }
         if ( $post_year != get_post_time('Y') ) { // 比較の値と投稿年が異なる場合に年を出力
         echo '<h2>'.get_post_time('Y年').'</h2>'; //投稿の年を出力
         }
         echo '<ul>';
         }      
         echo '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>'; // 投稿のリンクとタイトルを出力
         $post_year = get_post_time('Y'); // 年月の比較用の変数に今の投稿の年月を代入
         endwhile;
         wp_reset_postdata();
         echo '</ul>';
    endif;
    ?>
    <!-- pager -->
    <?php if (function_exists("pagination")) {
    	pagination($the_query->max_num_pages);
    } ?>
    <!-- /pager	 -->
    </article>

    pager(functions.phpに記入)

    //ページネーションを追加
    function pagination($pages = '', $range = 3)
    {
        $showitems = ($range * 2)+1;  
    
         global $paged;
         if(empty($paged)) $paged = 1;
    
         if($pages == '')
         {
             global $wp_query;
             $pages = $wp_query->max_num_pages;
             if(!$pages)
             {
                 $pages = 1;
             }
         }   
    
         if(1 != $pages)
         {
             echo "<div class=\"pagination clearfix\"><span>Page ".$paged." of ".$pages."</span>";
             if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo; First</a>";
             if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; Previous</a>";
    
             for ($i=1; $i <= $pages; $i++)
             {
                 if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
                 {
                     echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
                 }
             }
    
             if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Next &rsaquo;</a>";
             if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last &raquo;</a>";
             echo "</div>\n";
        }
    }

    もともとの年と月での記事一覧では、pagerはうまく動作しています。
    pager自体は、他のページではちゃんと動作しています。

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

    (@ioxrxogi)

    とりあえず、表示設定のページ数よりも大きい数字を当てることで対処させました。

    WordPress は URL をパースし、その結果、データベース空取得した情報を元にテンプレートを選択します。

    なので、テンプレート上に記事の表示を実装してしまうと、不具合が起きることが良くあります。記事が存在しない場合 404.php を探しに行くので、テンプレート上に書かれている WP_Query 等が動作しないことがあったりします。

    なので WP_Query を用いずに、pre_get_posts 等で通常のループを変更する方が、不具合が少ないです。

    参考:
    【wordpress】pre_get_postsを使ってみませんか? – Qiita

    また、$wp_query という変数は、WordPress のグローバル変数として使われている値です。なので、これに値をセットしてしまうと、予期せぬ不具合がすると思われます。

    トピック投稿者 ioxrxogi

    (@ioxrxogi)

    ありがとうございます。

    一部pre_get_postsを使っているものあるのですが、
    使っているにもかかわらずまだよく理解していないもので、
    どうやってページに反映されているのか理解してないところがあるので、
    pre_get_postsについては試行錯誤中です。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「pagerがうまく作動しない」には新たに返信することはできません。