ワードプレス レスポンシブなページネーション

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

サイトをカスタマイズする何かの拍子なのか、ページネーションのスタイル?がおかしくなりました。
cssを戻しても、テーマをやり直してもindex.phpやfunctions.phpを元に戻しても直らないので
新たにページネーションを作成して設置しました。

以下のページをほとんどコピペしました。
WordPressにレスポンシブのページネーションを設置するカスタマイズ方法

WordPressテーマにページネーションを作成する主な手順は以下です。

1 Font Awesome呼び出しタグを貼り付ける
2 functions.phpにコードを貼り付ける
3 ページネーション用のスタイルシートを貼り付ける
4 ページネーション表示箇所にコードを貼り付ける

1 バズ部のbaseではもともとFont Awesome が入ってますので省略しました。

2 子テーマのfunctions.phpにコードを貼り付け※子テーマにfunctions.phpが無い場合は新たに作成してください。

以下のようにまずはphpを呼び出すコードを書いておきます。

※子テーマのfunctions.phpは上書きではなく追記になります。

<?php 
//ここに処理を記述していきます 
?>
<?php
 //レスポンシブなページネーションを作成する
function responsive_pagination($pages = '', $range = 4){
  $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 '<ul class="pagination" role="menubar" aria-label="Pagination">';
    //先頭へ
    echo '<li class="first"><a href="'.get_pagenum_link(1).'"><span>First</span></a></li>';
    //1つ戻る
    echo '<li class="previous"><a href="'.get_pagenum_link($paged - 1).'"><span>Previous</span></a></li>';
    //番号つきページ送りボタン
    for ($i=1; $i <= $pages; $i++)     {
      if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))       {
        echo ($paged == $i)? '<li class="current"><a>'.$i.'</a></li>':'<li><a href="'.get_pagenum_link($i).'" class="inactive" >'.$i.'</a></li>';
      }
    }
    //1つ進む
    echo '<li class="next"><a href="'.get_pagenum_link($paged + 1).'"><span>Next</span></a></li>';
    //最後尾へ
    echo '<li class="last"><a href="'.get_pagenum_link($pages).'"><span>Last</span></a></li>';
    echo '</ul>';
  }
}
?>

3 ページネーション用のスタイルシートを貼り付ける
私は子テーマの末尾に以下を追記しました。
参考にしたサイトのcssのままだと320pxで表示した時に最初と最後のリンクが表示されませんでした。
これはそれぞれのサイトのcssに依存するのかもしれません。

/************************************
** レスポンシブページネーション
************************************/
.pagination{
  list-style-type: none;
  padding-left: 0;
  margin: 30px 0;
}
.pagination,
.pagination li a {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}
.pagination a {
  font-weight: 300;
  padding-top: 1px;
  text-decoration:none;
  border: 1px solid #ddd;
  border-left-width: 0;
  min-width:36px;
  min-height:36px;
  color: #333;
}
.pagination li:not([class*="current"]) a:hover {
  background-color: #eee;
}
.pagination li:first-of-type a {
  border-left-width: 1px;
}
.pagination li.first span,
.pagination li.last span,
.pagination li.previous span,
.pagination li.next span {
  /* screen readers only */
  position: absolute;
  top: -9999px;
  left: -9999px;
}
.pagination li.first a::before,
.pagination li.last a::after,
.pagination li.previous a::before,
.pagination li.next a::after {
  display: inline-block;
  font-family: Fontawesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  transform: translate(0, 0);
}
.pagination li.first a::before { content: "\f100"; }
.pagination li.last a::after { content: "\f101"; }
.pagination li.previous a::before { content: "\f104"; }
.pagination li.next a::after { content: "\f105"; }
.pagination li.current a {
 /*background-color: #ddd;*/
 cursor: default;
 pointer-events: none;
}
.pagination > li:first-child > a {
  border-bottom-left-radius: 4px;
  border-top-left-radius: 4px;
}
.pagination > li:last-child > a {
  border-bottom-right-radius: 4px;
  border-top-right-radius: 4px;
}
.pagination .current {
    padding: 0px;
    background: #EEE none repeat scroll 0% 0%;
}
@media only screen and ( max-width: 680px ) {
  .pagination li.first,
  .pagination li.last {
    /* screen readers only */
    position: absolute;
    top: -9999px;
    left: -9999px;
  }
.pagination li.previous a { border-left-width: 1px; }
}
@media only screen and ( max-width: 500px ) {
.pagination li {
    /* screen readers only */
    position: absolute;
    top: -9999px;
    left: -9999px;
  }
.pagination li.current,
  .pagination li.first,
  .pagination li.last,
  .pagination li.previous,
  .pagination li.next{
    position: initial;
    top: initial;
    left: initial;
  }
.pagination li.previous a { border-left-width: 0; }
}
@media only screen and ( max-width: 240px ) { /* For watches? */
  .pagination li { width: 50%;}
.pagination li.current {
    order: 2;
    width: 100%;
    border-left-width: 1px;  }}

4 ページネーション表示箇所にコードを貼り付ける
子テーマのindex.phpとarchive.phpに以下のコードを貼り付けました。
※元からあるページネーションはコメントアウトした記述です。

<?php /*if (function_exists("pagination")) {
    pagination($wp_query->max_num_pages);
} */?>
<!--ページネーション-->
<?php if (function_exists('responsive_pagination')) {  responsive_pagination($additional_loop->max_num_pages);
} ?>

こんな感じですが、スマホの時にページが1しか表示されないのがなんとなく気になってます。
後日調整したいと思います。

もしお役に立てたり、クスッとして頂いたりご共感頂けた際にはポチっとして頂けますと記事への情熱になったりしなかったり。。。

  • にほんブログ村 子育てブログへ
  • にほんブログ村 IT技術ブログ WordPressへ

コメント

  1. M より:

    CSSなのですが、
    /* screen readers only */
    のあとの3行はどのような場面で必要でしょうか?
    これらを除くと、スマホでも正しくページネーションが表示されます。

  2. きりんちゃん より:

    おはようございます、検証してみました。
    まずこのページネーションは500pxを分岐点に
    「最初」「前」「1(カレント)」「次」「最後」だけを表示するCSSのようです。
    実際にはページネーションが15あったとします。
    その場合500px以上の時に表示されていた2~15のページネーションがどこに行くのかと申しますと、実際にはあります。
    それをCSSで制御しています。

    それが以下の3行なのです。
    つまり自由に移動できるようにして画面上から見えなくしているわけなのです。
    .pagination li {
    /* screen readers only */
    position: absolute;
    top: -9999px;
    left: -9999px;
    }
    ですので500px以下でもある程度ページネーションの数を出したいなら500pxの分岐をもっと360pxあたりに変更するなど希望に沿った形にするのが良いかと思います。
    またこのcssのままだとそのようにすると5ページ毎のページネーションが折り返してレイアウトが崩れます。
    なので1つ1つのサイズを小さくするなどの調整も必要になりそうです。

    多分この3行を削除するとページネーションが少ない時は気が付かなくとも、多くなった時に隠してあったページネーションが出ている状態なのでデザインが作者の意図とは違うのだと思います。

    とはいえ、好みの問題や微調整で綺麗になりそうです。

    自身が作成したものではないので間違っておりましたらすみません。
    また検証は私の環境の元で行っておりますので、もし3行除くことで綺麗に出るのであればそれで宜しいかと思います!

    久しぶりにこのレスポンシブページネーションについて確認して、内容の再確認ができました。ありがとうございます。

コメントを残す

*

CAPTCHA