2013年8月27日火曜日

WordPress ページナビゲーション制作

ワードプレスのページナビゲーション(記事一覧)をプラグインを使わずに制作します。

プラグインを使わないメリットは、バグ等の回避やバージョンUPに伴う不具合回避出来ます。
プラグインは確かに便利ですが、CMSにとってはトラブルの原因となる確立が高いので、簡単な物であれば、自作する事をお勧めします。
自作する事で、自らのスキルも上がりますから、一石二鳥です。





目的

ページナビゲーションは複数ある一覧リストページを快適に使うためのナビゲーションです。
今回の改造は、元のプログラムでは、現在見ているページを中心に、新旧で2ページ分しか表示しない※1ので、記事量が増えた場合に、最新の記事や古い記事にアクセスしにくいと言う問題を解消する為に、ナビゲーションに最新記事と最古の記事にアクセスすための、ボタンを追加します。

※1表示件数は任意に設定出来ますが、ひとまず書籍通りの内容で話を進めます。




元になるソース

一覧表示が必要な元ファイル。
home.php
category.php
など。

ページナビゲーションを表示したい箇所に、下記phpコードを追加します。

<?php get_template_part('pagenation'); ?>



プログラムファイル
pagenation.php

<?php $maxpage = $wp_query->max_num_pages;
$current = $paged;
if(!$current) {$current = 1;}
?>


<?php
$minpage = 1;
$sidenum = 2;
$shownum = $sidenum * 2+ 1;


if($current > $sidenum && $current < $maxpage-$sidenum+1){
 $start = $current - $sidenum;
 $end = $current + $sidenum;
} elseif($current <= $sidenum) {
 $start = 1;
 $end = min($shownum,$maxpage);
} else {
 $start = max($maxpage-$shownum+1,1);
 $end = $maxpage;
} ?>


<?php if($current <= $sidenum+$minpage): ?>
<?php echo ''; ?>
<?php else: ?>
<a href="<?php echo get_pagenum_link($minpage); ?>">&lt;&lt;</a>
<?php endif; ?>


<?php previous_posts_link('&lt;'); ?>
<?php for($i=$start; $i <= $end; $i++): ?>
 <?php if($i == $current): ?>
 <span><?php echo $i; ?></span>
 <?php else: ?>
 <a href="<?php echo get_pagenum_link($i); ?>"><?php echo $i; ?></a>
 <?php endif; ?>
<?php endfor; ?>
<?php next_posts_link('&gt;'); ?>


<?php if($current >= $maxpage-$sidenum): ?>
<?php echo ''; ?>
<?php else: ?>
<a href="<?php echo get_pagenum_link($maxpage); ?>">&gt;&gt;</a>
<?php endif; ?>


解説

////////// 現在ページへのリンク回避 //////////
<?php $maxpage = $wp_query->max_num_pages;
$current = $paged;
if(!$current) {$current = 1;}
 ?>

これは、現在閲覧しているページへのリンクを設定しない処理です。


////////// 記事リストのループ処理 //////////

<?php
$minpage = 1;
$sidenum = 2;
$shownum = $sidenum * 2+ 1;


if($current > $sidenum && $current < $maxpage-$sidenum+1){
 $start = $current - $sidenum;
 $end = $current + $sidenum;
} elseif($current <= $sidenum) {
 $start = 1;
 $end = min($shownum,$maxpage);
} else {
 $start = max($maxpage-$shownum+1,1);
 $end = $maxpage;
} ?>

ページ表示に必要なループ処理です。
$minpage はページ最小値として1を入れるための変数です。
$sidenum は現在ページを中心に、何ページ表示させるかの変数です。
$shownum は現在ページを中心にして、$sidenum分+1ページ(現在ページ分)を表示させる変数です。

if分以下は表示ループ処理です。



////////// ナビゲーションの表示 //////////


// 最古記事へのリンク処理 //
<?php if($current <= $sidenum+$minpage): ?>
<?php echo ''; ?> ←上のifがtrueならば、非表示(ブランク表示)
<?php else: ?>
<a href="<?php echo get_pagenum_link($minpage); ?>">&lt;&lt;</a>
<?php endif; ?>


最古記事へのリンク処理ですが、最初の1行で最後の記事ページがリストとして表示された場合は、リンクを表示しないように設定しています。




// ページ番号処理 //
<?php previous_posts_link('&lt;'); ?>
<?php for($i=$start; $i <= $end; $i++): ?>
 <?php if($i == $current): ?>
 <span><?php echo $i; ?></span>
 <?php else: ?>
 <a href="<?php echo get_pagenum_link($i); ?>"><?php echo $i; ?></a>
 <?php endif; ?>
<?php endfor; ?>
<?php next_posts_link('&gt;'); ?>


1~順にページ番号を表示させます。また、閲覧中のページにリンクを設定しないようにも、処理をしています。



// 最新記事へのリンク処理 //
<?php if($current >= $maxpage-$sidenum): ?>
<?php echo ''; ?> ←上のifがtrueならば、非表示(ブランク表示)
<?php else: ?>
<a href="<?php echo get_pagenum_link($maxpage); ?>">&gt;&gt;</a>
<?php endif; ?>


最古記事と同様に、ナビゲーションリストに最後のページ番号が表示された時点で、リンクボタンを非表示にしています。

ナビの表示にブランクを使ったのには、ifループで妙な結果を出さない措置です。
もう少し上手い処理の仕方もあるかと思いますが、php初心者に理解しやすい様に、あえてブランクを表示させてあります。

phpを理解している方ならば、この辺りの処理をもう少し綺麗に出来ると思います。