この間のやつをWordPressで実装するとどうなるんだろうと思って、
実装してみました。何処もGETとか使ってなくて、むつかしーなって
思ったんですけど、何となく実装できたんじゃないかなーと思います。
ただ、やたらとコードが長くなった。説明しながら書いていくので
ココが変だよと思ったら教えて下さい。
WordPressの巨匠が書いたのは30行くらいなのになー。
関数定義
前回の記事の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();
ここまでやっといてあれですけど、
正直こっちのコード使った方が良いと思いますよ!



コメントを残す