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
CopyExpand

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
CopyExpand

生成された実際の 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
CopyExpand

Sanbanse Funabashi

Top

スクロールさせるか画像をクリックすると元に戻ります。