【WordPress】WPプラグインでMySQL内の情報をAPI配信する方法

WPプラグインでMySQL内の情報(受注情報)をAPI配信する方法

WordPressのプラグインを利用して、DBサーバーにあるデータをAPI配信する方法について、実際にアクセスしたときに値がとれるまでのプロセスを調査しています。データをAPI配信するときに認証機能やデータベース周りのコード実装など、煩わしい開発を最小に抑えてAPI機能を提供することができます。

必要なプラグイン

WP REST API

WP REST APIは簡単なHTTPベースのREST APIで、更新が古いものでしたが、導入しやすさからこれを選択します。"/wp-json/wp/v2/posts"にリクエストするのみで機能が実現できるので、重宝しそうです。投稿記事等の検索も可能となっています。もともとWordPressの投稿API、メタデータAPI、ユーザーAPIなどがメインのシンプルなインターフェースでうす。今回はこのプラグインにWordPressとは別のDBから、データ取得してレスポンスで返信するようにします。

Code Snippets

Code SnippetsはWordPress上で独自のPHPプログラムを実行する際に、コードを管理しやすくするプラグインです。WordPress上で独自PHPコードを実行する場合、function.phpに直接コードを書き込む方法がありますが、これだと中規模以上のコードになったら管理が煩雑ですし、コードの更新作業ミスでWordPressサイトが全停止してしまうこともあります。そういった悩みを解決し、コードの保守管理を効率化してくれます。今回この機能で独自DBからデータを取得してAPI配信する処理を実装します。

コード実装

APIリクエストを受け付ける処理

WP REST APIをインストールすることで下記の記述ができるようになります。リクエストを受け付けて独自functionの結果をコールバックします。

<pre class=" copy-the-code-target language-php"><code class="  language-php">//wordpressに用意されているアクションフックで独自APIを作成します。

add_action('rest_api_init', function() {
    register_rest_route( 'wp/v2', '/send_api', array(
        'methods' => 'GET',
        'callback' => 'send_api',
    ));
});
function send_api( ) {
    require_once(dirname(__DIR__). '/../../../../tmp/api_test/model.php');
    $obj = new Test();
    $test = $obj->sample_data();
    return array('message' => $test);
 }
</code><button class="copy-the-code-button" data-style="button" title="Copy to Clipboard">□</button></pre>

DBアクセス用のモジュールをrequire_onceでインストールしています。DBアクセス用のモジュールは下記です。ここではサンプルとして文字列"sample data"を返しています。

DBアクセスモジュールサンプル

class Test{
    function sample_data() {
        return 'sample data';
    }
}

ここまででAPIの処理は完成です。ブラウザで下記のURLを実行すると、JSONで文字列"sample data"を返してくれます。

検証

ブラウザからアクセス

http://localhost/wp-json/wp/v2/send_api

{"message":"sample data"}

curlでアクセス

$ curl -I http://localhost/wp-json/wp/v2/send_api
HTTP/1.1 200 OK
Date: Mon, 05 Apr 2021 11:04:31 GMT
Server: Apache/2.4.37 (centos)
X-Powered-By: PHP/7.2.24
X-Robots-Tag: noindex
Link: ; rel="https://api.w.org/"
X-Content-Type-Options: nosniff
Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages, Link
Allow: GET
Access-Control-Allow-Headers: X-WP-Nonce
Content-Type: application/json; charset=UTF-8

タイトルとURLをコピーしました