2026年8月12日

2026年8月12日

WordPressのREST APIにカスタムエンドポイントを追加する方法

はじめに

WordPressは非常に柔軟なプラットフォームであり、開発者が独自の機能やAPIを追加することができます。REST APIを使用することで、外部システムからWordPressへのデータアクセスを容易にすることができます。この記事では、カスタムエンドポイントを追加するための詳細な手順と設定方法について説明します。

症状・背景

このテーマが必要になる主な場面:

  • REST APIを使用してモバイルアプリケーションやウェブサービスからWordPressのデータにアクセスしたい場合
  • WordPressプラグインをカスタマイズし、独自のエンドポイントを追加する必要がある場合
  • データの一括取得や更新のためにカスタムエンドポイントが必要な場合

手順・設定方法

ステップ1: カスタムエンドポイントを登録する

# WordPressのアクションフックを使用してカスタムエンドポイントを登録します。
add_action( 'rest_api_init', 'register_custom_endpoints' );

function register_custom_endpoints() {
    // /wp-json/myplugin/v1/posts というURLにアクセスできるようになります。
    register_rest_route( 'myplugin/v1', '/posts/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'get_post_by_id',
        'args' => array(
            'id' => array(
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric( $param );
                },
            ),
        ),
    ) );

}

# コールバック関数を定義します。
function get_post_by_id( $data ) {
    // リクエストされた投稿IDを取得
    $post_id = absint( $data['id'] );
    
    // 投稿情報を取得
    $post = get_post( $post_id );

    if ( ! $post )
        return new WP_Error( 'rest_post_invalid_id', sprintf( __( 'Invalid post ID.' ), $post_id ), array( 'status' => 404 ) );

    // データを返す
    return rest_ensure_response( $post );
}

ステップ2: カスタムエンドポイントにPOSTメソッドを追加

# /wp-json/myplugin/v1/posts URLにPOSTリクエストが行われたときに呼び出されるコールバック関数を定義します。
add_action( 'rest_api_init', 'register_custom_endpoints_with_post' );

function register_custom_endpoints_with_post() {
    // POSTメソッドを使用して新規投稿を作成するエンドポイントを追加
    register_rest_route( 'myplugin/v1', '/posts', array(
        array(
            'methods' => 'POST',
            'callback' => 'create_new_post',
        ),
    ) );
}

# 新規投稿を作成する関数
function create_new_post($request) {
    $data = $request->get_body_params();

    // 投稿を生成
    $post_id = wp_insert_post( array(
        'post_title' => sanitize_text_field($data['title']),
        'post_content' => sanitize_textarea_field($data['content']),
        'post_status' => 'publish',
        'post_type' => 'post'
    ) );

    if ( is_wp_error( $post_id ) )
        return new WP_Error( 'rest_post_failed', sprintf( __( 'Failed to create post.' ), esc_url( rest_url() . 'myplugin/v1/posts/' ) ), array( 'status' => 500 ) );
    
    // 新規投稿のIDを返す
    $response = array(
        'id' => intval($post_id)
    );

    return rest_ensure_response($response);
}

ステップ3: カスタムエンドポイントを使用してデータを更新

# /wp-json/myplugin/v1/posts/ID URLにPATCHリクエストが行われたときに呼び出されるコールバック関数を定義します。
add_action( 'rest_api_init', 'register_custom_endpoints_with_patch' );

function register_custom_endpoints_with_patch() {
    // カスタムエンドポイントで投稿を更新
    register_rest_route( 'myplugin/v1', '/posts/(?P<id>\d+)', array(
        array(
            'methods' => 'PATCH',
            'callback' => 'update_post_by_id',
            'args' => array(
                'id' => array(
                    'validate_callback' => function($param, $request, $key) {
                        return is_numeric( $param );
                    },
                ),
            )
        ),
    ) );
}

# 投稿を更新する関数
function update_post_by_id($data) {
    // 更新したい投稿IDを取得
    $post_id = absint($data['id']);

    // データから更新内容を取得
    $title   = sanitize_text_field( $data->get_json_params()['title'] );
    $content = sanitize_textarea_field( $data->get_json_params()['content'] );

    // 投稿の情報を更新
    $updated_post = wp_update_post(array(
        'ID' => $post_id,
        'post_title'   => $title,
        'post_content' => $content,
    ));

    if ( is_wp_error( $updated_post ) )
        return new WP_Error( 'rest_post_invalid', sprintf( __( 'Invalid post.' ), $data['id'] ), array( 'status' => 400 ) );

    // 更新された投稿情報を返す
    return rest_ensure_response(get_post($post_id));
}

ステップ4: カスタムエンドポイントの監視とトラブルシュート

# デバッグ用にエラーログを出力します。
add_action( 'rest_api_init', function() {
    register_rest_route( 'myplugin/v1', '/posts/debug', array(
        'methods' => 'GET',
        'callback' => function($request) {
            error_log('Custom endpoint debug request received');
            
            // エラーログ内容を返す
            return rest_ensure_response("Debug mode activated. Check your server logs.");
        }
    ) );
} );

注意事項

  • REST APIのカスタムエンドポイントは、セキュリティ上の理由から適切な認証と権限チェックを行うことが重要です。
  • 実際の運用環境では、開発とテスト用に設定したデバッグモードを無効にする必要があります。
  • カスタムエンドポイントを使用する前に、REST APIの最新ドキュメンテーションを確認して正しく実装されていることを確認すること。

まとめ

1. カスタマイズの追加: WordPress REST APIにカスタムエンドポイントを追加することで、独自の機能を実装することができます。

2. セキュリティの確保: カスタムエンドポイントを使用する際は、適切な認証と権限チェックを行うことが重要です。

3. テストとデバッグ: 実際にカスタムエンドポイントを使用する前に、動作確認を十分に行うべきです。

4. ドキュメンテーションの参照: REST APIの最新のドキュメンテーションを参照することで、正しい実装方法がわかります。

5. パフォーマンス監視: カスタムエンドポイントを使用したシステムは、適切なモニタリングと最適化を行うことが必要です。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ