
こんにちは!埼玉県川越市でWordPress関連のサービスを展開している私たちエーデルハーツです。今日も「WordPress 3分間フッキング」シリーズでWordPressの便利なフックの活用方法をお伝えします。
WordPressのREST APIは、外部アプリケーションとの連携や、モダンなWebアプリケーション開発に欠かせない機能です。今回は、フックを使ってREST APIをカスタマイズし、独自のエンドポイントを作成する方法をご紹介します。
REST APIを拡張することで、WordPressの可能性が大きく広がります。ヘッドレスCMSとしての運用やモバイルアプリとの連携など、多様なニーズに対応できるようになりましょう。
WordPressのREST APIとは?
WordPressのREST APIは、バージョン4.7から正式にコアに統合された機能で、外部プログラムからWordPressのコンテンツにアクセスするための仕組みを提供しています。
基本的なURLは、https://あなたのサイト/wp-json/となっており、例えば投稿一覧を取得するにはhttps://あなたのサイト/wp-json/wp/v2/postsにアクセスします。
REST APIの主な特徴:
- JSON形式でデータをやり取り
 - HTTP標準メソッド(GET、POST、PUT、DELETE)でリソースを操作
 - 認証システムによりセキュリティを確保
 - ルートやエンドポイントをカスタマイズ可能
 
REST API拡張のためのフック
WordPressのREST APIをカスタマイズする際に使用する主なフックを見ていきましょう。
1. rest_api_init アクションフック
REST APIをカスタマイズする際に最も重要なフックです。REST APIが初期化される際に実行され、カスタムエンドポイントの登録に使用します。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						/**  * REST APIの初期化時に実行されるフック  */ add_action('rest_api_init', 'wp3min_register_rest_routes'); function wp3min_register_rest_routes() {     // ここでカスタムエンドポイントを登録 }  | 
					
このフックは、WordPress初期化処理の後半、rest_api_loaded アクションの直後に実行されます。エンドポイント登録に最適なタイミングなので、カスタムエンドポイントの定義はこのフックの中で行いましょう。
2. register_rest_route 関数
これは厳密にはフックではなく関数ですが、カスタムエンドポイントを登録するために必須の関数です。rest_api_init フック内で使用します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						register_rest_route(     'ネームスペース/バージョン', // 例: 'my-plugin/v1'     '/ルートパス',              // 例: '/items'     array(         'methods'             => 'GET',         // HTTPメソッド         'callback'            => 'コールバック関数名', // データを返す関数         'permission_callback' => '権限確認関数名',    // アクセス権限を確認する関数         'args'                => array(),       // パラメータ定義     ) );  | 
					
3. rest_pre_dispatch フィルターフック
リクエスト処理の前に実行されるフックです。認証、キャッシュ、レート制限などに利用できます。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						add_filter('rest_pre_dispatch', 'wp3min_handle_before_request', 10, 3); function wp3min_handle_before_request($result, $server, $request) {     // リクエスト処理前の操作     // $result を返すとここで処理が終了し、そのレスポンスが返される     // nullを返すと通常の処理が続行される     return null;  }  | 
					
4. rest_request_after_callbacks フィルターフック
エンドポイントのコールバック関数実行後、レスポンス送信前に実行されるフックです。レスポンスデータの修正などに使用できます。
| 
					 1 2 3 4 5 6 7 8  | 
						add_filter('rest_request_after_callbacks', 'wp3min_modify_response', 10, 3); function wp3min_modify_response($response, $handler, $request) {     // レスポンスデータの修正     return $response; }  | 
					
その他の役立つREST APIフック
| フック名 | タイプ | 説明 | 
|---|---|---|
| rest_endpoints | フィルター | 登録されたすべてのエンドポイントをフィルタリング | 
| rest_prepare_{投稿タイプ} | フィルター | 特定の投稿タイプのレスポンスデータを修正 | 
| rest_authentication_errors | フィルター | 認証エラーのカスタマイズ | 
| rest_url | フィルター | REST APIのベースURLを修正 | 
シンプルなREST APIエンドポイントの実装例
それでは、実際にカスタムエンドポイントを作成してみましょう。以下は、最近の記事データを返すシンプルなAPIエンドポイントの例です。

| 
					 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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68  | 
						/**  * オリジナル記事データを取得するREST APIエンドポイント  */ function wp3min_register_rest_routes() {     register_rest_route(         'wp3min/v1',           // ネームスペース         '/articles',           // ルートパス         array(             'methods'  => 'GET',             'callback' => 'wp3min_get_articles',             'permission_callback' => 'wp3min_check_permission',             'args' => array(                 'count' => array(                     'default'           => 5,                     'sanitize_callback' => 'absint',                 ),                 'nonce' => array(                     'required' => true,                 ),             ),         )     ); } add_action('rest_api_init', 'wp3min_register_rest_routes'); // 権限チェック関数 function wp3min_check_permission($request) {     // nonceを検証     $nonce = $request->get_param('nonce');     if (!wp_verify_nonce($nonce, 'wp3min_rest_nonce')) {         return new WP_Error(             'rest_forbidden',             'アクセスが拒否されました',             array('status' => 403)         );     }     // 権限チェック     return current_user_can('read'); } // データ取得コールバック function wp3min_get_articles($request) {     $count = $request->get_param('count');     $args = array(         'post_type'      => 'post',         'posts_per_page' => $count,         'post_status'    => 'publish',     );     $posts = get_posts($args);     $data = array();     foreach ($posts as $post) {         $data[] = array(             'id'      => $post->ID,             'title'   => html_entity_decode(get_the_title($post)),             'excerpt' => get_the_excerpt($post),             'url'     => get_permalink($post),             'date'    => get_the_date('c', $post),         );     }     return rest_ensure_response($data); }  | 
					
コード解説
このコードでは次のことを実現しています:
- エンドポイントの登録:
/wp-json/wp3min/v1/articlesというパスで最新記事を取得できるAPIを作成 - 権限チェック:permission_callbackで実行前に権限を確認
 - パラメータ処理:countパラメータで取得件数を指定可能、デフォルトは5件
 - nonce検証:不正なリクエストを防止
 - レスポンス形成:取得した投稿データを整形してJSON形式で返す
 
REST API実装時のセキュリティ対策
WordPress REST APIを実装する際は、セキュリティ面に特に注意が必要です。適切な対策を怠ると、意図しないデータ漏洩やサイト改ざんのリスクが生じます。
1. nonce(一時トークン)の活用
CSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐために、nonceトークンを使用します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						// フロントエンド側でnonceを生成 $nonce = wp_create_nonce('wp3min_rest_nonce'); // JavaScriptでAPIリクエストを送信する例 var data = {     'nonce': '<?php echo $nonce; ?>' }; // フェッチAPIでリクエスト fetch('/wp-json/wp3min/v1/articles?nonce=' + nonce)     .then(response => response.json())     .then(data => console.log(data));  | 
					
サーバー側では先ほどのコード例のようにwp_verify_nonce()関数でnonceを検証します。
2. 権限(capability)確認
エンドポイント毎に適切な権限設定を行い、不正アクセスを防止します。
| 操作内容 | 推奨capability | 
|---|---|
| 一般的な閲覧操作 | read | 
| 投稿編集が必要な操作 | edit_posts | 
| 投稿の削除が必要な操作 | delete_posts | 
| 管理者のみの操作 | manage_options | 
permission_callbackを省略すると、誰でもアクセス可能なエンドポイントになってしまいます。常に適切な権限チェックを設定しましょう。
3. データのサニタイズと検証
入力データは必ず検証・サニタイズし、SQLインジェクションやXSS攻撃を防止します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						'args' => array(     'count' => array(         'default'           => 5,         'validate_callback' => function($param) {             return is_numeric($param) && $param > 0 && $param <= 100;         },         'sanitize_callback' => 'absint',     ),     'keyword' => array(         'sanitize_callback' => 'sanitize_text_field',     ), )  | 
					
また、出力データも適切にエスケープすることが重要です:
| 
					 1 2 3 4 5 6  | 
						$data[] = array(     'title' => esc_html($post->post_title),     'url'   => esc_url(get_permalink($post)), );  | 
					
応用例:こんなことも実現できます
1. カスタム投稿タイプのデータ提供
カスタム投稿タイプのデータをAPIを通じて取得できるようにすれば、外部アプリケーションとの連携が容易になります。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24  | 
						register_rest_route('wp3min/v1', '/products', array(     'methods'  => 'GET',     'callback' => function() {         $products = get_posts(array(             'post_type' => 'product',             'posts_per_page' => 10         ));         return array_map(function($product) {             $price = get_post_meta($product->ID, 'price', true);             return array(                 'id' => $product->ID,                 'name' => $product->post_title,                 'description' => $product->post_content,                 'price' => $price ? absint($price) : 0             );         }, $products);     },     'permission_callback' => function() {         return true; // 誰でもアクセス可能     } ));  | 
					
2. カスタムフィールドの追加
既存のAPIレスポンスにカスタムフィールドのデータを追加することもできます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						add_filter('rest_prepare_post', 'wp3min_add_custom_fields', 10, 3); function wp3min_add_custom_fields($response, $post, $request) {     // カスタムフィールドの値を取得     $views = get_post_meta($post->ID, 'post_views', true) ?: 0;     $featured = get_post_meta($post->ID, 'featured_post', true) === 'yes';     // レスポンスにカスタムフィールドを追加     $response->data['post_views'] = absint($views);     $response->data['is_featured'] = $featured;     return $response; }  | 
					
3. 認証システムの構築
APIを使った独自の認証システムも構築可能です。例えば、アプリケーション用のトークン発行APIなどが作成できます。
| 
					 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  | 
						register_rest_route('wp3min/v1', '/token', array(     'methods'  => 'POST',     'callback' => 'wp3min_generate_token',     'args' => array(         'username' => array(             'required' => true,             'sanitize_callback' => 'sanitize_user',         ),         'password' => array(             'required' => true,         ),     ),     'permission_callback' => '__return_true', )); function wp3min_generate_token($request) {     $username = $request->get_param('username');     $password = $request->get_param('password');     // ユーザー認証     $user = wp_authenticate($username, $password);     if (is_wp_error($user)) {         return new WP_Error(             'invalid_credentials',             '認証に失敗しました',             array('status' => 401)         );     }     // トークン生成(実際の実装ではもっと安全な方法を使ってください)     $token = wp_generate_password(32, false);     // トークンを保存     update_user_meta($user->ID, 'api_token', $token);     update_user_meta($user->ID, 'token_expiry', time() + (7 * DAY_IN_SECONDS));     return array(         'token' => $token,         'user_id' => $user->ID,         'expiry' => human_time_diff(time(), time() + (7 * DAY_IN_SECONDS))     ); }  | 
					
上記のコードは例示目的であり、実際のプロダクションでは、トークンの生成や保存、検証にはより安全な方法を採用してください。JWT(JSON Web Tokens)などの標準的な認証ライブラリの使用をお勧めします。
REST APIの活用事例
その他にも、REST APIを拡張することで、次のようなプロジェクトが実現可能になります:
1. ヘッドレスCMS
WordPressをコンテンツ管理システムとして使いつつ、フロントエンドは完全に分離し、ReactやVue.jsなどのモダンなフレームワークで構築するアプローチです。
2. モバイルアプリとの連携
WordPressサイトのコンテンツをiOSやAndroidアプリで表示させることができます。ネイティブアプリはREST APIを通じてWordPressからデータを取得します。
3. サードパーティサービスとの連携
外部サービス(SNS、決済システム、CRM等)とWordPressを連携させるためのブリッジとしてREST APIを活用できます。
実際の活用事例:プラグインライセンス管理システム
弊社エーデルハーツでは、自社開発のWordPressプラグインのライセンス管理にREST APIを活用しています。独自のエンドポイントを構築することで、安全かつ効率的なライセンス検証システムを実現しています。
具体的には、プラグインがインストールされたWordPressサイトからライセンスキーを検証するためのAPIリクエストが発行され、弊社の認証サーバーで検証を行っています。この仕組みにより、次のようなメリットが生まれています:
- リアルタイムのライセンス検証:有効期限切れや不正利用を迅速に検出
 - 自動更新の制御:有効なライセンスを持つサイトのみ最新版へのアクセスを許可
 - 使用状況の分析:どのサイトで、どのようにプラグインが使用されているかを把握
 - 柔軟な価格モデル:サイト数や機能に応じたライセンス体系の実現
 
このシステムを構築する際は、セキュリティに特に配慮し、APIキーの暗号化やリクエスト制限などの対策を講じています。また、クライアント側(プラグイン側)とサーバー側(認証サーバー)の両方でデータ検証を行うことで、不正アクセスを防止しています。
このように、REST APIはプラグイン開発者にとっても強力なツールとなります。単にコンテンツの配信だけでなく、ビジネスロジックの一部としても活用できる柔軟性を持っているのです。
よくある質問(FAQ)
Q: REST APIは標準で有効になっていますか?
A: WordPress 4.7以降は標準で有効になっています。何らかのセキュリティプラグインで無効化されている場合もあるので、/wp-json/にアクセスして動作確認してみてください。
Q: APIのレスポンス速度を改善するには?
A: 以下の方法でパフォーマンスを向上させることができます:
- 不要なデータを含めないようフィルターでレスポンスを最適化する
 - クエリパラメータで必要最小限のデータのみを取得する
 - レスポンスをキャッシュする(Transient APIの活用)
 
Q: REST APIをセキュアにする最も重要なポイントは?
A: 次の3点を特に重視してください:
- すべてのエンドポイントでpermission_callbackによる権限チェックを実装する
 - 操作を実行する前にnonce(ワンタイムトークン)を検証する
 - 入力データを適切にバリデーション・サニタイズする
 
Q: フロントエンドからREST APIを呼び出す最良の方法は?
A: WordPress組み込みのwp_localize_scriptを使ってAPIのURLやnonceをJavaScriptに渡す方法がお勧めです:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						function wp3min_enqueue_scripts() {     wp_enqueue_script('my-api-script', get_template_directory_uri() . '/js/api.js', array('jquery'), '1.0', true);     wp_localize_script('my-api-script', 'wp3minAPI', array(         'url' => esc_url_raw(rest_url()),         'nonce' => wp_create_nonce('wp_rest'),         'namespace' => 'wp3min/v1'     )); } add_action('wp_enqueue_scripts', 'wp3min_enqueue_scripts');  | 
					
そしてJavaScript側では:
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						// APIからデータを取得する例 fetch(wp3minAPI.url + wp3minAPI.namespace + '/articles', {     headers: {         'X-WP-Nonce': wp3minAPI.nonce     } }) .then(response => response.json()) .then(data => console.log(data));  | 
					
まとめ
WordPress REST APIのカスタマイズは、サイトの可能性を大きく広げる強力な手段です。適切なフックを使いこなすことで、必要に応じた拡張が可能になります。
REST APIのカスタマイズはWordPressの機能拡張において最も強力なアプローチの一つです。今回紹介したフックを活用して、あなたのWordPressサイトをより豊かで柔軟なものにしていきましょう!
セキュリティ面に十分配慮しながら、モダンなWeb開発の手法を取り入れることで、WordPressはより魅力的なプラットフォームになります。
埼玉県川越市を拠点に活動している私たちエーデルハーツでは、WordPressのカスタマイズやREST APIを活用した開発など、お客様のニーズに合わせた技術支援を行っています。WordPressに関するお困りごとがありましたら、お気軽にご相談ください。
WordPressの高度なカスタマイズやREST APIを活用したプロジェクトを検討されている方は、WordPressカスタマイズ・プラグイン開発を気軽にご相談ください:https://edel-hearts.com/wordpress-customize-and-plugin-development/
今後も「WordPress 3分間フッキング」シリーズでは、様々なフックの活用方法をご紹介していきます。引き続きよろしくお願いいたします!


