WordPressでカスタムテーブルをREST API化する方法

ブログ

WordPressにはREST APIが標準搭載されており、これを拡張することで、独自に作成したデータベーステーブルの情報を外部システムから利用できるAPIとして公開できます。ここでは、カスタムテーブルのデータを取得するAPIの作り方を紹介します。

1. 準備:カスタムテーブル「movie_reviews」の例

まず、今回の例ではカスタムテーブルとして「movie_reviews」を利用します。
このテーブルには、以下のようなカラムがあると仮定します。

  • id:レビューID(自動採番)
  • title:映画のタイトル
  • review:レビュー本文
  • rating:評価(数値)
  • review_date:レビュー投稿日

※実際のテーブル作成は、プラグインやテーマの初期化処理などで行いますが、ここではテーブルは既に存在している前提です。

2. REST APIエンドポイントの作成

2-1. エンドポイントの基本登録

WordPressのfunctions.phpまたは専用プラグインファイルに、以下のコードを追加します。
このサンプルコードでは、GETリクエストにより「movie_reviews」テーブルの全件データを取得し、JSON形式で返すエンドポイントを登録します。

<?php
// functions.php または専用プラグインに以下のコードを追加

/**
 * GETリクエスト用のエンドポイントを登録する関数
 */
function register_movie_reviews_get_endpoint() {
    register_rest_route('reviews/v1', '/list/', array(
        'methods'             => 'GET',
        'callback'            => 'get_movie_reviews',
        'permission_callback' => '__return_true', // 認証不要(誰でもアクセス可能)
    ));
}
add_action('rest_api_init', 'register_movie_reviews_get_endpoint');

/**
 * 「movie_reviews」テーブルからデータを取得してレスポンスとして返すコールバック関数
 *
 * @param WP_REST_Request $request リクエスト情報
 * @return WP_REST_Response レスポンス
 */
function get_movie_reviews(WP_REST_Request $request) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'movie_reviews';

    // テーブルから全件取得(必要に応じてWHERE句やORDER BYなどで絞り込み可能)
    $results = $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A);

    if ( empty($results) ) {
        return new WP_REST_Response('No reviews found.', 200);
    }

    // 結果をJSON形式で返す
    return new WP_REST_Response($results, 200);
}

2-2. エンドポイントのURL

上記のコードを有効にすると、以下のURLでデータ取得APIにアクセスできます。
(※サイトURLは実際のドメインに置き換えてください。)

https://yourdomain.com/wp-json/reviews/v1/list/

3. PythonからAPIを利用する例

WordPress側で公開したエンドポイントは、Pythonのrequestsライブラリを使って簡単にデータ取得が可能です。以下は、PythonからGETリクエストを発行し、映画レビュー情報を取得するサンプルコードです。

import requests

# REST APIエンドポイントのURL
url = "https://yourdomain.com/wp-json/reviews/v1/list/"

# GETリクエストを送信
response = requests.get(url)

if response.status_code == 200:
    # レスポンスのJSONを辞書型に変換して利用
    data = response.json()
    print("Movie Reviews:", data)
else:
    print("Error:", response.status_code, response.text)

このコードを実行すると、WordPress側で取得した「movie_reviews」テーブルのデータが表示されます。

4. セキュリティと運用上の注意点

認証とアクセス制御

  • 上記サンプルでは、permission_callback__return_trueを指定しているため、認証不要で誰でもアクセスできる状態です。
  • 公開APIとして利用する場合、必要に応じてアクセス制御やCORS(クロスオリジンリソースシェアリング)の設定を検討が必要です。

SQLインジェクション対策

  • 今回のサンプルは全件取得の単純なクエリですが、ユーザー入力をもとにSQLを組み立てる場合は、$wpdb->prepare()を利用した処理が必要です。

キャッシュとパフォーマンス

  • データ件数が多い場合や頻繁にアクセスされる場合は、キャッシュの導入を検討することもおすすめです。

5. まとめ

WordPressのREST APIを拡張することで、独自に作成したカスタムデータベーステーブル(今回の例では「movie_reviews」)を外部システムから簡単に利用できるAPIとして公開できます。
エンドポイントの登録
register_rest_route() を使い、GETリクエストでデータ取得用のエンドポイントを実装。
アクセス制御
サンプルでは認証なしの設定ですが、用途に応じて適切な制御を実施。
Pythonからの利用
requests ライブラリなどを使って、外部からデータを取得できる。

以下では認証情報ありのAPIにする方法を紹介しています。

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