人類が満足する WordPress はもう一度作れるのか

こんにちは zane です。

この業界で知らない人はいない WordPress は、全ウェブサイトの40%で使われており、誕生して20年経つ今も、ブログやホームページを作る選択肢として依然トップに君臨しています。しかし、エンジニアの目線から見ると、システムとして多くの課題が挙げられます。

僕は、今 [Collections](https://collections.dev/ja) というオープンソースのヘッドレス CMS を提供しています。WordPress に感じた問題から、いまだ席巻する CMS 領域を再構築したい思いに駆られて、この1年間開発してきた経緯をまとめてみました。

# 魔改造という闇
WordPress は、管理画面からソフトウェアをアップデートできることで、だれでも最新版を使い続けられたり、自由度の高いカスタマイズ、外部プラグインによる強化など、非常に細部まで考えつくされたシステムです。

しかしながら、無造作に追加されたプラグインによる汚染や、果には「魔改造」と呼ばれるコードにより、アップデートが妨げられ脆弱なシステムとして放置されてしまっています。

そう、悪いのは明らかに**一部の使い手による問題**なのです。

しかし、それは悪意ではなく、より高度な仕様を実現するための手段であったとも考えられます。その意味では、ユーザーだけの問題を超えて、人類がデフォルトの WordPress では満足できなくなっているかもしれません。

# ヘッドレスに感じた可能性
ヘッドレスとは、フロントエンドとバックエンドを分離するアーキテクチャです。

既存の CMS は、このフロントエンドとバックエンドが一体化しています。これを分離することで、ライトユーザー向けに分かりやすいものから、ハイエンドのカスタマイズ性の高いものまで、ユーザー層に合わせてフロントエンドを構築することができます。そして、システムが離れることで当然メンテナビリティも良くなります。

ですので、ヘッドレスは一見するとライトユーザーを切ったような戦略に思われがちですが、長い目で見ると、**多くの人を満足させられる仕組み**であると確信しています。

## 他業種でもはじまっているヘッドレス化
ヘッドレス化はすでに他業種でも進んでいます。

https://tiptap.dev/editor

技術記事でも見かける機会が増えた Tiptap は、バックエンドに特化したエディタです。当然、単体ではエディタとして機能しませんが

https://zenn.dev/tellernovel_inc/articles/4a471eff90ab12

フロントエンドと組み合わせたり、オリジナルエディタを作ることで、様々な利用層に合わせて使われるようになります。

ユーザーにとっては、成熟度に合わせてUIを切り替えられるのが魅力ですし、Tiptap にとっても、課題や要望の多いフロントエンドを分離することで、バックエンドの機能開発に集中することができます。

結局のところ、間口を広げるために一体化したソフトウェアは、**ヘビーユーザーが求めるものからは離れていく**ため、ヘッドレス化というのは必然の流れだと思います。

# Collections の誕生！
以上の思いがあり、個人で [Collections](https://collections.dev/ja) というオープンソースのヘッドレス CMS を開発しました！

<iframe width="560" height="400" src="https://www.youtube.com/embed/W4nr8BJOiZQ?si=FF-YMXQOD0ugLTMg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


https://collections.dev/ja

https://github.com/collectionscms/collections

簡単に機能をご紹介します。

## データモデルを定義する
![data-model](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/aa87248a-1952-c017-f542-4b28de4023ce.png)

テキストやマークダウン・画像などからフィールドを追加し、データモデルを定義していきます。登録が完了すると動的にデータベースのスキーマも作られます。

## コンテンツを登録する
![created-content](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/f311ceef-f3af-dfac-0d38-5fdf0faae5eb.png)

次に、データモデルに沿ってコンテンツを登録します。

## APIとして呼び出す
![api](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/2ea97409-a44e-9316-f5bb-1b415faba48b.png)

以上でエンドポイントが完成です！🥳
あとは、フロントエンドやスマホアプリから API として呼び出すことで登録したコンテンツを取得できます。

## WordPress からの移行もサポート
![wordpress](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/f50a2be4-12bf-31d8-633c-a890b631628b.png)

WordPress からエクスポートした記事データをドラッグ＆ドップするだけで、コンテンツとして取り込むことができます。使い始めるのに、もう古い記事をコピペする必要はありません！

# 3つのこだわり

## オープンソースであること
ヘッドレスCMSは、フロントエンドとのコラボレーションが欠かせません。そのため、インターフェイスを理解いただき、機能要求を交わしながら推し進めるのに共通言語であるコードをオープンにすることは必然と言えます。

もうひとつは、オープンソース以外に**移行への課題が解決できないこと**です。Tiptap と違い CMS のヘッドレス化へのスイッチングコストはかなり高いです。それは、エディタは置き換えが簡単なツールだが、**CMSはデータの移行が伴う**ためです。

また、WordPress は、データが正規化されていないことで、移行がその障壁となります。Collections は、この課題に正面から取り組むため、移行ツールをプラグインとして開発し、こちらもオープンソースとして公開しています。

https://github.com/collectionscms/plugin-wp-importer

今は記事データだけですが、世界の開発者の力を借りて、全てのデータ移行を可能にするツールを完成させます！

## デベロッパーファースト
Collections は、徹底的にデベロッパーファーストでプロダクト設計しています。どんな環境にも導入でき、扱いやすく、ドキュメントも充実しています。開発者をサポートするコミュニティも [Discord](https://discord.gg/a6FYDkV3Vk) でご用意しています。

その他、UIでは
- 😻 Markdown with GFM
- 🌒 ダークモード
- 📱 レスポンシブル

と、**エンジニアがモノ書きする上で欠かせない装備**も充実しています！！😎

## ワンライナーで導入可能
しかし、どんなに素晴らしいプロダクトでも、導入が難しいと使われることはありません。もちろん、ご安心ください

```
npx create-collections-app my-app
```

たった、これだけのコマンドで導入することができます！！

あとは、インストーラーの質問に答えていくだけで、一連のセットアップは完了します。

```
// データベースクライアントを選択してください
? Which one? SQLite is the simplest. (Use arrow keys)
❯ SQLite
  MySQL / MariaDB
  PostgreSQL
```

# Collections のアーキテクチャ
![architecture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/53ad16a2-c850-8dff-4e8c-b5460ffbbf48.png)

## バックエンドUI
![react+mui+ant](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/9c3f37fa-95f7-7923-583f-c1e2c0e1d038.png)

バックエンドUIは [React](https://ja.react.dev/) + [MUI](https://mui.com/) + [Ant Design](https://ant.design/) の組み合わせです。

ヘッドレスCMSにとって必要なのは、管理画面だけなので、そこまでリッチなUIは必要ありません。ゆえに、洗練されたコンポーネントが用意されている点で MUI 一択でした。Ant design は個人的に見た目が好みだったので、今回アイコンとしてだけ採用しました。

## API
![nodejs+express](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/9a7652ba-8376-a604-6272-7fca567f6e81.png)

APIは [Node.js](https://nodejs.org/en) + [Express](https://expressjs.com/) という王道の組み合わせです。これは、バックエンドの組み合わせを考える上ではずせないのは、**どの環境でも導入が可能**であること。そのため、ベンダーロックインされる Next.js などは候補から外しました。

## データベース
![database](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421112/fdfcce65-35d3-73eb-3e13-d6165424193a.png)

こちらは RDB かつ複数のベンダーをサポートする方針としました。バックエンドと同様、様々な環境への導入や WordPress からの移行が前提となる点、また、多くのエンジニアにとって NoSQL より RDB のほうが、はるかに扱いやすい点でも決め手となりました。

なお、動的にスキーマをいじる特性上、DBアクセスにはクエリビルダーである Knex を採用しています。

## 画像
現在は S3 をサポートしています。今後、Google や Azure ストレージへの対応、CDN 配信にも対応していきます。いや〜やることは山積みですね。。。😅

## ホスティング
アーキテクチャをみて頂くと分かる通り、ベーシックな仕組みで構成されています。そのため、ネットワーク内外を問わず、ほぼどんな環境でもホスティングが可能です！

参考までに、安価な利用には欠かせない Lightsail へのデプロイ手順を掲載しています。よかったら試してみてください！
https://collections.dev/ja/docs/deployments/lightsail

# 今後の展開

## クラウド版の立ち上げ
2024年は、クラウド版の立ち上げを予定しています。少額コストはかかりますが、サクッと導入したい方やアップデートの手間を省きたい方には最適です。ぜひご期待ください！

## WordPress からの移行ツールを作り上げる
全ウェブサイトの40%をになうシステムの移行は、途方もない作業になりそうです。。。が、課題解決に向けて世界中の開発者の力を借りて作り上げていきます！

## フロントエンドとのエコシステムを築く
Tiptap や CMS の事例を見ていても、フロント / バックエンドの分業化は進み、ソフトウェア間が疎結合の関係になっていくと予想しています。

今後 Collections と組み合わせてアプリケーションを作りたい開発者の方、ぜひコラボレーションさせてください！そして、大きなエコシステムを築いていきましょう〜💪

# フィードバック・問い合わせ

## Collections を試したい方へ
Collections は、オープンソースです。どなたでも無料でご利用いただくことができます。もし、導入支援をご希望の方は Discord にご参加ください👇

https://discord.gg/a6FYDkV3Vk

## WordPress開発、他社ヘッドレスCMSの導入支援も行います
現在は、国内外ヘッドレスCMSの研究も行っています。また、僕自身、エンジニアとして15年以上のキャリアを有し数多くのシステムの導入実績もあります。もし、ご紹介いただける案件がありましたら下記フォームよりご連絡ください！

https://forms.gle/vAqbcbVU2cGEUMoJA

# さいごに
CMSは、長く続けることで価値の生まれるプロダクトです。これは WordPress が登場して20年経っても、多くのユーザーから愛されていることがその証明でもあります。以前投稿したことですが、まさに、この領域こそ**エンジニアの強みを活かし人生を賭けていくべきプロダクト**だと思っています。

https://zenn.dev/zane/articles/ccf80cef6b2163#%F0%9F%93%8C-1.-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E5%BC%B7%E3%81%BF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B

**リソース**
[GitHub](https://github.com/collectionscms/collections) — オープンソースのリポジトリ
[Demo](https://demo.collections.dev/admin/) — Collections の機能に触れてみたい方へのデモ
[Document](https://collections.dev/ja) — 一般情報、API情報
[Discord](https://discord.gg/a6FYDkV3Vk) — 開発者コミュニティ
[X](https://twitter.com/collectionscms) — 最新のプロダクト情報


記事へのいいね、GitHub にスターいただくだけでも励みになります！
応援よろしくお願いします🙌