cpコマンドでホスト・コンテナ間のファイルのコピーをするなるべくプラグインに頼らない勢WordPressでページネーションを行いたい時プラグインを使う人も多いかと思います。プラグインをつかうと簡単にページネーションを実現できるので、もちろんそれでもいいのですが、ページネーションの仕組みを知っておくとよりカスタマイズが捗るかもしれません。実のところプラグインを使わなくても意外と簡単にページネーションを実装することができます。@MINOはなるべくプラグインに頼らない勢です。WordPressはURLを解析しているWordPressではURLを解析して表示すべきページを決定しています。WordPressはデフォルトで以下のようなパーマリンクを生成します。http://hogehoge.com/?p=1027このURLでアクセスされると、WordPress内部では解析結果を元に表示すべき「IDが1027の投稿」をデータベースから探し、適切なテンプレートファイルにて出力します。ページネーションを表すURLさてページネーションを表すURLとはどういった感じでしょうか?こんな感じになります。http://hogehoge.com/?paged=2このURLはデフォルトではTOP画面(index.php)に対してのアクセスになるはずです。このURLでアクセスされた場合、paged=2という情報からWordPressは「1ページに表示する投稿数」を元にして、2ページ目に表示される投稿をデータベースから探します。「1ページに表示する投稿数」が10の場合、(デフォルトでは新しい投稿順にて)11投稿目から20投稿目までが2ページ目に表示されるべき投稿になります。paged=3なら3ページ目で21投稿目から30投稿目まで、paged=8なら8ページ目で71投稿目から80投稿目までと言った具合です。投稿の総数も関係します。100記事あるブログでは11ページ目には表示できる投稿はなくなります。100記事あるブログでは以下のURLを何らかの方法で動的に生成できればページネーションを実現できるということになります。http://hogehoge.com/?paged=1http://hogehoge.com/?paged=2http://hogehoge.com/?paged=3http://hogehoge.com/?paged=4http://hogehoge.com/?paged=5http://hogehoge.com/?paged=6http://hogehoge.com/?paged=7http://hogehoge.com/?paged=8http://hogehoge.com/?paged=9http://hogehoge.com/?paged=10便利なことに、これらのURLをアクセスされたURL解析の結果から動的に生成してくれるpaginate_linksという関数があります。paginate_linksをつかってページネーションを実装するpaginate_linksオプションまずはpaginate_linksのオプションです。多いですが、全部使わないといけないわけではないデス。ページ番号のリストの両端(最初と最後)にいくつの数字を表示するか。次ページへのリンクとして表示する文言。なしページネーションのコードpaginate_linksでページネーションを実装するには以下の様にします。paginate_links($arg);?>このコードで以下のような出力が得られます。»</a></div>コードの設置はループ内である必要はありません。ページネーションが出力されて欲しい場所に記述すればOKです。paginate_linksのコードの詳細説明コードでやっていることを説明します。9999999999;変な数字。これは後で文字列(URLを)を変換するときに用います。以下の部分でベースのURLを生成します。),str_replace関数は文字列を指定した文字列でリプレイス(差し替え)する関数です。これは置いおいて、かっこの中身を先に見て行きましょう。関数でURLの無害化(サニタイズ)を行います。これはなくてもページネーションは動きますが、もし仮に悪意のあるURLでアクセスされたら予期しないURLを生成できてしまうかもしれません。セキュリティを固くする為、書いておいたほうが良いです。get_pagenum_link関数get_pagenum_link関数もWordPressの関数で引数で与えられた数字を元にページ番号のリンクを返します。http://hogehoge.com/?paged=9999999999/str_replace関数さてstr_replace関数ですが、今までのことを踏まえると、「ページ番号のリンクの$bigに該当する場所を'%#%'で置き換える」という処理をしています。なんで999999999なんて変な数字をつかっている理由は、ありえない数字であればURL内のどこにもかぶることがないから、リプレイスの間違いがなくなるためです。短い数字とかアルファベット(そもそもget_pagenum_linkはアルファベットを引数にできない)だとURLにそれが含まれていた場合、そこがリプレイスされて欲しいURLが得られないことになりかねません。今までの処理でbaseには以下のようにURLが設定されたことになります。以下のコードで現在ページを取得しています。関数はWordPressの関数で、指定したクエリデータを取得します。ここではpagedを取得しているので、「現在のページ」を得ることができます。これはアクセスされたURLを解析した結果です。0が返ってくる場合もあります。いうのもhttp://hogehoge.com/というURLはなんのクエリも含みません。この場合pagedは0で取得されます。現在ページが0になってしまうとpaginate_linksの挙動がおかしくなります。そのためにmax関数を使って、1以上の値を出す様にしています。max関数は与えられた数値(配列)の中で一番大きな数字を返します。その為、pagedが0の場合は予め設定していた1が返ることになります。ifで条件分岐できますが、max関数で要件を満たしているので大丈夫です。いった処理でcurrentには1以上の現在ページ番号が入ることになります。1ページに表示する投稿数」がページネーションのページ数になりますので必須のオプションです。$wp_queryオブジェクトのプロパティmax_num_pagesから取得します。$wp_query->max_num_pagesつまり100記事で「1ページあたりの表示投稿数」が10なら、10ページ目(つまり10)がmax_num_pagesとなるわけです。「1ページあたりの表示投稿数」は管理画面からでも変更できますので、この数値は可変です。10が判明するので、これらの情報をもとにpaginate_linksがよしなにページリンクを出力してくれるのです。応用編リスト形式で出力デフォルトではaタグで出力されますが、リストで出したい場合もあると思います。そんな時はtypeオプションにlistを設定すると実現できます。var_dump(paginate_links($arg));?>このようにulリスト形式で出力されます。»</a></li></ul>配列で出力リンクのみが欲しい場合はtypeオプションにarrayにします。var_dump(paginate_links($arg));?>このように配列でリンクを得ることができます。»</a>"}foreachなどで回してあげれば、独自にページネーションを組むことができるでしょう。CSSpaginate_linksで出力されたaタグおよびspanタグにはpage-numbersというクラスが付きます。現在ページを表す場合にcurrentクラスが付きます。次へリンクにはnextクラスが、前へリンクにはprevクラスが付きます。»</a>なのでこれらのクラスをつかってcssを定義することで見た目をカスタマイズすることが可能です。いい例ではないですがこんな感じで装飾できます。補足・ハマったポイント独自クエリでのページネーションWordPressではWP_Queryクラスに引数を与えて独自にnewすることができます。して得られたオブジェクトはURL解析とは別な条件で投稿等を表示させることができ便利です。この独自クエリにページネーションを施す際の注意点があります。以下のようにして独自にWP_Queryオブジェクトを得たとします。WP_Query($arg);この$my_query(WP_Queryオブジェクト)には公開されている投稿が日付順にすべて格納されます。下記はこのオブジェクトでループを回した例です。ここでも前述した方法でページネーションを出力しています。ページネーション機能せずしかしこのままではページネーションは出力はできますが、リンクをクリックしてもページ遷移は行われません。2ページ目には行かないのです。これはこの記事の最初で説明した件が関わっています。WordPressではURLを解析して表示すべき投稿(またはページ)を決めていると説明しましたが、その解析を行っているのは(正確には解析の結果が入るのが)WP_Queryオブジェクトである$my_queryです。新たに独自で作った$my_queryには与えられた引数の解析の結果(引数からSQL文がつくられデータベースから投稿を取得します)が入ります。URLを解析した結果が入るわけではありません。入るのではなく、グローバルの$wp_queryに入ります。このままでは$my_queryにはpaged=2(2ページ目)という解析結果は伝わりません。2ページ目であることが伝わらないのでずっと1ページ目が表示されてしまうのです。なんらかの方法で2ページ目であることを取得する必要があります。get_query_var関数です。この関数はグローバルオブジェクトの$wp_queryから欲しい情報を取得してくれます。今回欲しいのはpagedの情報です。以下のようにして取得できます。get_query_var('paged')$myQueryにいま何ページ目なのかを伝えるには以下のように'paged'=>get_query_var('paged')を引数に加えます。'paged'は「現在ページ」を示します。2なら2ページ目で、4なら4ページ目です。)を15にしていますから2ページ目は16投稿目〜30投稿目で、4ページ目は46投稿目〜60投稿目までが表示されます。ページ遷移が可能になるこれでURLの解析結果は$wp_queryを介して$my_queryに伝わります。URLがhttp://hogehoge.com/?paged=2なら'paged'に2が入りますし、http://hogehoge.com/?paged=4なら'paged'に4が入ります。ページネーションのリンクをクリックされるごとに'paged'が更新され、表示すべきページが表示されることになりマス。mino長年働いていた会社をリストラされてしまったおっさん。なにを思ったか未経験のプログラミングで再起を図ろうとする。プログラミングを勉強していく上で苦しんだこと、ハマったことを中心に記事を書きます。