はじめに
本記事では、WordPressとREST APIを連携させる方法を解説します。
WordPressに標準搭載されているREST APIを使うことで、外部アプリやサービスから記事データを取得・登録・更新できるようになります。
この記事を読むことで、
- REST APIの仕組みを理解できる
- WordPress REST APIの基本的な使い方を学べる
- 実際にデータを取得・操作する体験ができる
といったスキルを身につけることができます。
REST APIとは?
REST API(Representational State Transfer API)は、Web上のデータや機能を「リソース」として扱い、HTTPメソッドを使って操作する仕組みです。
例えば以下のように、URLで対象(リソース)を指定し、HTTPメソッドで操作を行います。
- GET:データを取得する(例:記事一覧を取得)
- POST:新しいデータを作成する(例:記事を投稿)
- PUT / PATCH:既存データを更新する(例:記事内容を修正)
- DELETE:データを削除する(例:記事を削除)
このように、ブラウザやアプリから統一的な方法でデータをやり取りできるのがREST APIの特徴です。
WordPressには標準でREST APIが組み込まれており、追加の設定をしなくても利用できます。
例えば、記事一覧を取得するには以下のURLにアクセスします。
http://example.com/wp-json/wp/v2/posts
この仕組みを使えば、外部アプリから記事を読み込む、ReactやVueなどのフロントエンドと連携する、外部サービスにデータを提供するといったことが可能になります。
WordPress REST APIの基本
どこにコードがあるのか?
WordPress本体の wp-includes/rest-api/
ディレクトリ 以下にまとまっています。
代表的なファイルは以下の通りです
wp-includes/rest-api/
├─ class-wp-rest-server.php … リクエストを受け取って処理する本体サーバークラス
├─ class-wp-rest-request.php … リクエストを表現するクラス(パラメータ取得など)
├─ class-wp-rest-response.php … レスポンスを表現するクラス
├─ class-wp-rest-controller.php … 各エンドポイント用の共通基底クラス
├─ endpoints/
│ ├─ class-wp-rest-posts-controller.php … 投稿(/wp/v2/posts)
│ ├─ class-wp-rest-users-controller.php … ユーザー(/wp/v2/users)
│ ├─ class-wp-rest-comments-controller.php… コメント
│ └─ … その他、メディア・タクソノミーなど
└─ fields/ … REST API のカスタムフィールド関連
APIエンドポイントの構造
WordPressのREST APIは、基本的に以下の形でアクセスします。
'http://あなたのサイトURL/?rest_route=/wp/v2/リソース'
認証なしでできること/認証が必要な操作
- 認証なしでできること
- 投稿一覧の取得
- 固定ページやカテゴリ情報の取得
- ユーザー情報の一部の取得(公開情報のみ)
- 認証が必要な操作
- 投稿を新規作成する(POST)
- 投稿を更新する(PUT / PATCH)
- 投稿を削除する(DELETE)
- 認証が必要なユーザー情報やプラグイン設定の取得
つまり、閲覧系は誰でも使えるが、更新系は認証が必要 という仕組みになっています。
データを取得してみる
WordPress REST APIを使うと、記事データを簡単に取得できます。ここでは基本的な「GETリクエスト」を実際に試してみましょう。
投稿一覧を取得する(GET)
以下のエンドポイントにアクセスすると、投稿一覧がJSON形式で返されます。
'http://example.com/?rest_route=/wp/v2/posts'
ターミナルから確認する場合は curl
を使います。
curl -i 'http://example.com/?rest_route=/wp/v2/posts'
特定IDの投稿を取得する
投稿のIDを指定すると、1件の投稿データを取得できます。
curl -i 'http://example.com/?rest_route=/wp/v2/posts/123'
ここで 123
は投稿のIDです。記事を開いたときの管理画面URL(post=123
の部分)から確認できます。
JSONレスポンスの読み方
取得結果はJSON形式で返されます。例を見てみましょう。
{
"id": 123,
"date": "2025-10-01T12:34:56",
"slug": "hello-world",
"status": "publish",
"title": {
"rendered": "Hello World"
},
"content": {
"rendered": "<p>これはサンプル記事です。</p>"
}
...
}
id
:投稿IDdate
:公開日時slug
:記事のスラッグ(URLの一部)title.rendered
:記事タイトルcontent.rendered
:本文(HTML形式)
このように、REST APIのレスポンスは 記事の中身をJSONで受け取れる 仕組みになっています。
データを登録・更新する
これまでは記事を取得するだけでしたが、WordPress REST APIを使えば 新規投稿の追加 や 既存投稿の更新 も可能です。ただし、この操作には「認証」が必要になります。
投稿を新規追加する(POST)
新しい記事を作成するときは、次のエンドポイントに POSTリクエスト を送ります。
'http://example.com/?rest_route=/wp/v2/posts'
例:記事を新規作成
curl -X POST 'http://example.com/?rest_route=/wp/v2/posts' \
-u 'ユーザー名:アプリケーションパスワード' \
-H 'Content-Type: application/json' \
-d '{
"title": "APIから作成した記事",
"content": "これはREST API経由で投稿された記事です。",
"status": "publish"
}'
アプリケーションパスワードはプロフィールから設定できます。
もし開発環境等で動かしている場合は、define( 'WP_ENVIRONMENT_TYPE', 'local' );
の設定を埋め込む必要があります。docker-compose.ymlの例です。
environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress WORDPRESS_CONFIG_EXTRA: | define( 'WP_ENVIRONMENT_TYPE', 'local' );
Screenshot
投稿を更新する(PUT / PATCH)
すでにある記事を編集する場合は、投稿IDを指定して PUT または PATCH を使います。
'http://example.com/?rest_route=/wp/v2/posts/{id}'
例:タイトルを更新
curl -X PUT 'http://example.com/?rest_route=/wp/v2/posts/123' \
-u 'ユーザー名:アプリケーションパスワード' \
-H 'Content-Type: application/json' \
-d '{
"title": "タイトルを更新しました"
}'
認証が必要な理由と仕組み
- 理由
誰でも自由に記事を追加・更新できてしまうと、セキュリティ上の大きな問題になります。そのため、記事の作成や更新を行うときは必ず「認証」が必要です。 - 仕組み
WordPressで使える主な認証方法は以下の通りです。- Application Passwords(標準機能)
- ユーザーごとに発行できる簡易パスワードで、APIアクセス専用。初心者におすすめ。
- Cookie認証
- WordPressにログイン中のブラウザからJavaScript経由で利用。
- JWT認証(プラグイン導入)
- 外部アプリやサービス連携向けの認証方式。
- Application Passwords(標準機能)
まずは Application Passwords を使って試すのが一番簡単です。
RestAPIの自作
ファイルの置き場所
- フォルダを作成
wp-content/plugins/my-rest/
- メインファイルを作成
wp-content/plugins/my-rest/my-rest.php
- コードを書く
先ほどの REST API 登録コードを追記します。
<?php
/**
* Plugin Name: My REST
* Description: 最小のREST APIサンプル
* Version: 1.0.0
*/
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/ping', [
'methods' => 'GET',
'callback' => function() {
return ['ok' => true, 'time' => current_time('mysql')];
},
'permission_callback' => '__return_true', // 公開可
]);
});
動作確認
# GET /myplugin/v1/ping
curl -i 'http://example.com/?rest_route=/myplugin/v1/ping'
パラメータ受け取り・バリデーション
args
で サニタイズ と バリデーション を定義します。
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', 'echo', [
'methods' => 'GET',
'callback' => function (WP_REST_Request $req) {
// ここに来た時点で args での基本検証は通過済み
$msg = $req->get_param('msg');
$limit = (int) $req->get_param('limit');
// 追加のドメインルール(例:絵文字禁止など)
if (preg_match('/[\x{1F300}-\x{1FAFF}]/u', $msg)) {
return new WP_Error('invalid_params', '絵文字は使用できません', ['status' => 400]);
}
return [
'message' => $msg,
'limit' => $limit,
];
},
'permission_callback' => '__return_true',
'args' => [
'msg' => [
'required' => true, // 必須
'description' => '表示するメッセージ',
'type' => 'string', // 型ヒント(参考レベル)
'sanitize_callback' => 'sanitize_text_field', // サニタイズ
'validate_callback' => function ($value, $req, $param) {
// 文字数(マルチバイト対応)
$len = mb_strlen($value);
if ($len === 0) return new WP_Error('invalid_params', 'msg は必須です');
if ($len > 100) return new WP_Error('invalid_params', 'msg は100文字以内で入力してください');
// 例:英数記号とスペースのみ許可(必要なら)
// if (!preg_match('/^[\p{L}\p{N}\p{P}\p{Zs}]+$/u', $value)) return new WP_Error('invalid_params','使用できない文字が含まれています');
return true;
},
],
'limit' => [
'required' => false,
'description' => '件数の上限(1〜50)',
'type' => 'integer',
'default' => 10,
'sanitize_callback' => 'absint',
'validate_callback' => function ($value) {
if ($value < 1 || $value > 50) {
return new WP_Error('invalid_params', 'limit は 1〜50 の範囲で指定してください');
}
return true;
},
],
],
]);
});
テスト
curl "http://example.com/?rest_route=/myplugin/v1/echo&msg=hello"
# -> {"message":"hello","limit":10}
curl "http://example.com/?rest_route=/myplugin/v1/echo"
# -> {"code": "rest_invalid_param","message": "msg は必須です","data": { "status": 400, "params": { "msg": "msg は必須です" } }}
curl "http://example.com/?rest_route=/myplugin/v1/echo&msg=hello&limit=5"
# -> {"message":"hello","limit":5}
認証と権限
WordPress REST API では、誰でも呼び出せるAPI と 認証・権限が必要なAPI を分けて実装するのが基本です。
公開系API(閲覧専用)
閲覧用途(例:記事一覧を返すなど)は、権限チェックを省略して公開しても問題ありません。
その場合は、以下のように __return_true
を指定します。
'permission_callback' => '__return_true',
更新系API(データ変更)
記事の作成や削除など、更新系の操作にはユーザーの権限確認が必須です。
WordPressでは current_user_can()
を利用して、特定の権限を持つユーザーのみ実行可能にします。
# 管理者のみ実行可能 にする場合
'permission_callback' => function() {
return current_user_can('manage_options');
}
サンプルコード
管理者限定API(更新系)
add_action('rest_api_init', function () {
register_rest_route('myrest/v1', 'secure-note', [
'methods' => 'POST',
'callback' => function (WP_REST_Request $req) {
$note = sanitize_text_field( $req->get_param('note') ?? '' );
// 追加バリデーション
if ($note === '') {
return new WP_Error('invalid_params', 'note は必須です', ['status' => 400]);
}
if (mb_strlen($note) > 200) {
return new WP_Error('invalid_params', 'note は200文字以内で入力してください', ['status' => 400]);
}
// ここでは保存の代わりに内容を返す(実務ではDB保存やオプション保存など)
return [
'saved' => true,
'note' => $note,
];
},
'permission_callback' => function () {
// 管理者のみ
return current_user_can('manage_options');
},
'args' => [
'note' => [
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
],
],
]);
});
動作確認
curl -X POST "http://example.com/?rest_route=/myrest/v1/secure-note" \
-u "管理者ユーザー名:アプリパスワード" \
-H "Content-Type: application/json" \
-d '{"note":"管理者だけが保存できるメモ"}'
まとめ
WordPressは標準のREST APIで記事やユーザーを取得・作成・更新・削除できます。
閲覧系は公開、更新系は権限チェックを徹底し、独自APIはプラグインで実装可能です。
最小のGETから権限付きPOSTへ発展させれば運用に耐える基盤を構築できます。
本記事が参考になったら幸いです。
コメント