Learning site for website creation

18:一覧表示にページネーションをつける

  • 投稿日:2018年11月04日
  • 更新日:2018年11月06日

管理画面左メニュー「設定」>「表示設定」をクリックします。

投稿一覧の1ページに表示される件数は「1ページに表示する最大投稿数」で決められています。

投稿数が多くなった時はページネーションをつけてすべての投稿にアクセスできるようにします。

ページネーション用関数を作成

どのテンプレートからも呼び出せるよう「functions.php」に関数を定義します。

functions.php

新しく記述

// ページネーション出力用関数
function pagination($end_size = 1, $mid_size = 2, $prev_next = true) {
  global $wp_query;
  $page_format = paginate_links(
    array(
      'current' => max(1, get_query_var('paged')),
      'total' => $wp_query->max_num_pages,
      'type'  => 'array',
      'prev_text' => '前へ',//前へのリンク文言
      'next_text' => '次へ',//次へのリンク文言
      'end_size' => $end_size,//初期値:1  両端のページリンクの数
      'mid_size' => $mid_size,//初期値:2  現在のページの両端にいくつページリンクを表示するか(現在のページは含まない)
      'prev_next' => $prev_next,//初期値:true  リストの中に「前へ」「次へ」のリンクを含むか
    )
  );

  $code = '';
  if( is_array($page_format) ) {
    $paged = get_query_var('paged') == 0 ? 1 : get_query_var('paged');
    $code .= '<div class="pagination">'.PHP_EOL;
    $code .= '<ul>'.PHP_EOL;
    foreach ( $page_format as $page ) {
      $code .= '<li>'.$page.'</li>'.PHP_EOL;
    }
    $code .= '</ul>'.PHP_EOL;
    $code .= '</div>'.PHP_EOL;
    $code .= '<div class="pagination-total">'.$paged.'/'.$wp_query->max_num_pages.'</div>'.PHP_EOL;
  }
  wp_reset_query();
  return $code;
}

グローバル変数「$wp_query」

ページネーション用関数内の先頭で「global $wp_query;」という記述があります。

スコープにより本来は関数外の変数を関数内から参照することはできません。

しかし、global宣言の後に記述したグローバル(関数外)変数はローカルスコープ(関数内)からでも参照できるようになります。

つまり関数外にある「$wp_query」を参照できるようになります。

WordPressのグローバル変数

$wp_query 現在表示しているページのあらゆる情報をもったオブジェクト
$wp_the_query 現在表示しているページのあらゆる情報をもったオブジェクトのバックアップ
$posts クエリー実行により取得したページ一覧オブジェクト配列
$post 現在参照しているページ1件分の情報をもったオブジェクト

「$wp_query」は投稿一覧ページの最大投稿数などあらゆる情報をもっています。

また「get_query_var('paged')」は$wp_queryがもつ現在のページ番号を取得する関数です。

今回は関数内から投稿一覧ページの最大投稿数を取得したり、ページング時のページ番号取得などに使用しています。

WordPressのグローバル変数に値をセットする関数

query_posts() $wp_queryに値をセット
the_post() $postに値をセット

グローバル変数を元の状態に戻す関数

wp_reset_query() $wp_query を $wp_the_query で元の状態に戻す
$post を 元に戻した$wp_query->post で元の状態に戻す
wp_reset_postdata() $post を $wp_query->post で元の状態に戻す

関数内の最後で「wp_reset_query()」を呼び出し、グローバル変数を元の状態に戻しています。

ページネーションを表示する

ページネーションを表示したい場所で「pagination()」を呼び出します。

「pagination()」はHTMLコードを取得するだけなので「echo命令」で表示します。

index.php

ハイライト部分を追記

<?php get_header(); ?>

  <div class="content">
    <div class="main">

      <div class="main-loop">
        <div class="inner">
<?php /***** メインループ開始 *****/ ?>
<?php if (have_posts()) :?>
<?php while (have_posts()) : the_post(); ?>
<?php $id = get_the_ID(); ?>
<?php // リンク ?>
<a class="post-link <?php echo 'post-id'.$id; ?>" href="<?php the_permalink(); ?>">

<?php // アイキャッチ画像 ?>
  <div class="thumbnail">
<?php
if (has_post_thumbnail()) {
  the_post_thumbnail('thumbnail');
}else{
  echo '<img src="'.get_template_directory_uri().'/img/no-image.png" alt="'.get_the_title().'">'.PHP_EOL;
}
?>
  </div>

<?php // タイトル ?>
  <h2 class="title"><?php the_title(); ?></h2>

<?php // カテゴリ文字列 ?>
  <h3 class="category-title">カテゴリ:</h3>
  <ul class="category-list">
<?php
$category_list = get_the_category();
for ($i=0; $i < count($category_list); $i++) :
  $catID = $category_list[$i]->term_id;
  $catName = $category_list[$i]->name;
  $catDescription = $category_list[$i]->description;
  $catColor = '';
  if($catDescription) {
    $catColor = ' style="background-color:'.$catDescription.';"';
  }
?>
    <li class="cat-id<?php echo $catID; ?>"<?php echo $catColor; ?>>
      <?php echo $catName; ?>
    </li>
<?php endfor; ?>
  </ul>

<?php // タグ文字列 ?>
<?php if (has_tag()) : ?>
  <h3 class="tag-title">タグ:</h3>
  <ul class="tags-list">
<?php
$tagList = get_the_tags();
for ($i=0; $i < count($tagList); $i++) :
  $tagID = $tagList[$i]->term_id;
  $tagName = $tagList[$i]->name;
?>
    <li class="tag-id<?php echo $tagID; ?>">
      <?php echo $tagName; ?>
    </li>
<?php endfor; ?>
  </ul>
<?php endif; ?>

<?php // 抜粋文 ?>
  <div class="excerpt"><?php the_excerpt(); ?></div>

<?php // 公開日時 ?>
  <div class="release-date">公開日時:<?php the_time('Y年m月d日'); ?></div>

<?php // 最終更新日時 ?>
  <div class="modified-date">最終更新日時:<?php the_modified_date('Y年m月d日'); ?></div>
</a>

<?php endwhile; ?>
<?php else: ?>
<div class="no-post">
  <div class="inner">
    <p>記事が存在しません</p>
  </div><!-- /.inner -->
</div><!-- /.no-post -->
<?php endif; ?>
<?php /***** メインループ終了 *****/ ?>

<?php // ページネーション ?>
<?php if (pagination()) : ?>
    <div class="pagination"><?php echo pagination(); ?></div>
<?php endif; ?>

        </div><!-- /.inner -->
      </div><!-- /.main-loop -->
    </div><!-- /.main -->
    <?php get_sidebar(); ?>
  </div><!-- /.content -->


<?php
get_footer();

HTML出力

echo pagination()の出力結果

  <ul>
    <li><span aria-current="page" class="page-numbers current">1</span></li>
    <li><a class="page-numbers" href="http://localhost/lesson1/page/2/">2</a></li>
    <li><a class="page-numbers" href="http://localhost/lesson1/page/3/">3</a></li>
    <li><a class="page-numbers" href="http://localhost/lesson1/page/4/">4</a></li>
    <li><a class="next page-numbers" href="http://localhost/lesson1/page/2/">次へ</a></li>
  </ul>
  <div class="pagination-total">1/4</div>

ページネーション用のデザイン

style.css

/* ========================================== */
/*ページネーション*/
.pagination ul {
  list-style: outside none none;
  padding: 0;
  text-align: center;
}
.pagination li {
  display: inline-block;
  margin: 5px;
}
.page-numbers {
  border: 1px solid;
  padding: 5px 10px;
  text-decoration: none;
  color: #333;
}
.page-numbers:hover {
  background-color: #fcc;
}
.page-numbers.current {
  background-color: #fcc;
}

.post_category .other {
  background-color: red;
}

このページで出てくる関数

WordPress関数は「公式サイトのドキュメント」で確認しましょう。

WordPress関数

paginate_links()

get_query_var()

wp_reset_query()

PHP関数

max()

is_array()

 

欠席者対応:wireframe06