WordPressのWP-PageNaviで固定ページ・記事一覧ページにループ処置とページネーションをつける(備忘録)

こちらはあくまで試してみて動いたという感じなので、経験を積んでいくうちにコードはリファクタリングしていきたいと思う。完全な備忘録記事なので、本番での実装には向いていないかと。

今回は、固定ページ・記事一覧ページに対してページネーションの設定、並びに記事一覧のループ処理をする過程で、かなり苦戦を強いられたので備忘録として残しておく。ちなみに見た目はCSSで調整可能だ。

いろんな記事を参考にしてみたものの、結局そのままコードを実装するだけではうまくいかなかった。それでもいろいろ試行錯誤しているうちに、なんとか動いたので紹介していきたい。

固定ページのコードについて

<!-- ここから記事一覧を表示させる処理 -->
<ul>
  <!-- 固定ページ用のphpの記述、WP_Queryとpagedがポイント -->
  <?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $wp_query = new WP_Query();
    $my_posts = array(
      'paged' => $paged, //ここはそのままでOK
      'post_type' => 'post', //通常はpostだが、カスタム投稿タイプにするとpostの文字列が変わる
      'posts_per_page'=> '10',//最大何記事ループさせるか
    );
    $wp_query->query( $my_posts );
    if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post();
    // ここから下はカテゴリー一覧を取得するための記述。不要かもしれない。
    $category = get_the_category();
    $cat_id   = $category[0]->cat_ID;
    $cat_name = $category[0]->cat_name;
    $cat_slug = $category[0]->category_nicename;
  ?>
    <!-- ここからループ処理 -->
    <!-- 中身はclass名は削除しているし、ソースは任意 -->
    <li>
      <a href="<?php the_permalink(); ?>">
        <div>
          <?php if(has_post_thumbnail()): ?>
          <img src="<?php echo get_the_post_thumbnail_url($post->ID, 'l-size'); ?>" alt="<?php the_title(); ?>">
          <?php else: ?>
            <img src="<?php echo get_stylesheet_directory_uri($post->ID, 'l-size'); ?>/img/sample/sample.jpg" alt="デフォルト画像">
          <?php endif; ?>
        </div>
        <div>
          <div>
            <p><?php echo $cat_name; ?></p>
            <p><time><?php echo get_the_date("Y.m.d"); ?></time></p>
          </div>
          <h2><?php the_title(); ?></h2>
          <?php
            $excerpt = get_the_excerpt();
            if ( has_excerpt() ) : ?>
              <p><?php echo get_the_excerpt(); ?></p>
          <?php endif; ?>
          <p><time><?php echo get_the_date("Y.m.d"); ?></time></p>
        </div>
      </a>
    </li>
    <!-- //ここまでループ処理 -->
  <?php endwhile; ?>
</ul>
<?php else : ?>
<!-- 記事がなかったときの処理 -->
<div>
  <p>記事は見つかりませんでした。</p>
</div>
<!-- //記事がなかったときの処理 -->
<!-- 記事データをリセット -->
<?php endif; wp_reset_postdata(); ?>
<!-- //記事データをリセット -->
<!-- //ここまで記事一覧を表示させる処理 -->


<!-- ここからページネーションの処理 -->
<div>
  <!-- 固定ページ用のphpの記述、WP_Queryとpagedがポイント -->
  <?php
  query_posts($query_string);
  query_posts('cat=1,2,3,4,5,7,8,10,11,12,13,14,16&paged='.$paged);
  $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
  $args = array(
    'posts_per_page' => 10,//最大何記事ループさせるか、いらないかも
    'paged' => $paged,
    'post_type' => array(
      'post',//通常はpostだが、カスタム投稿タイプにするとpostの文字列が変わる
    ),
  );
  $the_query = new WP_Query($args);
  ?>
  <?php if(function_exists('wp_pagenavi')){wp_pagenavi(array('query'=>$the_query));} ?>
  <?php wp_reset_postdata(); ?>
</div>
<!-- ここまでページネーションの処理 -->

書いてあるとおりなので、特に解説はしない。無駄で冗長なコードが多いと思うので、改修は必要かと思う。

classは自分でつけたいところにつけて、調整するのがいいかと思う。

記事一覧ページのコードについて

<!-- ここから記事一覧を表示させる処理 -->
<?php $cat = get_the_category(); ?>
<ul href="<?php the_permalink(); ?>" >
  <?php while (have_posts()) :
    the_post(); ?>
    <?php
        // ここから下はカテゴリー一覧を取得するための記述。
        $category = get_the_category();
        $cat_id   = $category[0]->cat_ID;
        $cat_name = $category[0]->cat_name;
        $cat_slug = $category[0]->category_nicename;
    ?>
    <!-- ここからループ処理 -->
    <!-- 中身はclass名を削除している、ソースは任意 -->
    <li>
      <a href="<?php the_permalink(); ?>">
        <div>
          <?php if(has_post_thumbnail()): ?>
            <img src="<?php echo get_the_post_thumbnail_url($post->ID, 'l-size'); ?>" alt="<?php the_title(); ?>">
            <?php else: ?>
              <img src="<?php echo get_stylesheet_directory_uri($post->ID, 'l-size'); ?>/img/sample/sample.jpg" alt="デフォルト画像">
          <?php endif; ?>
        </div>
        <div>
          <div>
            <p><?php echo $cat_name; ?></p>
            <p><time><?php echo get_the_date("Y.m.d"); ?></time></p>
          </div>
          <h2><?php the_title(); ?></h2>
          <?php
            $excerpt = get_the_excerpt();
            if ( has_excerpt() ) : ?>
            <p><?php echo get_the_excerpt(); ?></p>
          <?php endif; ?>
          <p><time><?php echo get_the_date("Y.m.d"); ?></time></p>
        </div>
      </a>
    </li>
    <!-- ここまでループ処理 -->
  <?php endwhile; ?>
</ul>
<!-- ここに記事がなかったときの処理忘れてた(改修時合わせて対応したい) -->
<!-- ここからページネーションの処理 -->
<div>
  <?php if( function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
  <?php wp_reset_postdata(); ?>
</div>
<!-- ここまでページネーションの処理 -->

ここも書いてあるとおりだ。記事がなかったときの場合の記述が抜けているが、これは後日改修できたらと思う。

この実装に、正直かなり時間がかかっている。4時間前後は試行錯誤していたが、それでも納得がいっていない。

ただ、phpやWordPressに関する特徴というか傾向的なものはなんとなく感じ取れてきたので、これからも頑張っていきたい。