WordPress REST APIは、WordPressサイトのデータを外部のアプリケーション(例: スマートフォンアプリ、JavaScriptベースのフロントエンド、他のウェブサービスなど)とやり取りするための強力なインターフェースです。デフォルトで投稿、固定ページ、ユーザー、タクソノミーなどのデータにアクセスできますが、その真価はカスタムエンドポイントを作成したり、既存のエンドポイントを拡張したりすることで発揮されます。
この記事では、WordPress REST APIをカスタマイズする際に使用する主要な関数、フック、クラスをチートシート形式でまとめました。これにより、独自のAPIルートを定義したり、レスポンスデータを変更したり、より柔軟なデータ連携を実現するための知識を得ることができます。
REST APIの基本概念
まず、REST APIを扱う上で基本となるいくつかの用語を理解しておきましょう。
- ルート (Route): APIにアクセスするためのURLのパターンです。例:
/wp-json/myplugin/v1/books
- ネームスペース (Namespace): ルートを一意に識別するための接頭辞です。通常はプラグインやテーマ名、バージョン情報を含みます。例:
myplugin/v1
- エンドポイント (Endpoint): 特定のルートとHTTPメソッド(GET, POST, PUT, DELETEなど)の組み合わせで、特定のアクションを実行します。
- リクエスト (Request): クライアントからAPIエンドポイントへの要求。パラメータやヘッダー情報を含みます。 (
WP_REST_Request
オブジェクト) - レスポンス (Response): APIエンドポイントからクライアントへの応答。ステータスコードやデータを含みます。 (
WP_REST_Response
オブジェクト)
主要なREST API関連関数・フック・クラス一覧
WordPress REST APIのカスタマイズで使用できる主要な関数、フック、クラスを機能別に分類しました。各項目の説明の冒頭には、そのREST API開発における重要度や利用頻度を星の5段階評価で示しています。星の数の目安は以下の通りです。
★★★★★:ほぼ全ての開発で頻繁に利用され、基本かつ非常に重要なパラメータ
★★★★☆:高頻度で利用され、多くの一般的なカスタマイズで役立つ重要なパラメータ
★★★☆☆:中程度の頻度で利用され、特定の機能を実現する際に便利なパラメータ
★★☆☆☆:利用頻度はやや低めですが、特定の要件や細かな制御を行いたい場合に役立つパラメータ
★☆☆☆☆:利用頻度は低く、非常に限定的な状況や高度なカスタマイズでのみ使用されるパラメータ
種類 | 名前 | 主な役割・説明 (重要度/利用頻度) | 主要な引数 / プロパティ / メソッド | 返り値 / 用途 |
---|---|---|---|---|
関数 | register_rest_route() |
★★★★★ カスタムREST APIルート(エンドポイント)を登録します。REST APIカスタマイズの基本です。 |
string $namespace (ネームスペース),string $route (ルートの正規表現),array $args (コールバック、メソッド、権限コールバック等) |
boolean (成功時true) |
rest_ensure_response() |
★★★★☆ コールバック関数からの返り値を、標準的な WP_REST_Response オブジェクトに変換します。エラー処理やデータ整形に便利。 |
WP_REST_Request|WP_Error|mixed $response |
WP_REST_Response |
|
register_rest_field() |
★★★★☆ 既存のREST APIレスポンス(投稿、ユーザー、タームなど)にカスタムフィールドを追加します。 |
string|array $object_type (対象オブジェクトタイプ),string $attribute (フィールド名),array $args (get/update/schemaコールバック等) |
boolean (成功時true) |
|
get_rest_url() |
★★★☆☆ REST APIのベースURL、または指定したネームスペースやルートの完全なURLを取得します。 |
int|null $blog_id (マルチサイト用),string $path (ルートパス、例: '/wp/v2/posts' ),string $scheme (‘http’, ‘https’, ‘rest’) |
string (URL) |
|
rest_get_server() |
★★★☆☆ 現在のREST APIサーバー ( WP_REST_Server ) のインスタンスを取得します。 |
なし | WP_REST_Server |
|
rest_do_request() |
★★★☆☆ WordPress内部からプログラム的にREST APIリクエストを実行します。 |
WP_REST_Request|string $request (リクエストオブジェクトまたはルートURL) |
WP_REST_Response |
|
register_rest_setting() |
★★★☆☆ Settings APIで登録されたオプションをREST API経由で取得・更新できるようにします。 |
string $object_type (通常 ‘post’, ‘user’ などではなく ‘settings’),string $object_subtype (オプション名),array $args |
boolean |
|
アクションフック | rest_api_init |
★★★★★ REST APIのルート、フィールド、設定などを登録するのに最適なアクションフックです。このフック内で register_rest_route() などを使用します。 |
なし | カスタムエンドポイントの登録処理など |
rest_request_before_callbacks |
★★★☆☆ APIリクエストのメインコールバック関数が実行される直前に発生します。リクエストデータの事前処理などに。 |
WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response ,array $handler (コールバック関数情報),WP_REST_Request $request |
(アクションフックなので返り値なし) | |
rest_request_after_callbacks |
★★★☆☆ APIリクエストのメインコールバック関数が正常に実行された後に発生します。レスポンスデータの事後処理などに。 |
WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response ,array $handler ,WP_REST_Request $request |
(アクションフックなので返り値なし) | |
rest_after_insert_{$this->post_type} |
★★★☆☆ 特定の投稿タイプのアイテムがREST API経由で作成または更新された後に実行されます。 |
WP_Post $post , WP_REST_Request $request , boolean $creating (新規作成か否か) |
(アクションフック) | |
rest_delete_{$this->post_type} |
★★★☆☆ 特定の投稿タイプのアイテムがREST API経由で削除された後に実行されます。 |
WP_Post $post , WP_REST_Response $response , WP_REST_Request $request |
(アクションフック) | |
フィルターフック | rest_authentication_errors |
★★★★☆ REST APIリクエストの認証エラーをカスタマイズします。独自の認証ロジックを実装する際に重要です。 |
WP_Error|null|true $errors |
WP_Error (エラー時), null or true (認証成功時) |
rest_pre_dispatch |
★★★☆☆ リクエストが実際に処理される前に、リクエストを横取りして独自のレスポンスを返したり、リクエスト自体を書き換えたりできます。 |
mixed $result (null以外を返すと処理を横取り),WP_REST_Server $server ,WP_REST_Request $request |
mixed |
|
rest_pre_serve_request |
★★★☆☆ APIのレスポンスがクライアントに送信される直前に、レスポンスをフィルタリングできます。 true を返すと通常のレスポンス送信を中断します。 |
boolean $served (trueなら送信中断),WP_REST_Response $response ,WP_REST_Request $request ,WP_REST_Server $server |
boolean |
|
クラス | WP_REST_Controller |
★★★★☆ カスタムエンドポイントのロジックをまとめるためのベースクラス。ルート登録、アイテム取得・作成・更新・削除メソッドなどを体系的に実装できます。 |
プロパティ: $namespace , $rest_base メソッド: register_routes() , get_items() , create_item() , update_item() , delete_item() , prepare_item_for_response() , get_item_schema() など |
カスタムコントローラー作成用 |
WP_REST_Request |
★★★★☆ REST APIリクエストに関する情報(HTTPメソッド、ヘッダー、URLパラメータ、JSONボディなど)をカプセル化したオブジェクト。コールバック関数に渡されます。 |
メソッド: get_method() , get_params() , get_param() , get_header() , get_json_params() , set_param() など |
リクエスト情報の取得・操作 | |
WP_REST_Response |
★★★★☆ REST APIのレスポンスを構築するためのクラス。データ、HTTPステータスコード、ヘッダーなどを設定できます。 |
コンストラクタ: new WP_REST_Response( $data = null, メソッド: set_data() , set_status() , header() , add_link() など |
APIレスポンスの生成 | |
WP_Error |
★★★★★ WordPress標準のエラーハンドリング用クラス。REST APIのコールバック関数でエラーを返す際に使用します。 rest_ensure_response() はこれをWP_REST_Response に変換してくれます。 |
コンストラクタ: new WP_Error( $code, $message, $data = '' ) メソッド: add() , get_error_code() , get_error_message() など |
エラー情報の表現・伝達 |
サンプルコード集 (REST APIカスタマイズ例)
1. カスタムGETエンドポイントの作成 (特定の情報を取得)
例: サイトの基本情報(タイトルとタグライン)を返すエンドポイント /wp-json/myplugin/v1/site-info
を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php add_action( 'rest_api_init', function () { register_rest_route( 'myplugin/v1', '/site-info', array( 'methods' => 'GET', // HTTPメソッド 'callback' => 'my_get_site_info_callback', // コールバック関数 'permission_callback' => '__return_true', // 誰でもアクセス可能 (実際には適切な権限チェックを) ) ); } ); function my_get_site_info_callback( WP_REST_Request $request ) { $data = array( 'site_title' => get_bloginfo( 'name' ), 'tagline' => get_bloginfo( 'description' ), ); // return $data; // これでも良いが、WP_REST_Responseを使うのがより正式 return new WP_REST_Response( $data, 200 ); } ?> |
2. カスタムPOSTエンドポイントの作成 (データを受け取り処理)
例: /wp-json/myplugin/v1/submit-data
にPOSTリクエストでデータを受け取り、それをログに記録する(実際にはDB保存など)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php add_action( 'rest_api_init', function () { register_rest_route( 'myplugin/v1', '/submit-data', array( 'methods' => 'POST', 'callback' => 'my_submit_data_callback', 'permission_callback' => function () { // 例: ログインユーザーのみ許可 return current_user_can( 'edit_posts' ); }, 'args' => array( // 受け取るパラメータのバリデーションとサニタイズ定義 (推奨) 'name' => array( 'required' => true, 'type' => 'string', 'description' => '名前', 'sanitize_callback' => 'sanitize_text_field', ), 'email' => array( 'required' => true, 'type' => 'string', 'format' => 'email', 'description' => 'メールアドレス', 'sanitize_callback' => 'sanitize_email', 'validate_callback' => 'is_email', ), ), ) ); } ); function my_submit_data_callback( WP_REST_Request $request ) { $name = $request->get_param('name'); // サニタイズされた値が取得できる (argsで定義した場合) $email = $request->get_param('email'); // パラメータが args で定義されていれば、バリデーションエラーは自動的にWP_Errorで返される // if ( empty($name) || empty($email) ) { // return new WP_Error( 'missing_params', '必須パラメータがありません。', array( 'status' => 400 ) ); // } // ここで $name と $email を使った処理 (例: DBに保存、メール送信など) // error_log("Received data: Name - {$name}, Email - {$email}"); $response_data = array( 'message' => 'データを受け付けました。', 'received_name' => $name, ); return rest_ensure_response( $response_data ); // WP_REST_Responseに変換 } ?> |
3. 既存の投稿タイプにカスタムフィールドを追加 (register_rest_field
)
例: 「投稿(post)」のREST APIレスポンスに、カスタムフィールド「my_custom_field」の値を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php add_action( 'rest_api_init', function () { register_rest_field( 'post', // 対象のオブジェクトタイプ (post, page, user, comment, term, or custom post type) 'my_custom_field_value', // レスポンスに追加するフィールド名 array( 'get_callback' => 'my_get_custom_field_for_api', // 値を取得するコールバック 'update_callback' => 'my_update_custom_field_from_api', // 値を更新するコールバック (オプション) 'schema' => array( // スキーマ定義 (オプションだが推奨) 'description' => 'カスタムフィールドの値', 'type' => 'string', // または 'integer', 'boolean', 'array', 'object' 'context' => array( 'view', 'edit' ), // どのコンテキストで表示するか ), ) ); } ); function my_get_custom_field_for_api( $object, $field_name, $request ) { // $object は現在の投稿オブジェクトなどが配列で入っている return get_post_meta( $object['id'], 'my_custom_field', true ); } function my_update_custom_field_from_api( $value, $object, $field_name ) { // $object はWP_Postオブジェクト if ( ! current_user_can( 'edit_post', $object->ID ) ) { // 権限チェック return new WP_Error( 'rest_cannot_update', 'このフィールドを更新する権限がありません。', array( 'status' => 403 ) ); } return update_post_meta( $object->ID, 'my_custom_field', sanitize_text_field( $value ) ); } ?> |
REST API利用時の注意点とベストプラクティス
- 認証と権限 (Authentication & Authorization): エンドポイントごとに適切な権限チェック (
permission_callback
) を実装し、意図しないユーザーによるデータの閲覧や操作を防ぎましょう。Cookie認証、アプリケーションパスワード、OAuth 2.0など、WordPressは複数の認証方法をサポートしています。 - バリデーションとサニタイズ (Validation & Sanitization): クライアントから送信されるデータは必ずバリデーション(期待する形式か検証)とサニタイズ(無害化)を行ってください。
register_rest_route
のargs
パラメータで定義するのが推奨される方法です。 - レスポンス形式の一貫性: 成功時は
WP_REST_Response
オブジェクトまたはrest_ensure_response()
でラップしたデータを、エラー時はWP_Error
オブジェクトを返すことで、一貫性のあるAPIレスポンスを提供します。 - ネームスペースの利用: カスタムエンドポイントには、プラグインやテーマ固有のユニークなネームスペース(例:
myplugin/v1
)を使用し、他のAPIとの衝突を避けてください。 - バージョン管理: APIに大きな変更を加える場合は、ネームスペースにバージョン番号(例:
v1
,v2
)を含め、古いバージョンとの互換性を考慮することが推奨されます。 - セキュリティ全般: NonceはREST APIでは通常Cookie認証とセットで自動的に処理されますが、状況によっては追加のセキュリティ対策が必要になることもあります。データの露出範囲を最小限にすることも重要です。
よくある質問 (FAQ)
- Q1: カスタムエンドポイントはどのような時に作成する必要がありますか?
- A1: WordPressのデフォルトエンドポイントでは提供されない独自のデータや機能を提供したい場合、複数のAPIリクエストを1つにまとめたい場合、あるいは特定のビジネスロジックをAPIとして公開したい場合に作成します。例えば、特定の条件で絞り込んだ投稿リストと関連するカスタムメタデータを一度に返すAPIなどが考えられます。
- Q2: REST APIの認証はどのように行えばよいですか?
- A2: WordPress REST APIはいくつかの認証方法をサポートしています。ログインしているユーザーであればCookie認証が自動的に機能します。外部アプリケーションからのアクセスには、アプリケーションパスワード (WP 5.6以降) や、より高度なOAuth 2.0認証プラグインなどを利用します。エンドポイントの
permission_callback
でcurrent_user_can()
などを使って権限をチェックするのが基本です。 - Q3: REST APIのデバッグはどのように行えますか?
- A3: Postman、Insomnia、またはブラウザの開発者ツール(ネットワークタブ)などのAPIクライアントツールを使うと、リクエストを送信し、レスポンスヘッダーやボディを詳細に確認できます。WordPressのデバッグモード (
WP_DEBUG
) を有効にしたり、Query MonitorプラグインでAPIリクエストの詳細を追跡したりするのも有効です。コールバック関数内でerror_log()
を使ってデバッグ情報をログに出力することもできます。
まとめ
WordPress REST APIとそのカスタマイズ関数群は、WordPressをヘッドレスCMSとして利用したり、外部サービスと連携させたり、よりインタラクティブなフロントエンドを構築したりするための強力な基盤を提供します。この記事で紹介した関数やフック、クラスを理解し活用することで、WordPressの可能性をさらに広げ、モダンなウェブアプリケーション開発の要求に応えることができるようになるでしょう。
私たちは、埼玉県川越市及びその近郊で、WordPressサイトの高度なカスタマイズやAPI連携、そしてパフォーマンス最適化といった専門的な技術サポートを提供しています。もちろん、リモートでのご相談も全国から承っておりますので、WordPressの技術的な課題でお困りの際は、ぜひ私たちにご相談ください。