ウェブ
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) ?>
カテゴリーアーカイブやカスタム投稿タイプのアーカイブなど
大概のアーカイブで問題なく使えます。(のはず)
※スタイルは出力しないので各自好みのスタイルを適応して使おう。

 
               
               
             
               
               
             
               
               
            














