Word Press

Word Press のプラグイン開発に取り組んでいます。

Word Press はアーキテクチャーとして MVC を採用していません。プラグイン部分がある程度のボリュームがある場合、MVC
フレームワークを使いたくなります。

そこでマイクロフレームワーク Slim と組み合わせて使うことにしました。

Word Press - Slim の組み合わでは、下記の点に考慮する必要がありました。

  • ショートコードによって、Slim に基づいたコードによって発生させたページを表示できるようにする。
  • カスタム固定ページの表示内容を Slim に基づいたコードによって発生できるようにする。
  • 上記2点によってページを表示する場合、Slim の Response を使用しないで、単に HTML テキストを出力、あるいは Word Press に返却する。
  • Ajax によるリクエストおよびダウンロードは、Slim で処理されるようにリライトおよびリダイレクトを設定し、Word Press で処理されないようにする。

このうち最後のリライトについてははまるポイントがありました。
プログラムのリライトは下記コードの 3 行目のように、index.php を経由してコントローラーとコマンドを引数として渡すことにしました。
index.php を経由する理由は Word Press で定義されている関数を使いたいからです。
一方、画像の URL もカスタマイズしたかったので 2 行目のように Word Press を経由しないで直接リライトを設定しました。

1
2
3
4
5
6
7
8
9
10
11
12
// リライトを設定します。
add_action('init', function (): void {
add_rewrite_rule('my_plugin/images/([^/]+)', 'wp-content/plugins/my_plugin/assets/images/$1', 'top'); //外部リライト
add_rewrite_rule('^my_plugin/([^/]+)/([^/]+)', 'index.php?my_plugin_controller=$matches[1]&my_plugin_command=$matches[2]', 'top'); //内部リライト
});

// Slim 処理系へのリダイレクトを設定します。
add_action('template_redirect', function (): void {
$controllerType = get_query_var('my_plugin_controller');
$commandName = get_query_var('my_plugin_command');
if ($controllerType and $commandName) { doSomething($controllerType, $commandName); } // コントローラーとコマンドの組み合わせを処理するコードをここに記入
});

Word Press では index.php を経由するリライトを内部リライト、そうでないものを外部リライト と呼んでいるようです。
そこで問題となるのが内部リライトと外部リライトで指定書式が異なることです。それぞれ正規表現でマッチした部分の参照方法は下記のようになります。

内部リライト $1, $2, ...
外部リライト $matches[1], $matches[2], ...

これについては気づきにくい部分だと思いました。

私は Word Press のソースコード(class-wp-rewrite.php)を読んで初めてこの違いを理解しました。