Wordpress 環境で開発をする際、新しくページ(URL)を追加したい場合があるかと思います。
ただ、ページ追加に関しては、rewrite_rules_array に URL やパラメータを追加するなどの Wordpress 独特の知識が必要となります。
そういったものを取り払い、Routing としてページ追加を実現することが記事の趣旨です。
環境
・Wordpress プラグイン開発
・PHP 7.2.19
・RAPI という namespace でプラグイン開発
Route Class
このクラスはこちらのサイトから引用させていただいています。
https://firegoby.jp/archives/1213
これは、作りたい URL を wordpress の URL の取り扱いに変換させるためのクラスです。
<?php
namespace RAPI\Routes;
class Route {
private $rule = null;
private $query = null;
private $callback = null;
public function __construct($rule, $query, $callback){
$this->rule = $rule;
$this->query = $query;
$this->callback = $callback;
add_filter('query_vars', array(&$this, 'query_vars'));
add_filter('rewrite_rules_array', array(&$this, 'rewrite_rules_array'));
add_action('init', array(&$this, 'init'));
add_action('wp', array(&$this, 'wp'));
}
public function init()
{
global $wp_rewrite;
$rules = $wp_rewrite->wp_rewrite_rules();
if (!isset($rules[$this->rule])) {
$wp_rewrite->flush_rules();
}
}
public function rewrite_rules_array($rules)
{
global $wp_rewrite;
$new_rules[$this->rule] = $wp_rewrite->index . '?'.$this->query.'=1';
$rules = array_merge($new_rules, $rules);
return $rules;
}
public function query_vars($vars)
{
$vars[] = $this->query;
return $vars;
}
public function wp()
{
if (get_query_var($this->query)) {
call_user_func($this->callback);
}
}
}
?>
Router class
これは URL の登録管理のためのクラスです。
Route インスタンスを作ることで Routing を作成します
下の例であれば /rapi/api/article の URL のアクションを article_api_controller の index function にマッピングして登録しています。
<?php
namespace RAPI\Routes;
use RAPI\Controllers\Api\ArticleController;
class Router {
protected $article_api_controller;
public function __construct() {
$this->article_api_controller = new ArticleController();
$this->addRoutes();
}
public function addRoutes() {
new Route('rapi/api/article', 'rapi_api_article_index', [$this->article_api_controller, 'index']);
}
}
利用方法
<?php
namespace RAPI;
use RAPI\Routes\Router;
class App {
protected $router;
public function __construct() {
$this->router = new Router()
}
}
Controller class (参考)
上の例であれば、 /rapi/api/article の URL で、この index() メソッドが実行され、
JSON で ["id":1] が出力されるものとなります。
REST API 作るだけであれば WP REST API で良いですけどね。
<?php
namespace RAPI\Controllers\Api;
class ArticleController {
public function index() {
wp_send_json(['id' => 1]);
}
}