企業サイトの CMS 構成から機能を切り離す
ある目的を立ててサイトを改善していくと、課題は一つでは終わらず、続けて立ち上がる。新しい種類の記事を一覧に出す。アイキャッチ画像の設定を、毎回の手間が積もらない形にする。公開をやめたページが残す痕跡を始末する。着手していくと、その多くが、今回独自に組まれていた CMS(コンテンツ管理システム)の構成そのものに行き当たった。
このサイトの CMS は、テーマに機能や体裁が作り込まれて、内部構造から切り離せなくなっていた。通常の手段では体裁を変えられず、一段更新すると全体が崩れる。新しく足すものを同じようにテーマへ書き込めば、この固着を一段深くするだけになる。だから、足す機能は内部構造に溶かさず、独立した部品としてテーマの外に置くことにした。
ただ、この方針が全部に通ったわけではない。独立した部品として切り離せたものと、結局テーマの内部構造に書き込むしかなかったものに、対応は割れた。
独立した部品にできたもの、テーマに残ったもの
CMS標準で作成した投稿の種類の外に、新しい種類の記事を扱えるようにするため、カスタム投稿タイプ(CPT)を立てた。テーマの中ではなく、独立した mu-plugin として実装した。
CPT を立てたあとも、表示のいくつかに直しが要った。固定ページの本文等に記事一覧を表示する為、CMS標準ではクエリーループが用意されていることが多いが、既存のものでは体裁が崩れて想定したスタイルにならなかった。自前の処理を mu-plugin として用意し、本文に馴染むスタイルで並ぶように差し替えた。また、ショートコードからも呼べるようにした。CPT の一覧アーカイブが、サイトマップには出てこなかった。一覧アーカイブは、各記事のような投稿オブジェクトではないため、標準サイトマップには入らない。一覧アーカイブを追加する処理も、mu-plugin として実装した。CPT登録、自前のクエリーループ、サイトマップへのアーカイブ追加 ── どれもテーマからは独立した部品で、CMS を組み直しても、そのまま新しい環境へ載せられる。
一方で、テーマに書き込むしかなかったものもある。CPT の表示要件に合わなかった表示項目(著者、作成日、更新日など)を子テーマのテンプレートで差し替え、文字とコードブロックの体裁に自前の CSS を重ねた ── どちらもテーマの体裁に紐づくため、切り離せた部品とは逆に、組み直しのときは捨てる側へ残る。
公開をやめた URL への応答を、どこに持つか
カスタム投稿タイプのプラグイン化に伴い、URL の構造にも変更が生じた。整理され使われなくなった URL がいくつか生じた。これをどう返すかは、CMS の救済任せにもできたが、独立した処理として明示的に持つほうを採った。
使われなくなった経緯はそれぞれ違い、返すべき応答も一つではない。恒久的に移したものには、移転先への 301 を返す。あったものが恒久的に無くなり後継もないものには、410 を返す。もともと実在しなかったが、明示的に閉じたい経路にも 410 を返した。301 は移転先の在りかを、410 は恒久的な不在を、404 は単に見つからないことを、それぞれ相手に伝える。
どこで返すかも効いた。CMS は、見つからなければまず 404 と判定し、覚えのあるものだけを救済が拾って 301 に振り替える。その救済に委ねず、明示的な 301 を、独立した設定として置いた。ステータスコードは、中身がない理由を、それを読む相手に向けて述べる。応答を救済任せにすると、その理由を選べない。
取り込まずに、つなぐ
記事を一本書くたびに、その記事に合う画像を探してくる。一本ごとの手間は小さくても、積もれば長期的に無視できない重さになる。
標準の機能でできるのは、用意した画像をメディアに取り込んでアイキャッチに設定するところまでで、その記事に合う画像を探して見つけてくる部分は含まれない。あらかじめ画像を蓄えていない限り、これが毎回生じる。この探して設定する機能を記事の編集画面で行えるプラグインを実装し、取得元に Unsplash を使った。
Unsplash の画像は、ローカルに置いて使えない。API ガイドラインが、返ってきた画像 URL を CDN からそのまま参照することを求め、メディアに取り込む形を取らないからである。
この機能は、テーマにも内部構造にも手を入れていない。独立したプラグインに収まっていて、構造の側では依存していない。それでも、ページに出る画像が在り続けるかどうかは Unsplash の側にあり、Unsplash や写真家が取り下げれば消える。内部構造への依存はないが、画像という中身は、こちらの管理下にない。
そのため、参照先の画像が消えていないかは、別に確認する処理を入れている。
規約の細かい点としては、画像を設定する操作で計数用の download_location を呼ぶこと、表示のたびに Unsplash と写真家への帰属とプロフィールへのリンクを出すこと。今回はこれらを満たすように実装した。
組み直しに残るもの
切り離せた部品 ── CPT 登録、自前のクエリーループ、サイトマップを足す処理、消えた URL への明示的な応答、アイキャッチを外部につなぐプラグイン ── は、すでにテーマの外で動いている。CMS を組み直しても、そのまま新しい側へ載せられる。子テーマの上書き、追記した CSS など、内部構造に紐づいた対応部分は、内部構造を組み直す側に回る。ただしアイキャッチのプラグインは、部品は載せ替えられても、参照する画像が相手のホストにあるぶん、どちらの側にも入らず外へ残る。
