ページネーション（ページャー）をプラグインなしで設置する

とてもとてもご無沙汰しておりました。
久しぶりの投稿は、Wordpressでサイトを制作すると必ずと言っていいほど設置する「ページネーション」（ページャー）をプラグインで設置しよう！です。

# はじめに
以前の記事にも書いておりますが、ページネーションなんて、今や簡単にプラグインで設置できるのに何故わざわざ工数を増やすようなことを？と思われるかと思います。私もWordpressでサイト制作をし始めた頃はそう思っていました。
プラグインはインストールして、初期設定をすればサクッと良い機能が実装でき、とても便利です。
でも、プラグインの種類が増えると管理しきれなくなったり、更新されなかったり、なんならバグが出てるのにプラグイン制作者が全然更新してくれないなんてことになりかねず、なんでもかんでもプラグインはどうなの？となったのがきっかけで、サイト制作で標準でつける機能で自作できるものはなるべき自作しよう！となったわけです。

# とりあえず
いつものとりあえず先にコードだけです。

```diff_php
//ページナビゲーション
$args = array(
    'mid_size' => 5, //現在のページの左右にそれぞれ表示するページ番号の数
    'prev_text' => '<i class="fas fa-angle-double-left"></i> 前へ',
    'next_text' => '次へ <i class="fas fa-angle-double-right"></i>',
    'screen_reader_text' => ' ',
);
the_posts_pagination( $args );
```
```diff_css
.nav-links {
	position: relative;
	text-align: center;
	margin: 0;
	padding: 0;
	height: 40px;

	display: flex;
	justify-content: flex-start;
}
	.nav-links a.page-numbers {
	  display: block;
	  margin: 0 2px;
	  padding: 0.5em;
	  border: 1px solid #684736;
	  background: #fff;
	  min-width: 30px;
	  min-height: 40px;
	  text-align: center;
	  position: relative;
	}
		.nav-links span.page-numbers a {
			display: block;
			min-width: 30px;
			min-height: 40px;
			text-align: center;
			color: #684736;
			text-decoration: none;
		}
		.nav-links span.current {
			min-width: 30px;
			min-height: 40px;
			padding: 0.5em;
			text-align: center;
			color: #fff;
			background: #684736;
		}
	.nav-links .prev,
	.nav-links .next {
		display: block;
		min-width: 30px;
		min-height: 40px;
		text-align: center;
	}
```
# 解説
## PHP(Wordpress独自関数）
コードは、Wordpressの標準関数の`the_posts_pagination()`を使用しています。

https://developer.wordpress.org/reference/functions/the_posts_pagination/

※日本語のCodexがなくなってしまった（表示されるけど更新されていない）ので、英語版です。

この関数を追加する位置は、`loop`の外にするようにしてください。
`WP_Query`使っている場合は、`wp_reset_query();`してからその下に追記してください。
でないと、2ページ目以降が正しく表示されません。

```diff_php
//ページナビゲーション
$args = array(
    'mid_size' => 5, //現在のページの左右にそれぞれ表示するページ番号の数
    'prev_text' => '<i class="fas fa-angle-double-left"></i> 前へ',
    'next_text' => '次へ <i class="fas fa-angle-double-right"></i>',
    'screen_reader_text' => ' ',
);
the_posts_pagination( $args );
```
`mid_size`は、`今表示しているページの左右に最大で表示するページ番号の数`です。
あまり数字を大きくすると、ページに収まらなくなるので、ほどほどに。

`prev_text`と`next_text`には、みんな大好きFontAwesomeのアイコンを入れて、テキストは`前へ` `次へ`と入れています。日本語ではなくてもOKです。
![pager02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/599fc458-6835-98a3-86b5-488e53cc2fed.jpeg)

https://fontawesome.com/search

FontAwesomeがサイトの雰囲気に合わないなぁと言う場合は、思い切ってHTMLの特殊記号を使うのもありです。
その場合は、以下の部分を置き換えてください。
```diff_php
    'prev_text' => '&lt;',
    'next_text' => '&gt;',
```

こんな感じで表示されます。
![pager04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/af2417c3-760e-14f0-7bc8-e329f5901bb6.jpeg)


`screen_reader_text`は、スクリーンリーダー向けのテキストを入れるのですが、`the_posts_pagination()`関数は、`h2`タグで囲まれたタイトルがページネーションの上に表示されるので、`' '`で表示しない様にしています。

```diff_php
    'screen_reader_text' => ' ',
```
上記コードだと、`div`の中に`a`タグが表示されますが、`CSS`を適用する時など、`ul` `li`タグで囲みたい場合は、以下のコードを追加してください。
```diff_php
    'type' => 'list',
```
![dev02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/a54f2abd-17bd-5901-0fd0-9f9163f7f99c.jpeg)
こんな感じになりますので、タグに合わせて`CSS`をあててください。

## CSS
デザインは、それぞれのページ番号を箱で囲むデザインにしています。
![pager02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/c282912d-2679-ef02-9732-b567ce33697d.jpeg)
前述した`ul` `li`タグで囲まれているコードではない方に`CSS`をあてています。
![dev.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/778061d5-2f26-55fd-b1c8-d848966b1f1f.jpeg)


```diff_css
.nav-links {
	position: relative;
	text-align: center;
	margin: 0;
	padding: 0;
	height: 40px;

	display: flex;
	justify-content: flex-start;
}
	.nav-links a.page-numbers {
	  display: block;
	  margin: 0 2px;
	  padding: 0.5em;
	  border: 1px solid #684736;
	  background: #fff;
	  min-width: 30px;
	  min-height: 40px;
	  text-align: center;
	  position: relative;
	}
		.nav-links span.page-numbers a {
			display: block;
			min-width: 30px;
			min-height: 40px;
			text-align: center;
			color: #684736;
			text-decoration: none;
		}
		.nav-links span.current {
			min-width: 30px;
			min-height: 40px;
			padding: 0.5em;
			text-align: center;
			color: #fff;
			background: #684736;
		}
	.nav-links .prev,
	.nav-links .next {
		display: block;
		min-width: 30px;
		min-height: 40px;
		text-align: center;
	}
```
現在表示しているページ`current`はリンクなしで表示されるので背景色をつけてます。
`width`も`height`もデバイスサイズで大きさを変えたくないので、`px`で指定しています。

:::note warn
1ページに表示するコンテンツの数は、Wordpressの「設定」→「表示設定」にある「1ページに表示する最大投稿数」が影響します。
ページネーションに表示されているページ数が多いなと感じたら、そちらを調整してください。
ただし、他のアーカイブページにも影響しますので注意が必要です。
:::

# 最後に
以前の記事中でもお伝えしていた様に、Webサイトの標準機能としてページネーションは実装するので、簡単にコピペ出来るように用意しておくと、実装自体も簡単になるかと思います。

過去にあげた「パンくずリストを実装（プラグインなし）も合わせてご覧ください。

https://qiita.com/makkie/items/c7597343e0d040ab08b0

:::note warn
こちらの記事は、一般的なページ構造の「パンくずリスト」のコードを公開しています。
カスタム投稿には対応していませんので、カスタム投稿への対応は、個々に行ってください。
:::