業務システム開発・オーダーメイドシステム開発・WEBシステム開発なら朝吉システムズにお任せください!

システム開発(大阪)朝吉システムズ

システム開発に関するお問い合せ・ご相談
わからないことも悩む前にお気軽にご相談下さい。
無料相談
事務所案内
リンク
サイトマップ
訪問サポートエリア
大阪市内
大阪府北部
箕面・池田・茨木・高槻・枚方・豊中・吹田・摂津・寝屋川・交野・守口・門真・四條畷
大阪府中部
大東・東大阪・八尾・藤井寺・柏原
大阪府南部
堺・高石・泉大津・和泉・岸和田・貝塚・泉佐野・泉南・阪南
大阪府東部
松原・富田林・河内長野・羽曳野・大阪狭山
奈良県 奈良・生駒他
兵庫県 神戸他

朝吉システムズTOP › ブログ › 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
WordPress 次の記事、一つ前の記事を扱う主な機能は次の通りです。

  1. 対象記事を絞り込むために指定出来るパラメタは2つある。
    • $in_same_cat
      現在の投稿情報と同じカテゴリーで絞り込む場合はtrue、限定しない場合はfalse(省略時はfalse)。
    • $excluded_categories
      除外するカテゴリーIDを指定(省略時は”)。複数のカテゴリーを除外する場合は配列で指定する、あるいは’1,3’のようにカンマで連結して指定する。
  2. パラメタを指定しない場合は公開済みの全ての記事が対象となる。
  3. 並び順は新しいものから順に日付が古いものへと並ぶ。
一見すると自由自在に制御出来るように思えますが次のようなケースでは期待しない結果になる場合があります。
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 辺りで検索条件を書き換えてあげれば実現出来そうです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

ページの先頭へ戻る