ページが属するカテゴリについて
-
WordPressのページ機能ですが、ページを作成すると、テーブル「wp_term_relationships」に「投稿用カテゴリーの初期設定」で設定されたterm_taxonomy_idが登録されます。
通常は、postテーブルをjoinしpost_typeで絞り込んでいるので問題はありません。
get_postsなどで取得する際、post_typeをanyにし、カテゴリに対する条件(category__not_inやcategory__in)も付加すると、サブクエリの中で、「wp_term_relationships」と「wp_term_taxonomy」をJoinしたものに対して行い、post_typeを見ていません。
つまり、カテゴリID 1を除くページと記事を全て出力するといったことをすると、「投稿用カテゴリーの初期設定」を途中で変えている場合、意図したものとは違う結果になります。
時系列でページの作成と属するカテゴリIDがどのように変わるかを示すと以下の通りです。
ページ1 カテゴリID 1
記事1 カテゴリID 1
記事2 カテゴリID 3
ページ2 カテゴリID 1
「投稿用カテゴリーの初期設定」を3に変更
ページ3 カテゴリID 3
ページ4 カテゴリID 3
記事3 カテゴリID 3この場合、get_postsを使い、カテゴリID 3を除く記事とページを全て出力すると、ページ3,4が出力されません。
ページも内部的にはカテゴリに属しているようになっているため、当たり前の動作ですが、ページは表面上はカテゴリに属していないために紛らわしいなと思いました。
・ページはカテゴリとは関係無いので無駄なデータ(wp_term_relationshipsに入っているデータ)を削る
・ページと投稿記事とのデータの統一感を出すためカテゴリIDを持たせるが、他のカテゴリIDと被らないようにする。
・ページがどのカテゴリに属してようとデータを抽出する際、頭の中に入れて気を付ければ良い。などなど解決方法があると思いますが、よろしければ議論していただけるようお願いします。
バージョンはどこからこの問題が発生しているかは探っていません。
構造的にバグを生み易い形になっているかなと思い報告しました。
P.S.
決して自家製パッチを当てるor自分でSQLを書いて処理するのが面倒だからじゃないですよ!(おぃ
- トピック「ページが属するカテゴリについて」には新たに返信することはできません。