WordPress REST APIで認証ユーザー限定のカスタム投稿タイプを作成する方法
WordPressのREST APIで認証ユーザー限定のカスタム投稿タイプを作成する方法を解説。CPT UIプラグインとPHPコードを組み合わせて、ログインユーザーだけがアクセスできるAPIエンドポイントを実装する手順を紹介します。
目次
この記事では、Custom Post Type UI(CPT UI)プラグインとPHPコードを組み合わせて、ログインユーザーのみがアクセスできるREST APIエンドポイントを持つカスタム投稿タイプを作成する方法を解説します。主にHeadless WordPress構成を想定していますが、通常のWordPressサイトでも使える・・・とは思います。
カスタムREST APIコントローラークラスを作成する
投稿タイプを追加する用の独自プラグインを用意します。ここでPHPファイルに以下のコードを追加しましょう。GETリクエストに対して認証を要求するカスタムコントローラークラスを定義しています。
/**
* 認証されたユーザーのみがアクセスできるカスタム投稿タイプのREST APIコントローラー
*/
class Premium_Content_REST_Controller extends WP_REST_Posts_Controller {
/**
* 共通の認証チェックメソッド
*
* @return true|WP_Error 認証済みの場合はtrue、それ以外はエラー
*/
protected function check_authentication() {
if (!is_user_logged_in()) {
return new WP_Error(
'rest_forbidden',
'認証が必要です。',
['status' => 401]
);
}
return true;
}
/**
* GETリクエスト(一覧取得)の権限チェック
*
* @param WP_REST_Request $request リクエストオブジェクト
* @return true|WP_Error アクセス可能な場合はtrue、それ以外はエラー
*/
public function get_items_permissions_check($request) {
// 共通認証チェックを実行
$auth_check = $this->check_authentication();
if (is_wp_error($auth_check)) {
return $auth_check;
}
// 認証OKなら親クラスの権限チェックも実行
return parent::get_items_permissions_check($request);
}
/**
* GETリクエスト(個別取得)の権限チェック
*
* @param WP_REST_Request $request リクエストオブジェクト
* @return true|WP_Error アクセス可能な場合はtrue、それ以外はエラー
*/
public function get_item_permissions_check($request) {
// 共通認証チェックを実行
$auth_check = $this->check_authentication();
if (is_wp_error($auth_check)) {
return $auth_check;
}
// 認証OKなら親クラスの権限チェックも実行
return parent::get_item_permissions_check($request);
}
}
このコントローラークラスはWordPressコアが持つ「WP_REST_Posts_Controller」を拡張し、GETリクエストに対して「is_user_logged_in()」関数によるログインの確認を追加しています。。POST/PUT/DELETEリクエストは既にデフォルトで認証が必要なため、オーバーライドする必要はありません。
CPT UIでカスタム投稿タイプを作成する
次に、CPT UIプラグインを使用してカスタム投稿タイプを作成します。
まず、WordPressの管理画面から「CPT UI」→「投稿タイプを追加」に移動します。そして基本設定を入力しましょう。投稿タイプスラッグは「premium_content」(任意の名前)、複数形ラベルと単数形ラベルはどちらも「有料記事」などと設定します。
REST API設定では「REST APIに表示」にチェックを入れ、「REST APIのベースURL」を「premium-content」(任意のURL)に、「REST APIコントローラークラス」を先ほど作成した「Premium_Content_REST_Controller」に設定します。
その他の設定は必要に応じて行い、「投稿タイプを追加」ボタンをクリックして保存してください。
「公開」と「一般公開クエリー可」の設定について
CPT UI で投稿タイプを設定する場合かつ、Headless WordPressで有料コンテンツの配信を目的としている場合、「一般公開クエリー可(publicly_queryable)」の設定に注意が必要です。感覚的にはオフ(false)に設定したくなりますが、これをオフにするとスラッグの編集ができなくなります。スラッグを編集可能にしたい場合は、この設定をtrueにする必要があります。
APIのテスト
設定が完了したら、APIをテストしてみましょう。以下のエンドポイントにアクセスします。
https://あなたのサイト/wp-json/wp/v2/premium-content
ログインしていない状態でアクセスすると、次のようなエラーが返されるはずです。
{
"code": "rest_forbidden",
"message": "認証が必要です。",
"data": {
"status": 401
}
}
Application Passwordsを使用した認証
外部アプリケーションからAPIにアクセスする場合は、Application Passwords機能を使用すると便利です。WordPress 5.6以降では標準で利用できる機能です。
まず、WordPressの管理画面から「ユーザー」→「あなたのプロフィール」に移動します。下部の「Application Passwords」セクションで、アプリケーション名を入力して「新規追加」をクリックし、生成されたパスワードを安全に保存してください。
APIリクエストには、以下のように認証情報を付加します。
# curlの例
curl --user "ユーザー名:application_password" https://あなたのサイト/wp-json/wp/v2/premium-content
JavaScriptからのリクエスト例も示しておきましょう。
// Base64エンコードした認証情報の作成
const credentials = btoa('ユーザー名:application_password');
// APIリクエスト
fetch('https://あなたのサイト/wp-json/wp/v2/premium-content', {
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => response.json())
.then(data => console.log(data));
まとめ
この方法を使用することで、ログインユーザーのみがアクセスできるカスタム投稿タイプのAPIエンドポイントを作成できます。また、Application Passwordsを使用して外部アプリケーションからも安全にアクセスできるようになります。WordPressの標準的な認証・権限管理システムとの統合も実現できるでしょう。
カスタムREST APIコントローラークラスを使用すれば、最小限のコードでログインユーザー限定のAPIエンドポイントを実装できます。このアプローチは有料会員サイトや限定公開コンテンツなど、様々な場面で活用できそうですね。