メシのタネ

Webプログラミング 備忘録

  • DOMをPHPで操作できたらいいよね

    そうだよね。そう思うよね。JavaScriptでやると、画面がガタついたりするもんね。そうならないようにする方法もあるかもしれないけど、僕はできませんので、サーバー側でなんとかできたらええなぁと思って挑戦したけど、できませんでしたよ。PHP標準でHTMLをDOMにできるらしい今、技[...]

    続きを読む
  • 設計書ってなんで書くの?

    設計書をなぜ書くのかから始めてかれこれ3年近くこの禅問答をやっているわけですが、いまだに答えは出ません。ただ、その禅問答をやる中で設計書に対する取り組み方は大きく変わったので、その一部でも書いていきたい。基本設計はとにもかくにも必要だと思う設計書はいらぬ!という話をよく聞くし、自分[...]

    続きを読む
  • 書ききってやる。

    久々に書いてみる。久々に文章を書くということをやってみようと思う。伝える作業を観察したいと思ったからそうしたいと考えた。情緒的な文章は基本的にゴミ箱にぽいしてきましたが、情緒的なのも自分だと思う。「文章をかくという作業は、とりもなおさず自分と自分をとりまく事物との距離を確認すること[...]

    続きを読む
  • 普通の会社で2年普通に働いて思う事

    えらい寒くなりました。文句言いながらも現職を続けて2017年12月1日にめでたく2年がたちました。分かりやすいが乱暴に言えばITドカタと呼ばれる業界に入って案件のヒエラルキーの無慈悲さを痛感しながらも、それでもしょうがないと頑張る人たちに心を打たれながら「じゃあ俺も」と頑張れない自分に挫折して、とあ[...]

    続きを読む
  • jQueryUiのDatepicker利用時にminDate設定するとバグる件

    題名の通りなんですが、DatepickerでminDate使うとバグります。また後でキャプチャ見て貰いますけど、灰色の部分が、minDateで設定した日付が反復して出るようになるんですね。こういうの気が付かない人がいるかも知れませんが、ChoromeでminDate設定してる人は気にしてみてくだ[...]

    続きを読む

【WordPress】paginate_linksを使わずにページネート実装する。

wp_page1

この間のやつを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>&nbsp;";
          } else {
               echo "<a href=\"".$format."\">".$i."</a>&nbsp;";
          }
     }

前へ、次へを付けたい場合は


     $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."\">&laquo; 前へ</a>";
     }    
    
     for($i=$sp; $i<=$gp; $i++)
     {
          $format = home_url()."/page/".$i."/";
          if($page == $i)
          {
               echo "<a class=\"active\" href=\"".$format."\">".$i."</a>&nbsp;";
          } else {
               echo "<a href=\"".$format."\">".$i."</a>&nbsp;";
          }
     }

     if($next)
     {
          $format = home_url()."/page/".$next."/";
          echo "<a href=\"".$format."\">次へ &raquo;</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."\">&laquo; 前へ</a>";
     }    
    
     for($i=$sp; $i<=$gp; $i++)
     {
          $format = home_url()."/page/".$i."/";
          if($page == $i)
          {
               echo "<a class=\"active\" href=\"".$format."\">".$i."</a>&nbsp;";
          } else {
               echo "<a href=\"".$format."\">".$i."</a>&nbsp;";
          }
     }

     if($next)
     {
          $format = home_url()."/page/".$next."/";
          echo "<a href=\"".$format."\">次へ &raquo;</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();

ここまでやっといてあれですけど、
正直こっちのコード使った方が良いと思いますよ!

関連記事

コメントをお待ちしております