WordPressは便利なシステムだが、汎用性を追求しすぎたせいで全体的に処理がもっさりしているのが難点だ。 しかしCMSの本分である管理画面は割とよくできている。 実際のところウェブサイトを作る上で一番手間がかかるのがこの管理画面の作成なので、それが最初から用意されているというのは実に有難い。 データベースの更新だけWordPressの管理画面に任せて、公開ページだけ高速に動作する別のシステムで作れないものだろうか。
そんなことを思ったので、ASP.NET CoreとC#でWordPressのデータからウェブサイトを表示するシステムを作ってみた。
それがこのサイトになる。
現在このサイトのデータは全てWordPressの管理画面で編集しているが、表示は全てASP.NET Coreでおこなっている。 元々想定された連携方法ではないので若干無理のある部分もあるが、割と綺麗にまとまったと思っている。 応答速度も納得のいくレベルに達したと感じているし、思い付きで作ったにしては上々の仕上がりではないだろうか。
こんな奇特なことをする人間が他にいるかどうかわからないが、何かの参考になるかもしれないので注意点などを簡単にまとめておく。
主に悩んだのはこの辺りか。
WordPressでは基本的に投稿タイプやタクソノミーの情報はPHP関数によりWordPressのシステムに登録される。 そしてこれらの情報はデータベースに登録されない。 そのため通常ではASP.NET Coreからはどのような投稿タイプやタクソノミーが存在するのかを知る手段がない。
これは構造上どうしようもないので、ASP.NET Core側で同じ内容の定義をし、WordPressの定義と同期がとれている前提で処理することにした。 やや煩雑になるが、appsettings.jsonに定義してシングルトンオブジェクトで注入するという手もあるかもしれない。
さらに汎用性を高めるならばWordPress側でそれらの定義をwp_optionsにJSON形式などで保存し、それをASP.NET Core側で読み出すという手も考えた。 あるいは投稿タイプやタクソノミーの定義を管理する専用のテーブルを作るのが本来は一番かもしれない。 しかしそれをやるほどこれらの定義が頻繁に変わるわけでもないので、今回は前述の方法を採ることにした。
例えば画像をアップロードした場合、そのファイル名や画像のサイズなどはwp_postmetaテーブルに保存される。 このデータはPHPのserialize()という関数で文字列化されたもので、基本的にはPHPのunserialize()という関数を通して読み取る仕組みになっている。 PHPに限定された形式の文字列なので、ASP.NET Core側ではこれをオブジェクト化する手段が用意されていない。
そのため自力でC#用のオブジェクトに変換する処理を組まなければならなかった。 幸いにも同じようなことを考えた人がソースコードを公開してくれていたので、比較的楽に組むことができた。
現在使用しているサーバはWindowsサーバであり、その中でWordPressも動作している。 サーバの設定画面を見る限り、同じドメイン内でPHPとASP.NET Coreを共存させることもできるように見える。 しかしどちらもファイル数が多く、同じ場所に混ぜたら収拾が付かなくなることが予想された。
そのため今回は管理用のWordPressを置くドメインと公開用のASP.NET Coreを置くドメインを別々に分けることにした。
この時、WordPressの管理画面に表示される投稿のURLと実際の公開ページのURLにずれが生じる。 基本的にこれらのURLはWordPressが配置されたドメインを基準に生成されるからだ。 post_type_link、post_type_archive_link、term_link、page_link、preview_post_linkなど各種フィルタを定義して互換性を取る必要がある。
WordPressではログインしていれば公開ページ側に管理ツールバーが表示され、個別投稿ページから編集画面に移動したりできるようになっている。 しかし今回の方法ではこの機能は使えなくなるので、必要なら自分で作る必要がある。
などなど、無理に連携しているのでなかなかに問題点も多いが、メリットも色々とあった。
ゼロから作るので、本当に必要な処理だけを実装することができる。 WordPressが良かれとやってくれていた余計な処理のせいで訳のわからない不具合を引き起こす心配もなくなった。 何よりC#はコンパイル型言語なので実行速度が段違いに速い。
それに本当に自分の思うままの動作を実現できるのもメリットだ。 WordPressでは汎用性が高い反面、利便性も重視していて全体的に型にはまった動作を強制される部分が目立つ。 WordPressのルールに沿って作っていく分にはそれでもいいが、ちょっと道からそれたことをしようとすると途端に面倒になることが多かった。 ASP.NET Coreではその辺りも何から何まで自分で作れるので、言ってしまえばなんでもできる。
また公開ページをASP.NET Coreに委ねたおかげでWordPress側の公開ページに関する処理をごっそり削ることができた。 その結果管理ページの応答が非常に早くなり、作業が圧倒的にスムーズになった。
とはいえやはりWordPress単体で動かすことのメリットも大きい。
特にセキュリティ回りやキャッシュ関連、SEO関連の実装などは世界中の優秀なプログラマが用意してくれた素晴らしいプラグインで簡単に実現できる。 これはやはりWordPressの大きなメリットだ。 これらを自力で実装していくとなると時間がいくらあっても足りなくなる。
願わくばWordPressのようなオープンソースのCMSがASP.NET Coreでも出てくれればと思う。 しかし残念なことに現状そういったものは見当たらない。 そもそも日本ではASP.NET Coreがあまり使われていないような気がする。
昔のASP.NETは今一つ使い勝手が悪かったが、最近のASP.NET Coreはかなり洗練されていて開発もしやすい。 フレームワークとしては優秀だと思うのだが、使い手が少ないせいで情報が少ないのは悲しいことだ。 もっと日本でも流行らないものだろうか。