カテゴリか投稿タイプか


当サイトのメインコンテンツである「リスト投稿」はこれまで「投稿タイプがpost、かつカテゴリがlist」である投稿だと定義してきた。これを今回「投稿タイプがlist」である投稿に切り替えた。

もともとXOOPSからWordPressに引っ越してきたときにリスト投稿の定義を「投稿タイプがpost、かつカテゴリがlist」としたのは、できるだけカスタマイズを減らしたかったからである。投稿タイプの初期値は post と page の2種類であり、新しいタイプを作るには register_post_type() を呼ぶか CPT UI のようなプラグインを使う必要がある。一方、カテゴリはインストールした時点で使えるようになっている。「投稿タイプがpost、かつカテゴリがlist」はノンカスタマイズでスタートできる自然な選択だった。

しかししばらくすると、やりづらいことが増えてきた。例えば少々複雑な処理をSQLで書こうとすると

しかし、WordPressに引っ越して何年かすると、投稿タイプだけでニーズをまかなうのが難しくなってきた。

まず感じたのは、投稿とカテゴリの「遠さ」。ちょっと複雑な処理をするためにSQLでリスト投稿を取り出そうとすると、「投稿タイプがpost、かつカテゴリがlist」という定義のもとではこんな感じになる(たぶん)。4つものテーブルをまたぐ必要があるのだ。

SELECT p.*
FROM wp_posts AS p
JOIN wp_term_relationships AS tr ON p.ID = tr.object_id 
JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'category'
JOIN wp_terms AS t ON tt.term_id = t.term_id AND t.name='list'
WHERE p.post_status='publish' AND p.post_type='post'

こうやって取り出したレコードに対して二次・三次の処理をしていこうと思うと、とても複雑になる。

一方、投稿タイプはpostsテーブルのフィールドである。なので「投稿タイプがlist」という定義の元でリスト投稿を取り出すのは、これだけでよい。

SELECT p.*
FROM wp_posts AS p
WHERE p.post_status='publish' AND p.post_type='list'

もう一つの難所は、タクソノミーとの関連付け。最初はリスト投稿とブログの2種類のコンテンツに対して、タグという一つのタクソノミーでなんとか運用していた。なるべくカスタマイズしない方針から、ブログ用のタグには blog- という接頭辞を付けたり、リスト投稿からはそれが見えないようにしたり。しかし逆に手間がかかってしまう。ブログという投稿タイプとブログ用タグというタクソノミーを作って運用したほうが楽なのだということがようやくわかってきた。

リスト投稿も2000を超えているので移行は面倒だったが、やってよかった。ノートという第三の投稿タイプを作るなど、拡張の方向性が見えてきた。