ウェブ
FRIDAY 2019 / 7 / 26
コピペで簡単!wordpressでアーカイブページのページャーの数字の数を固定する。<wordpress><pager><archive>
Text by Shinji Sato
こんにちは。
佐藤です。
wordpressのアーカイブページでページャーを
設置する関数「the_posts_pagination()」
とても便利なこの関数ですが、表示するページ番号の数が
「左右にそれぞれ表示するページ番号の数」
となっており、最初や最後のページと、
中間あたりのページで表示される数が倍半分違ってきます。
それを解消するために、
その都度アーカイブに合わせたページャーを制作して使用していたのですが、
だんだん面倒になって来たので汎用的なものを作りました。
せっかくなので紹介します。
まず以下のコードをfunction.phpにコピー&ペースト
/*
* original_pager
*
* ワードプレスのアーカイブページのページャーを作成する。
*
*
* @param array $args {
* @type string prev_text :前ページリンクのテキスト、空にすると非表示。初期値、'←'.
* @type string next_text :次ページリンクのテキスト、空にすると非表示。初期値、'→'.
* @type string first_text :最初のページへのリンクのテキスト、空にすると非表示。初期値、'first'.
* @type string last_text :最後のページへのリンクのテキスト、空にすると非表示。初期値、'last'.
* @type int visit_nth :currentページを含む総ページ数。奇数を入力、偶数設定の場合は+1した場合と同じ結果。初期値、5.
* @type boolean last_number :最後のナンバーが表示がされていない時に「...12」の様な表示をする。初期値、true.
* @type string output :'return'もしくは'echo'を指定。'return'にすると文字列を返す。初期値、'echo'.
* }
*/
function original_pager($args = null){
global $wp_query;
$my_setting = array(
'prev_text' => '←',
'next_text' => '→',
'first_text' => 'first',
'last_text' => 'last',
'visit_nth' => 5,
'last_number' => true,
'output' => 'echo',
);
if(is_array($args)) $my_setting = array_merge($my_setting,$args);
//url関係
$now_page_data = parse_url($_SERVER["REQUEST_URI"]);
$base_url = preg_replace('/\/page\/.*/','/',$now_page_data['path']);
$url_query = $now_page_data['query'] ? '?'.$now_page_data['query'] : '';
$max_page = intval($wp_query->max_num_pages);
$page_nth = (get_query_var('paged')) ? get_query_var('paged') : 1;
$last_page = "{$base_url}page/{$max_page}/{$url_query}";
//次のページと前のページの取得
$next_page = $my_setting['next_text'] ? get_next_posts_link($my_setting['next_text']) : 'hidden';
$prev_page = $my_setting['prev_text'] ? get_previous_posts_link($my_setting['prev_text']) : 'hidden';
//数字の左と右の表示数を設定
if($my_setting['visit_nth']%2==0){
$base_nth = $my_setting['visit_nth']/2 ;
}else{
$base_nth = ($my_setting['visit_nth'] - 1) / 2;
}
////前
if(($max_page - $page_nth) < $base_nth){
if($base_nth * 2 - ($max_page - $page_nth) >= $page_nth){
$mae = $page_nth-1;
}else{
$mae = $base_nth * 2 - ($max_page - $page_nth);
}
}else{
if($base_nth >= $page_nth){
$mae = $page_nth - 1;
}else{
$mae = $base_nth;
}
}
////後
if($base_nth >= $page_nth){
if($base_nth*2 - $mae >= $max_page - $page_nth){
$ato = $max_page - $page_nth;
}else{
$ato = $base_nth*2 - $mae;
}
}else{
if($base_nth >= $max_page - $page_nth){
$ato = $max_page - $page_nth;
}else{
$ato = $base_nth;
}
}
////点々表示
$key = false;
if(($ato + $page_nth) < $max_page){
$key = true;
}
$html = '<nav class="pager">';
//最初
if($my_setting['first_text']){
if($page_nth !== 1){
$html .= "<p class=\"first\"><a href=\"{$base_url}{$url_query}\">{$my_setting['first_text']}</a></p>";
}else{
$html .= "<p class=\"first\"><span class=\"no-link\">{$my_setting['first_text']}</span></p>";
}
}
//前
if($prev_page !== 'hidden' && $prev_page){
$html .= "<p class=\"prev\">{$prev_page}</p>";
}elseif(!$prev_page){
$html .= "<p class=\"prev\"><span class=\"no-link\">{$my_setting['prev_text']}</span></p>";
}
//数字関係
$html .= '<p class="nth-box">';
////前の数字
while($mae>0){
$mae_nth = $page_nth - $mae;
$html .= "<a href=\"{$base_url}page/{$mae_nth}/{$url_query}\">{$mae_nth}</a>";
$mae--;
}
////現在
$html .= "<span class=\"current no-link\">{$page_nth}</span>";
////後の数字
$i = 1;
while($ato>0){
$ato_nth = $page_nth + $i;
$html .= "<a href=\"{$base_url}page/{$ato_nth}/{$url_query}\">{$ato_nth}</a>";
$ato--;
$i++;
}
////数字それ以上
if($key && $my_setting['last_number']){
$html .= <<<EOT
<span class="tenten">...</span>
<a href="{$base_url}page/{$max_page}/{$url_query}" class="last-nth">{$max_page}</a>
EOT;
}
$html .= "</p>";
//次
if($next_page !== 'hidden' && $next_page){
$html .= "<p class=\"next\">{$next_page}</p>";
}elseif(!$next_page){
$html .= "<p class=\"next\"><span class=\"no-link\">{$my_setting['next_text']}</span></p>";
}
//最後
if($my_setting['last_text']){
if($page_nth !== $max_page){
$html .= "<p class=\"last\"><a href=\"{$last_page}\">{$my_setting['last_text']}</a></p>";
}else{
$html .= "<p class=\"last\"><span class=\"no-link\">{$my_setting['last_text']}</span></p>";
}
}
$html .= "</nav>";
if($my_setting['output'] == 'echo'){
echo $html;
return;
}else{
return $html;
}
}
その後archive.phpのページャを出力したい箇所に以下を記述するとその場所にページャーが出力されます。
<?php original_pager() ?>
この時引数に配列で値を渡してやることで色々設定可能です。
効果のある設定と初期値は以下の通りです。
$args = array( 'prev_text' => '←', 'next_text' => '→', 'first_text' => 'first', 'last_text' => 'last', 'visit_nth' => 5, 'last_number' => true, 'output' => 'echo', );
●prev_text (string)
前ページリンクのテキスト、空にすると非表示。
●next_text (string)
次ページリンクのテキスト、空にすると非表示。
●first_text (string)
最初のページへのリンクのテキスト、空にすると非表示。
●last_text (string)
最後のページへのリンクのテキスト、空にすると非表示。
●visit_nth (int)
currentページを含む総ページ数。奇数を入力、偶数を入力した場合は+1場合と同じ結果。
●last_number (boolean)
最後のナンバーが表示されていない時に「…12」の様な表示をする。
●output (string)
‘echo’もしくは’return’。
‘return’を指定すると文字列を返す。
入力例:
$args = array( 'prev_text' => '←', 'next_text' => '→', 'first_text' => '', 'last_text' => '', 'visit_nth' => 7, 'last_number' => false, 'output' => 'echo', ); <?php original_pager($args) ?>
カテゴリーアーカイブやカスタム投稿タイプのアーカイブなど
大概のアーカイブで問題なく使えます。(のはず)
※スタイルは出力しないので各自好みのスタイルを適応して使おう。
















