LLCメニューコンテンツへスキップHomeNewsWorksBlog連載記事のページネーションこの記事は1年以上前に書かれました。内容が古くなっている可能性がありますのでご注意下さい。当サイトのブログは連載記事が多く、しかも複数の連載が同時に進行しています。その結果、ページ下部に表示される前ページと後ページへのリンクが、別の連載記事へのリンクとなってしまうことがあります。これでは不便ですので、連載記事にページネーションを設置するためのWordPressプラグインを開発します。11回連載した「WordPressプラグインの開発」にページネーションを設置すると、第6回の記事では以下のように表示されます。本当は[<][>]のボタンも欲しいのですが我慢します。連載と記事の紐付けが必要であることが分かります。そこで、連載IDと連載名を持つ連載テーブルと、連載IDと記事IDを持つ連載記事テーブルを作成し、...という考えが浮かびますが、そんな面倒なことはしません。テーブルは追加しないショートコードは書かせない専用の管理画面は作らないという方針にします。そこで考えたのが、WordPressの標準機能として用意されているカスタムフィールドの利用です。カスタムフィールドは、記事に追加するメタデータです。連載記事には、以下のようにseries_pagination_idという決められた名前のカスタムフィールドを追加し、値の欄に連載名を記入します。すると、series_pagination_idの値が同じ記事は、同じ連載に属するということになります。そこでプラグインは、現在表示している記事がseries_pagination_idを持つ場合、series_pagination_idの値が同じ記事を探して、ページネーションを作成します。今回作成したプラグインのPHPプログラムは以下のとおりです。);}?>まず最初に、このプラグインが使用するCSSを読み込むためのハンドラを登録します。);実際にCSSを読み込むのはseries_pagination_css()関数です。);}CSSについては後で解説します。ページネーションを表示するのはseries_pagination()関数です。return;}現在の記事にカスタムフィールドseries_pagination_idがあるかどうか調べ、なければ何もせずreturnします。{WP_Query()で、series_pagination_idの値が同じ記事の一覧を取得します。このとき、記事の日付で昇順に検索します。記事が2件以上見つかった場合に、以降の処理を実行します。$num++;ページネーションの全体を、series_paginationというクラスのdiv要素とし、まずは連載名を1つのspan要素として出力します。ループ処理の中で、同じ連載を構成する個々の記事へのリンクをa要素で出力します。このとき、現在表示している記事についてはcurrent_postというクラスにします。ページ番号が9より大きい場合はwideというクラスにしています。これは、桁数が多い場合にボタンの横幅が大きくならないようにするための苦肉の策です。エレガントな方法があれば教えて下さい。$pagination;WP_Query()で新しいループを始めた場合の作法としてwp_reset_postdata()を呼び出してから、できあがったページネーションをechoで出力して終了です。CSSは以下のとおりです。default;}以下、特記すべき点についてのみ解説します。default;}要素をブロック要素とし、横幅を一杯に広げ、テキストをセンタリングします。nowrap;}改行を抑止します。monospace;}paddingで領域を広げ、枠線を付けてボタンらしい外観にします。以下は、wideクラス、current_postクラス、およびlink、visited、hover擬似クラスにおけるa要素の詳細な設定です。default;}wideクラスでは横のpaddingを小さめにし、current_postクラスはデフォルトのカーソルにします。プラグインのプログラムは以上になりますが、まだ重要な作業が残っています。プラグインをインストールし、有効化しても、series_pagination()関数が呼ばれないとページネーションは出力されません。そこで、テーマを編集し、ページネーションを出力したい箇所でseries_pagination()関数を呼び出します。通常は、フッタの直前だと思います。is_single()による判定は、カテゴリー別アーカイブやタグ別アーカイブなどでページネーションを出力させないためです。今回作成したプラグインはこちらからダウンロードできます。Organizerをご利用下さい。