
同じカテゴリーの記事を順番に読みたいのに、「次へ」のリンクを押したら別のカテゴリーに切り替わってしまった……
このシリーズ記事を最初から読みたいのに、最初の記事どこ!? ひたすら「前へ」をクリックして戻るのが面倒!
Webサイトのページ送りでイライラ、モヤっとする、そんな経験、ありませんか?
WordPress ではカテゴリーやタグで投稿を細かく分類できますが、標準のページネーションではカテゴリーごとに記事を順番に読むことができません。せっかくサイト管理者が細かく記事をカテゴリー分け・タグ付けしたとしても、徒労に終わってしまいます。このままではユーザーにとって不親切です。
WordPressの投稿ナビゲーションの仕組み
WordPressには、投稿ページに前後のリンクを表示する機能があります。例えば、以下のような関数で、前の投稿・次の投稿へのリンクを取得・表示できます。

このページネーション関数の中で頻繁に利用されるのは以下の関数です。
get_previous_post_link
/get_next_post_link
(前後の投稿のリンクを取得)previous_post_link
/next_post_link
(前後の投稿のリンクを出力)
これらのページネーション関連の関数は通常、投稿の公開日時順で前後の投稿を取得したり表示したりします。
WordPress のページネーション関数の呼び出し関数である get_adjacent_postには 「in_same_term」 というオプションがあります。
「このオプションを使えば解決!」と思うかもしれません。ところが……
実はこの「in_same_term」オプション、一つの投稿に一つのカテゴリーしか設定されていない場合には正しく動作するのですが、複数のカテゴリーを持つ投稿が含まれると、意図しない別のカテゴリーへ切り替わるという問題があるのです。
in_same_termオプションの問題点
「in_same_term」というget_adjacent_post関数のオプションを「true」
と記述すると「同じターム(カテゴリーやタグ内の項目)の投稿だけを対象」にできます。(オプションが未指定の場合はfalseと解釈されるのでタームによる絞り込みはされません。)
例えば、「項目A」というターム(カテゴリー内の項目)内で前後の投稿を表示したい場合、このオプションを使えば投稿に一つしかタームが設定されていない時は「項目A」内の投稿だけに絞り込んでページネーションを表示することができます。
しかし、ここで問題が発生します。
投稿に複数のタームが設定されている場合、思い通りに動作しないことがあるのです。
具体的な問題の例
次のような投稿があるとします。
- 投稿1(項目A)
- 投稿2(項目A)
- 投稿3(項目A・B)
- 投稿4(項目B・C)
- 投稿5(項目C)
- 投稿6(項目A)←これを取得したい
このとき、投稿3を表示していて「次の投稿」を取得しようとすると、
「項目Aを含む次の投稿」(投稿6)を表示したいところですが、投稿3は「項目B」も含んでいるため、「項目Bを含む次の投稿」(投稿4)が表示されてしまう のです。
その結果、意図しないタームの投稿へ移動してしまい、以下のような現象が起こります。

- 投稿1(A)→投稿2(A)→投稿3(A・B)→投稿4(B・C)→投稿5(C)
このように、最初は「項目A」で絞り込んでいたはずが、途中から「項目B」「項目C」と変わってしまいます。
これはちょっと困りますよね。
「一つの投稿に一つのカテゴリーだけ」という制約を守れるか、というとそうでもないですよね。
それに、本来であればカテゴリーは親子関係(例:大分類:【お知らせ】の下に小分類:【キャンペーン】・【新商品】など)を持たせて使うことが可能だったはずです。
一つの投稿に複数のカテゴリーが設定されていても、選択したカテゴリーごとにページネーションできないかな?と思って調べても、ばっちり上手くいく解決策が見つからなかったんですよね。
こんな場合、カスタム投稿タイプを作るしかないと諦めてしまうこともあるでしょう。
扱う話題が少なければそれでも対応できますが、新たな話題を増やす度にカスタム投稿を増やすと管理画面がごちゃごちゃで運用しにくくなります。
そこで、URLパラメータを活用して 「最初に閲覧していたカテゴリーやタグを維持したまま、関連投稿を連続表示できる」 ページネーションを開発しました。それが 「WP-SameTerm-Pager」 です。
WP-SameTerm-Pagerの特徴
Same Term Pagerを使うと、最初に開いたカテゴリー・タグ・カスタムタクソノミーのアーカイブ(一覧)ページ(例:項目A)を基準に、途中でタームが変わることなく、そのターム内の投稿だけを正しくページ送りできます。

基本的に投稿ページに移動する前にURLパラメータを付与しているので、サーバーサイドの処理のみで実現できる・キャッシュの影響を受けにくいというメリットがあります。
Cookieを利用して処理を分けるのと何が違うの?と思う人もかもしれませんが、ユーザー側のブラウザ設定に影響されないため、環境によらず安定した動作を実現できます。
少し専門的な話が多くなってしまったので、使い方が難しそう……と思われるかも知れません。
大丈夫です。プログラマーでない人も気軽に使えるように、と思って開発しました。普通に使用する場合、専門的なプログラミング知識は不要です。
管理画面もシンプルに設計しているため、プラグインをインストールするだけで難しい設定をしなくても利用できます。
ブログやニュースサイトなど、同じカテゴリー内で記事をスムーズに移動できるようにしたいサイト運営者におすすめのプラグインです。
コメント