ブログ
WordPress 次の記事/一つ前の記事取得でハマったこと
WordPress には一つ前の記事、次の記事を取り扱うためのテンプレートタグ/関数が用意されています。
これらの機能はとても便利で重宝しますが少し癖があります。
分かってしまえば、それはWordPressの仕様であって癖でも何でもないのですが、てっきり自分の書いたコードが間違っているのだと思い込んでしまい、理解するまでにあれこれと試行錯誤を行いました。
同じ事で時間を無駄にする人がいるかもしれませんのでその顛末を記録しようと思います。
- previous_post_link(次の記事へのリンクを出力)http://codex.wordpress.org/Template_Tags/previous_post_link
- get_previous_post(次の記事の投稿情報を取得)http://codex.wordpress.org/Function_Reference/get_previous_post
- next_post_link(一つまえの記事へのリンクを出力)http://codex.wordpress.org/Template_Tags/next_post_link
- get_next_post(一つまえの記事の投稿情報を取得)http://codex.wordpress.org/Function_Reference/get_next_post
- 対象記事を絞り込むために指定出来るパラメタは2つある。
- $in_same_cat
現在の投稿情報と同じカテゴリーで絞り込む場合はtrue、限定しない場合はfalse(省略時はfalse)。 - $excluded_categories
除外するカテゴリーIDを指定(省略時は”)。複数のカテゴリーを除外する場合は配列で指定する、あるいは’1,3’のようにカンマで連結して指定する。
- $in_same_cat
- パラメタを指定しない場合は公開済みの全ての記事が対象となる。
- 並び順は新しいものから順に日付が古いものへと並ぶ。
WordPress が次の記事、一つ前の記事をどのように取り扱っているかを調べるために、前述のテンプレートタグ、関数を検証した結果は次の通りです。
例)確認のために以下の4つの記事を準備しました。
サンプル記事1 カテゴリA,カテゴリB 2013年12月3日
サンプル記事2 カテゴリA 2013年11月15日
サンプル記事3 カテゴリB 2013年11月1日
サンプル記事4 カテゴリA,カテゴリB 2013年10月28日
サンプル記事1が表示されている状態でカテゴリBに所属する次の記事(サンプル記事3)を表示させたいと考え、$in_same_cat パラメタを真に設定して試してみたところ、「次の記事」リンクで「サンプル記事2」を指してしまい、期待している「サンプル記事3」を指してくれません。
wp-includes/link-tempalte.php の
function get_adjacent_post 1146行目
$join .= " AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode(',', $cat_array) . ")";
を見ると IN 句にて検索しているので OR条件(カテゴリAあるいはカテゴリBに所属する記事)で検索していることが分かります。
現在の投稿が所属しているカテゴリ(カテゴリAあるいはカテゴリBいずれかのカテゴリ)に所属している次の(あるいは一つ前の)記事が検索されることなります。
この場合、$excluded_categories オプションでカテゴリAを除外すれば良いのではないか?と調べてみましたが、
現在の投稿が所属しているカテゴリを除外することは出来ない仕様となっているため、指定しても無視されてしまいます。
まとめ:
複数カテゴリに所属している記事に対して、いずれか片方のカテゴリだけに所属している次の(あるいは一つ前の)記事を選択するスマートな方法は用意されていない。
get_previous_post / get_next_post には $excluded_categories オプションがあるが、現在の投稿が所属しているカテゴリ以外を指定する必要がある。(現在の投稿が所属しているカテゴリを指定しても無視される)
現在の投稿と同じカテゴリ(全て)に所属している次の(あるいは一つ前の)記事を検索したい場合は get_previous_post_join,get_next_post_join,get_previous_post_where,
get_next_post_where 辺りで検索条件を書き換えてあげれば実現出来そうです。