LoginSignup
4
1

More than 3 years have passed since last update.

Wordpress でカスタム URL を追加する

Posted at

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 の取り扱いに変換させるためのクラスです。

Route.php
<?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 にマッピングして登録しています。

Router.php
<?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']);
  }
}

利用方法

App.php
<?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 で良いですけどね。

ArticleController.php
<?php

namespace RAPI\Controllers\Api;

class ArticleController {
  public function index() {
    wp_send_json(['id' => 1]);
  }
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1