WordPress REST API入門:実装と活用法

PHP

はじめに

本記事では、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:投稿ID
  • date:公開日時
  • 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で使える主な認証方法は以下の通りです。
    1. Application Passwords(標準機能)
      • ユーザーごとに発行できる簡易パスワードで、APIアクセス専用。初心者におすすめ。
    2. Cookie認証
      • WordPressにログイン中のブラウザからJavaScript経由で利用。
    3. JWT認証(プラグイン導入)
      • 外部アプリやサービス連携向けの認証方式。

まずは 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へ発展させれば運用に耐える基盤を構築できます。

本記事が参考になったら幸いです。

コメント

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