WordPressはアーカイブをページネーションしたり、投稿や固定ページが長文になった時に改ページを入れてページ分割することができます。
アーカイブのページネーションはいじることはあまりないと思いますが、投稿や固定ページで自動的に改ページを入れられたらと思うことは多いと思います。
この記事では、Wordpressの記事をPHP経由で改ページを挿入するカスタマイズをご紹介します。
あまり見かけない内容なので、もしかしたら探している人の参考になるかもしれません。
WordPressのページネーションが使われる場面は3通りある
WordPressのページネーションは、カテゴリアーカイブなどのページでは普通に表示されるものです。この処理はメインループになります。
WordPressには記事内の改ページ機能があり、改ページがある場合、記事がページ分割されてページネーションが表示されます。
通常の場面では出てきませんが、固定ページなどでサブループでページネーションを表示させる場面もあります。
まとめると、Wordpressのページネーションは一つのページが複数のページに分割されて表示される場合に必要で、以下の2つの場合に表示されます。
- WordPressにあらかじめ用意されている機能で実現
- アーカイブページ等の記事一覧(メインループ処理)のページネーション
- 記事内の改ページによるページネーション
- プラグインを使って実現
- サブループによるページネーション(wp-pagenaviプラグインを使用)
この記事では、記事内の改ページを使ったページネーションを対象にします。
wordpressの改ページはどうやって実現しているのか?
原理的な部分は完全に追い切れていないのですが、Frontendとしては投稿内に<!–nextpage–>があればよく、Wordpressは記事を読みだしたときに改ページがあるものとして処置します。
ポイントは、『記事を読みだしたとき』という部分です。
実は、記事を読みだした後で改ページを追加してもうまく処理されません。
読みだす直前に追加しなければいけません。
でも、DBを書き換えるわけにもいきませんので、ここで悩む人が多いと思います。
検索すると見つかる記事は・・・
私はタームの一覧を出力する固定ページにページネーションを付けたいと思って、それらしい記事を検索した時に見つかったのが以下の記事でした。
この記事の通りに行うとページネーションが表示されるのですが、リンク先が1ページ目の表示になってしまいました。
つまり1ページ目以外表示できない。
処理上は分割もされていて、ページネーションも出力されるんだけど、リンク先が表示できない。
以前は動いたのかもしれませんが、2024年では動かないコードです。
また、テンプレート直書きなので、専用の固定ページテンプレートを作らないといけないのも避けたいです。
改ページを追加する処理は、the_postsフィルターを使うと上手くいく
改ページの処理を実際に行うのは、setup_postdata()です。
この処理で読みだされる前に改ページを追加する必要があります。
参考記事の内容は正しいのですが、自前でsetup_postdata()を呼び出しているので、Wordpressに上手く認識されないのかもしれないので、別の方法を考える必要がありました。
setup_postdata()が読みだす前にフックで書き換えてあげる必要があります。
具体的には、the_postsフィルターフックを使います。
add_filter( 'the_posts', function( $posts ){
if( ! is_admin() && (
is_page('xx')||
is_page('yy')||
is_page('zz')
)
){
$posts=array_map('add_page_break',$posts);
}
return $posts;
},999);
function gen_termlist($post){
// $post_contentに改ページを追加する
$post->post_content = $html;
return $post;
}
まとめ
あまり使われた例を見かけないのですが、the_postsフィルターフックを使うと、後から改ページを追加しても、ページネーションが正しく動作するようになります。