♠
Page No.2
と、いうことで、この2ページ目は、パーマリンクを設定してあっても使用可能なページリンクリストの関数となります。まぁ、プラグインに内蔵している関数ともいえますが、実は、この投稿を書きつつ、あらためて見直しているといろいろと気がつくことも多く、ちょこちょことアップデートしたりもしています。次のバージョンアップで適用されるということになりますね。まだ、速くできる部分がありました。
function base_pagenumlink() & make_pagenumlink()
さきに補助的な関数を二つ。
パーマリンクの設定によったりして、なかなか一筋縄ではいかない部分もあったりで、get_pagenum_link() を使うにしろ毎回この関数を呼び出して使うよりも、一度だけ呼び出してあとはページ番号の箇所だけ置換してやれば、その方が高速なんじゃないだろうかという意図で、そのページの基本的なページリンクを返す関数が base_pagenumlin()。
それによって得られた基本的なページリンクのページ番号を置換して、要求されたページ番号でのページリンクにして返すのが make_pagenumlink() 関数ということになりまする。
<?php
// そのページにおいてのページナンバーによる基本的なページリンクを返す
// ちなみに引数として渡される$pagenumの値はそのページの総ページ数+1の値
// 存在しないページ番号でページリンクを作成する。その存在しない番号は置換する目的のため
function base_pagenumlink( int $pagenum = 9999 ) :array {
global $wp_rewrite;
$top_url = get_pagenum_link( 1 );
$base_link = array( '', $pagenum );// 返り値の配列
if ( $pagenum > 1 ) {
if ( $wp_rewrite->using_permalinks() ) {
if ( false === strpos( $top_url, '?' ) ) {
$base_link[0] = trailingslashit( $top_url ) . user_trailingslashit( $wp_rewrite->pagination_base . '/' . $pagenum, 'paged' );
} else {
if ( false === strpos( $top_url, '/?' ) ) {
$slash = '/';
} else {
$slash = '';
}
$base_link[0] = str_replace( '?', $slash . $wp_rewrite->pagination_base . '/' . $pagenum . '/?', $top_url );
}
} else {
if ( false === strpos( $top_url, '?' ) ) {
$connection = '?';
} else {
$connection = '&';
}
$base_link[0] = $top_url . $connection . 'paged=' . $pagenum;
}
}
return $base_link;
}
// base_pagenumlink() で生成した存在しないページ番号のリンクにおいて、その架空の番号を置換する関数
function make_pagenumlink( array $url_el = array(), int $pagenum = 1 ) :string {
$target_url = '';
if ( $url_el ) {
if ( isset ( $url_el[1] ) ) {
$target_url = str_replace( $url_el[1], ( string ) $pagenum, $url_el[0] );
}
}
return $target_url;
}
?>
PHP
function echopagelist() get_pagenum_link版
それでは、ほとんど同じではあるけれど本体の echopagelist() 関数。変わっているのは、ページリンクを上記の関数から取得しているといったことぐらい。
<?php
// $dir -> 要素のid指定 0->bottompagelink、1->toppagelink
// $label -> ページリストのトップページとラストページのラベルの文字列指定、0->Top,End、1->First,Last
// $setting -> 表示するページ番号の個数指定
function echopagelist( int $dir = 0, int $label = 0, int $setting = 0 ) :void {
global $wp_query;
// 同ページ内で二度関数が呼ばれた場合、二度目は一度目のときに生成したものを再利用するため、それを入れておくための変数
// static の変数は関数が終了しても入れた値は保持されている
static $liststr = '';
if ( get_query_var('paged') ) {
$page_no = ( int ) get_query_var('paged');
} else {
$page_no = 1;
}
$page_counts = ( int ) $wp_query -> max_num_pages;
// ページリンクの基本的な文字列を取得、$page_countsに+1しているのは実際にはそのページ数は存在しないから
$base_elurl = base_pagenumlink( $page_counts + 1 );
$params = $_GET;
// direct jump用のinputを表示するための処理
// パーマリンク設定が基本のときのためにurlパラメータを取得
$url_parameter = array();
if ( $params ) {
foreach ( $params as $key => $val ) {
if ( ! is_array( $val ) ) {
if ( 'paged' !== $key ) {
$tmpkey = esc_attr( $key );
$tmpval = esc_attr( $val );
$url_parameter[ $tmpkey ] = $tmpval;
}
}
}
}
//$showjump = 7;
$choices = array( [ 'bottom', 'top' ], [ 'Top', 'First' ], [ 'End', 'Last' ], [ [ 2, 2, 3 ], [ 4, 2, 3 ] ] );
$topnav = $choices[0][ ( $dir & 1 ) ];
$label = $label & 1;// 1 とビットAND させれば得られるのは0か1のみ
$top_label = $choices[1][ $label ];
$last_label = $choices[2][ $label ];
if ( $page_counts > 1 ) {
echo "\n" . '<nav id="' . $topnav . 'pagelink"><div class="wp-pagenavi">
<!-- echo_pagelist built-in ver.5.2 new advanced type-->
<form method="get" class="jump-form" action="">
<span class="pages">' . ( string ) $page_no . '/' . ( string ) $page_counts . '</span>' . "\n";
if ( $liststr ) {// 変数に既に生成されたデータが入っている場合
echo "<!-- reused version page-navi-list -->\n" ;
echo $liststr;
$liststr = '';
} else {
$setting = $setting & 1;
$near = $choices[3][ $setting ][0];// カレントページに接するページの表示数
$far = $choices[3][ $setting ][1];// カレントページから離れているページで10の倍数のページの表示数
$distant = $choices[3][ $setting ][2];// 間隔が100より多い時に、100の倍数のページの表示数。
$page_list = array();// 生成する html を蓄えていく変数
$hiddenclass = ' hiddena';
$karastr = '<span class="hiddena">~</span>';
if ( $page_no !== 1 ) {
$page_list[] = '<a href="' . make_pagenumlink( $base_elurl ) . '" class="first" title="先頭ページへ Jump!">«' . $top_label . '</a>';
$page_list[] = '<a href="' . make_pagenumlink( $base_elurl, $page_no - 1 ) . '" class="previouspostslink" rel="next" title="次のページへ"><</a>';
}
// 表示するページ番号によるリストを取得
$tmplist = make_page_num_list ( $page_no, $page_counts, array( $near, $far, $distant ) );
$keys = array( 'current' => '', 'oneb' => '' );
$numary = array();
// 各ページ番号にリンク要素を付加してhtmlを完成させる
foreach ( $tmplist as $key => $value ) {
$kara = array( $karastr, '*' );
if ( isset( $keys[ $key ] ) or ! $value ) {
$kara = array( '', '' );
}
$page_list[] = $kara[0];
$numary[] = $kara[1];
if ( 'current' === $key ) {
$numary[] = $value[0];
$page_list[] = '<span class="current">' . ( string ) $value[0] . '</span>';
} else {
foreach ( $value as $val ) {
$numary[] = $val;
$valstr = ( string ) $val;
$page_list[] = '<a href="' . make_pagenumlink( $base_elurl, $val ) . '" class="pagelarger' . $hiddenclass . '">' . $valstr . '</a>';
}
}
}
// 余分な'<span class="hiddena">~</span>'を取り除く
$numary = array_values( array_filter( $numary ) );
if ( '*1' === ( $numary[0] . ( string ) $numary[1] ) ) {
$res = array_search( $karastr, $page_list );
if ( false !== $res ) {
unset ( $page_list[ $res ] );
}
}
// 最後に'<span class="hiddena">~</span>'が必要なら付加する
$lastnum = ( int ) end( $numary );
if ( $page_counts !== $lastnum ) {
$page_list[] = $karastr;
}
if ( ( int ) $page_no !== $page_counts ) {
$page_list[] = '<a href="' . make_pagenumlink( $base_elurl, $page_no + 1 ) . '" class="nextpostslink" rel="prev" title="前のページへ">></a>';
}
if ( $lastnum !== $page_counts ) {
$page_list[] = '<a href="' . make_pagenumlink( $base_elurl, $page_counts ) . '" class="last" title="最終ページへ Jump!">' . $last_label . '»</a>';
}
$liststr = implode( '', $page_list );
echo $liststr;
}
// url クエリが存在するならform送信の場合にそれらが付加されるようにする
// if ( $page_counts > $showjunp ) {
if ( $url_parameter ) {
foreach ( $url_parameter as $key => $val ) {
echo '<input type="hidden" name="' . $key . '" value="' . $val . '">';
}
}
echo '<span class="jumpnav"><input type="number" class="jump-field" value="' . ( string ) $page_no . '" name="paged" min="1" max="' . ( string ) $page_counts . '" title="Direct Jump : input page number and enter key." style="width:40px;"></span>';
// }
echo '</form>
</div></nav>';
}
}
?>
PHP
生成された実際の HTML
実際に生成される HTML は下のよう。あっ、ただこれは自サイトであり、パーマリンク設定はデフォルトのままなので、1ページ目の関数の出力となります。自サイト 111 ページのページリンクリストのページ下段にあるキャッシュを使って表示した方のやつ。
<nav id="bottompagelink">
<div class="wp-pagenavi">
<!-- echo_pagelist built-in ver.5.2 new advanced type-->
<form method="get" class="jump-form" action="">
<span class="pages">111/785</span>
<!-- reused version page-navi-list -->
<a href="https://strix.main.jp/" class="first" title="先頭ページへ Jump!">«Top</a>
<a href="https://strix.main.jp/?paged=110" class="previouspostslink" rel="next" title="次のページへ"><</a>
<span class="hiddena">~</span>
<a href="https://strix.main.jp/?paged=90" class="page larger hiddena">90</a>
<a href="https://strix.main.jp/?paged=100" class="page larger hiddena">100</a>
<span class="hiddena">~</span>
<a href="https://strix.main.jp/?paged=109" class="page larger hiddena">109</a>
<a href="https://strix.main.jp/?paged=110" class="page larger hiddena">110</a>
<span class="current">111</span>
<a href="https://strix.main.jp/?paged=112" class="page larger hiddena">112</a>
<a href="https://strix.main.jp/?paged=113" class="page larger hiddena">113</a>
<span class="hiddena">~</span>
<a href="https://strix.main.jp/?paged=120" class="page larger hiddena">120</a>
<a href="https://strix.main.jp/?paged=130" class="page larger hiddena">130</a>
<span class="hiddena">~</span>
<a href="https://strix.main.jp/?paged=200" class="page larger hiddena">200</a>
<a href="https://strix.main.jp/?paged=300" class="page larger hiddena">300</a>
<a href="https://strix.main.jp/?paged=400" class="page larger hiddena">400</a>
<span class="hiddena">~</span>
<a href="https://strix.main.jp/?paged=112" class="nextpostslink" rel="prev" title="前のページへ">></a>
<a href="https://strix.main.jp/?paged=785" class="last" title="最終ページへ Jump!">End»</a>
<span class="jumpnav">
<input type="number" class="jump-field" value="111" name="paged" min="1" max="785" title="Direct Jump : input page number and enter key.">
</span>
</form>
</div>
</nav>
HTML
Post : 2014/11/04 00:28