
この間のやつをWordPressで実装するとどうなるんだろうと思って、
実装してみました。何処もGETとか使ってなくて、むつかしーなって
思ったんですけど、何となく実装できたんじゃないかなーと思います。
ただ、やたらとコードが長くなった。説明しながら書いていくので
ココが変だよと思ったら教えて下さい。
WordPressの巨匠が書いたのは30行くらいなのになー。
INDEX
関数定義
前回の記事のPHPコード関数化できる部分は関数化しました。
こっからそのコードを書きます。functions.phpに書いてください。
functions.php
function gcheck(&$page) { if(empty($page)) { $page = 1; return $page; } else { $esc = htmlspecialchars($page,ENT_QUOTES); $page = intval($esc); if(empty($page)) { gcheck($page); } else { return $page; } } } function getpagenum($postcount,$page,$splitnum,$displayrow) { $num = func_num_args(); if($num !== 4) { return false; } $result[0] = $postcount%$displayrow == 0 ? intval($postcount/$displayrow) : intval(ceil($postcount/$displayrow)); $result[1] = $page>$splitnum/2 ? intval($page-floor($splitnum/2)): 1; $result[2] = $result[1]+($splitnum-1); if($result[2]>$result[0]) { $result[2] = $result[0]; } return $result; } function getdataindex($page,$displayrow) { $result[0] = $page-1<0 ? 1 : $page-1; $result[1] = $result[0]*$displayrow; $result[2] = $displayrow-1+$result[1]; return $result; }
パラメタをセット
次にページネートを表示させるファイルで
パラメタを作ります。別に何処で作っても良いんですけどネ。
ただ、セットは表示させたいファイルでしてください。
$page = !empty($paged) ? $paged : 1; //実質GETの変数を受け取って gcheck($page); //サニタイズする必要ないかもですが念の為 $splitnum = 5; // 常に出力するページ数 $displayrow = 10; // その中で何項目を出力するか //クエリへ投げるパラメタ $pm = array( 'post_type' => array('post'), //投稿タイプ指定 'post_status' => array('publish'), //公開済み限定 'nopaging' => true, //よくわかんない。 ); $obj = new WP_Query($pm); //オブジェクト取得 $postcount = $obj->found_posts; //結果に対しての総件数の取得 //作った関数をへパラメタを投げる //投げたら配列で返ってくるので順番に変数に入れる list($max,$sp,$gp) = getpagenum($postcount,$page,$splitnum,$displayrow);
$maxは総ページ数
$spは出力するページの始点
$gpは出力するページの終点
出力プログラム
流れとして、$spから$gpまで回します。
出力した番号にAタグをつるので、$formatは、
そこへのリンクを作ってます。かなり無理やり。
とりあえず出力するだけならこれで終わりです。
for($i=$sp; $i<=$gp; $i++) { $format = home_url()."/page/".$i."/"; if($page == $i) { echo "<a class=\"active\" href=\"".$format."\">".$i."</a> "; } else { echo "<a href=\"".$format."\">".$i."</a> "; } }
前へ、次へを付けたい場合は
$next = $page+1<=$max ? $page+1 : false; $prev = $page-1<0 ? false : $page-1; //番号出力 if($prev) { $format = home_url()."/page/".$prev."/"; echo "<a href=\"".$format."\">« 前へ</a>"; } for($i=$sp; $i<=$gp; $i++) { $format = home_url()."/page/".$i."/"; if($page == $i) { echo "<a class=\"active\" href=\"".$format."\">".$i."</a> "; } else { echo "<a href=\"".$format."\">".$i."</a> "; } } if($next) { $format = home_url()."/page/".$next."/"; echo "<a href=\"".$format."\">次へ »</a>"; }
こうなります。
データの出力
データの出力は関数に現在のページ番号をと、
出力したい件数データを渡して、
ページ番号*出力したい件数と
出力したい件数-1+さっきの計算結果を取得して
その値を条件つけて回します。
回してる間、WP_Queryオブジェクトのpostsにアクセスし続けて
データを取っていきます。
list($loc,$getstart,$getend) = getdataindex($page,$displayrow); for($i=$getstart; $i<=$getend; $i++) { echo "<pre>"; var_dump($obj->posts[$i]->post_title); echo "</pre>"; }
こんな感じでできると思います。
コード全文
コピペできるようにコード貼っときます。
functions.php
function gcheck(&$page) { if(empty($page)) { $page = 1; return $page; } else { $esc = htmlspecialchars($page,ENT_QUOTES); $page = intval($esc); if(empty($page)) { gcheck($page); } else { return $page; } } } function getpagenum($postcount,$page,$splitnum,$displayrow) { $num = func_num_args(); if($num !== 4) { return false; } $result[0] = $postcount%$displayrow == 0 ? intval($postcount/$displayrow) : intval(ceil($postcount/$displayrow)); $result[1] = $page>$splitnum/2 ? intval($page-floor($splitnum/2)): 1; $result[2] = $result[1]+($splitnum-1); if($result[2]>$result[0]) { $result[2] = $result[0]; } return $result; } function getdataindex($page,$displayrow) { $result[0] = $page-1<0 ? 1 : $page-1; $result[1] = $result[0]*$displayrow; $result[2] = $displayrow-1+$result[1]; return $result; }
example.php(表示したいファイル)
//番号出力パラメタ作成 $page = !empty($paged) ? $paged : 1; gcheck($page); //getのサニタイズ $splitnum = 5; //何ページ出すか $displayrow = 10; //何項目出すか $pm = array( 'post_type' => array('post'), 'post_status' => array('publish'), 'nopaging' => true, ); $obj = new WP_Query($pm); $postcount = $obj->found_posts; //パラメタセットして、返り値を代入 list($max,$sp,$gp) = getpagenum($postcount,$page,$splitnum,$displayrow); $next = $page+1<=$max ? $page+1 : false; $prev = $page-1<0 ? false : $page-1; //番号出力 if($prev) { $format = home_url()."/page/".$prev."/"; echo "<a href=\"".$format."\">« 前へ</a>"; } for($i=$sp; $i<=$gp; $i++) { $format = home_url()."/page/".$i."/"; if($page == $i) { echo "<a class=\"active\" href=\"".$format."\">".$i."</a> "; } else { echo "<a href=\"".$format."\">".$i."</a> "; } } if($next) { $format = home_url()."/page/".$next."/"; echo "<a href=\"".$format."\">次へ »</a>"; } //データの出力パラメタセット list($loc,$getstart,$getend) = getdataindex($page,$displayrow); for($i=$getstart; $i<=$getend; $i++) { echo "<pre>"; var_dump($obj->posts[$i]->post_title); echo "</pre>"; } wp_reset_postdata();
ここまでやっといてあれですけど、
正直こっちのコード使った方が良いと思いますよ!