HOMEブログWordPressプラグインを使わない WordPressの ページナビゲーション制作

プラグインを使わない WordPressの ページナビゲーション制作

投稿日:2013年08月27日

WordPressの魅力のひとつに、豊富なプラグインがあります。プラグインは非常に便利ですが、反面トラブルの元でもあります。比較的簡単な動作のプラグインであれば自作に挑戦してみることで、スキルUPになります。

ご注意

ブログ移転に伴い、この記事は2013年8月に公開されたブログを一部修正して、再掲載しています。
元のブログはこちらです。
横浜で、ホームページ製作をしている自転車乗りの堅物。 横浜本田WEBブログ

プラグインを使わない 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を理解している方ならば、この辺りの処理をもう少し綺麗に出来ると思います。

お問い合わせはお気軽に

この記事が面白いと思ったら、下のボタンをお願いします。

御社にとってのホームページとは何ですか。

横浜でホームページ製作を始めて、10年以上が経ちます。ホームページ制作会社は、横浜にも数多くありますので、私の様な個人で仕事をしている者へのお仕事依頼はなかなかありませんが、ご相談頂ければ、フットワークの良さと、フレンドリーで身近にお役にたつようなお仕事を心がけております。

ホームページ製作はもちろんのこと、DM製作やパンフレット等の紙媒体の製作も行なっております。

最近は、CMS(主にWordPress・modx)によるホームページ制作を主に行なっております。

直接お話をお伺い出来るエリアは、横浜市内および、横浜近郊の神奈川県。東京都23区の一部とさせて頂いておりますが、エリア外でも対応が可能ですので、まずは、お気軽にご連絡ください。