2026年10月13日

2026年10月13日

WordPressとapi.videoを連携する方法|APIキーの保管・動画一覧の取得・埋め込み・管理画面からの直接アップロード

WordPress と動画配信 API の api.video を連携するには、APIキーを wp-config.php の定数として保管し、サーバー側から wp_remote_request() で API を呼び出し、再生はショートコードで api.video のプレーヤーを iframe 埋め込みする構成が扱いやすい方法です。この記事では、その最小構成を mu-plugin として作り、動画一覧の表示、投稿への埋め込み、さらに大きな動画ファイルを WordPress サーバーを経由せずにアップロードする仕組みまでを順に説明します。

api.video と連携すると何が変わるのか

WordPress のメディアライブラリに MP4 を直接アップロードして video ブロックで流す方法は手軽ですが、動画はファイルが大きく、サーバー容量・転送量・PHP のアップロード上限(upload_max_filesize)にすぐ突き当たります。また、回線速度に応じて画質を切り替えるアダプティブ配信(HLS)は自前では用意しにくい仕組みです。

api.video は、アップロードされた動画をエンコードし、HLS 配信・サムネイル生成・プレーヤーをまとめて提供するサービスです。WordPress 側は「どの動画をどのページに出すか」だけを管理し、重い処理と配信は api.video に任せる、という役割分担になります。

なお、api.video は WordPress コアの oEmbed 対応サービスには含まれていないため、URL を貼るだけでは自動で埋め込まれません。公式・サードパーティのプラグインが提供されている場合もありますが、提供状況や対応する WordPress のバージョンは変わるため、使う前に配布元と最終更新日を確かめてください。この記事では依存を増やさず、自分で管理できる小さなコードで連携します。

事前準備:サンドボックスと本番のAPIキー

api.video のダッシュボードにログインすると、本番用(production)とサンドボックス用(sandbox)のAPIキーを確認できます(2026年10月現在)。画面の構成や表記は変わることがあります。サンドボックスは動画に透かしが入るなどの制限がある代わりに、試験用として使えます。開発中やステージング環境ではサンドボックスのキーと API のエンドポイント(https://sandbox.api.video)を使い、動作を確かめてから本番(https://ws.api.video)に切り替えるのが安全です。

APIキーは、動画の削除まで行える強い権限を持ちます。次の点を守ってください。

  • テーマのファイルや投稿本文、JavaScript に直接書かない(ブラウザに配信されると誰でも読めます)
  • Git に commit するファイルに書かない
  • 漏えいが疑われたらダッシュボードでキーを作り直し、古いキーを無効にする

手順1:APIキーを wp-config.php に定数で置く

wp-config.php の「編集が必要なのはここまで」の行より上に、次のように書きます。値はダミーです。

// api.video の設定(値はダミー。実際のキーに置き換える)
define( 'APIVIDEO_API_KEY', 'your-api-key' );
// 開発中は sandbox、本番では https://ws.api.video
define( 'APIVIDEO_BASE_URL', 'https://sandbox.api.video' );

環境変数で渡せるサーバーなら、define( 'APIVIDEO_API_KEY', getenv( 'APIVIDEO_API_KEY' ) ); のように読み込むと、ファイルにキーを残さずに済みます。wp-config.php を編集する前には、ファイルのバックアップを取っておいてください。

手順2:API を呼び出す共通関数を作る

以降のコードは wp-content/mu-plugins/apivideo-integration.php にまとめます。mu-plugin はテーマを切り替えても動き続け、管理画面から誤って停止されることもありません。テーマの functions.php に書く場合は、更新で消えないよう子テーマを使ってください。

api.video の認証には、APIキーをユーザー名・パスワードを空にした Basic 認証で送る方法と、/auth/api-key でアクセストークンを取得して Bearer で送る方法があります。ここでは前者を使います。認証方式の扱いは変わる可能性があるため、実装前に公式の API リファレンスで現在の推奨を確認してください。

<?php
/**
 * Plugin Name: api.video integration (mu-plugin)
 */
defined( 'ABSPATH' ) || exit;

function myvid_api_request( $method, $path, $body = null ) {
	if ( ! defined( 'APIVIDEO_API_KEY' ) || ! defined( 'APIVIDEO_BASE_URL' ) ) {
		return new WP_Error( 'myvid_config', 'api.video の設定がありません。' );
	}

	$args = array(
		'method'  => $method,
		'timeout' => 15,
		'headers' => array(
			'Authorization' => 'Basic ' . base64_encode( APIVIDEO_API_KEY . ':' ),
			'Accept'        => 'application/json',
		),
	);
	if ( null !== $body ) {
		$args['headers']['Content-Type'] = 'application/json';
		$args['body']                    = wp_json_encode( $body );
	}

	$response = wp_remote_request( APIVIDEO_BASE_URL . $path, $args );
	if ( is_wp_error( $response ) ) {
		return $response;
	}

	$code = wp_remote_retrieve_response_code( $response );
	$data = json_decode( wp_remote_retrieve_body( $response ), true );
	if ( $code < 200 || $code >= 300 ) {
		// キーそのものはログに出さない
		error_log( sprintf( 'api.video API error: %d %s', $code, $path ) );
		return new WP_Error( 'myvid_http', 'api.video の応答がエラーでした。', array( 'status' => $code ) );
	}
	return $data;
}

ポイントは、エラー時にステータスコードとパスだけを記録し、ヘッダーやキーをログに残さないことです。wp_remote_request() は WordPress の HTTP API で、サーバーの cURL 設定や WordPress 同梱の CA 証明書を使って通信します。

手順3:動画一覧を取得してキャッシュする

動画の一覧は GET /videos で取得できます。ページを表示するたびに API を呼ぶと遅くなり、API の利用制限にも触れやすくなるため、トランジェントで数分間キャッシュします。

function myvid_get_videos() {
	$cached = get_transient( 'myvid_videos' );
	if ( false !== $cached ) {
		return $cached;
	}

	$data = myvid_api_request( 'GET', '/videos?currentPage=1&pageSize=25' );
	if ( is_wp_error( $data ) || empty( $data['data'] ) ) {
		return array();
	}

	$videos = array();
	foreach ( $data['data'] as $item ) {
		$videos[] = array(
			'id'        => $item['videoId'] ?? '',
			'title'     => $item['title'] ?? '',
			'thumbnail' => $item['assets']['thumbnail'] ?? '',
		);
	}
	set_transient( 'myvid_videos', $videos, 10 * MINUTE_IN_SECONDS );
	return $videos;
}

API の応答から必要な項目だけを取り出して保存しているのは、応答の構造が将来変わっても影響範囲を小さくするためです。項目名(videoId、assets など)は公式リファレンスで最新の形を確認してください。

手順4:ショートコードで投稿に埋め込む

投稿本文に iframe を直接書く方法は、unfiltered_html 権限を持たない編集者では保存時に除去されることがあり、また入力ミスがそのままページに出ます。ショートコードにして、動画 ID を検証したうえで出力するほうが安全です。

add_shortcode( 'apivideo', function ( $atts ) {
	$atts = shortcode_atts( array( 'id' => '', 'title' => '動画' ), $atts, 'apivideo' );

	// 動画 ID は英数字のみを許可(現在の api.video の ID は vi で始まる形式)
	$id = preg_replace( '/[^A-Za-z0-9]/', '', $atts['id'] );
	if ( '' === $id ) {
		return '';
	}

	$src = 'https://embed.api.video/vod/' . rawurlencode( $id );
	return sprintf(
		'<div class="myvid-embed" style="aspect-ratio:16/9;"><iframe src="%s" title="%s" width="100%%" height="100%%" style="border:0;" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>',
		esc_url( $src ),
		esc_attr( $atts['title'] )
	);
} );

投稿では [apivideo id="viXXXXXXXXXXXX" title="製品紹介"] のように書きます。aspect-ratio で表示枠の比率を先に確保しておくと、iframe の読み込み時にレイアウトがずれる(CLS)のを防げます。title 属性は、スクリーンリーダーの利用者に何の動画かを伝えるために付けています。

公開範囲を「非公開(private)」にした動画は、通常の埋め込み URL では再生できず、API で発行されるトークン付きの URL が必要です。会員限定の動画として使う場合は、WordPress 側のログイン判定と組み合わせて、権限のあるユーザーにだけトークン付き URL を出力する設計になります。

手順5:大きな動画を管理画面から直接アップロードする

数百MB以上の動画を WordPress 経由でアップロードすると、PHP のアップロード上限やタイムアウトに引っかかります。api.video には、有効期限付きの「アップロードトークン」を発行し、ブラウザから api.video へ直接ファイルを送る仕組みがあります。WordPress はトークンの発行だけを担当し、ファイル本体はサーバーを通りません。

トークン発行用の REST API エンドポイントを、メディアのアップロード権限を持つユーザーだけが使えるように登録します。

add_action( 'rest_api_init', function () {
	register_rest_route( 'myvid/v1', '/upload-token', array(
		'methods'             => 'POST',
		'permission_callback' => function () {
			return current_user_can( 'upload_files' );
		},
		'callback'            => function () {
			// 有効期限 1 時間のアップロードトークンを発行
			$data = myvid_api_request( 'POST', '/upload-tokens', array( 'ttl' => 3600 ) );
			if ( is_wp_error( $data ) || empty( $data['token'] ) ) {
				return new WP_Error( 'myvid_token', 'トークンを発行できませんでした。', array( 'status' => 502 ) );
			}
			return array( 'token' => $data['token'] );
		},
	) );
} );

管理画面の JavaScript からは、wp_create_nonce( 'wp_rest' ) で作った nonce を X-WP-Nonce ヘッダーに付けてこのエンドポイントを呼びます。nonce と permission_callback の両方があることで、ログイン中の権限あるユーザー本人の操作だけがトークンを得られます。

取得したトークンを使ったアップロードには、api.video が公開している JavaScript のアップローダーライブラリを使うと、大きなファイルの分割送信や再試行を任せられます。ライブラリの名前や使い方は更新されることがあるため、公式ドキュメントの「delegated upload(委任アップロード)」の項目を参照してください。トークンは使い回しを避け、有効期限は作業に必要な長さに留めるのが無難です。

つまずきやすい点と確認方法

  • 一覧が空になる:まず wp eval 'var_dump( myvid_api_request( "GET", "/videos" ) );' を WP-CLI で実行し、WP_Error の中身を見ます。401 ならキーかエンドポイント(sandbox と本番の取り違え)、cURL のエラーならサーバーの外向き通信や証明書の問題です。
  • 変更が反映されない:トランジェントのキャッシュが残っています。wp transient delete myvid_videos で消して確認します。
  • アップロード直後に再生できない:api.video 側のエンコードが終わるまで再生できない画質があります。完了の通知を受け取りたい場合は、api.video の Webhook を WordPress の REST エンドポイントで受ける方法がありますが、受信側では送信元の検証を行ってください。
  • 利用料金とプライバシー:配信量・保存量に応じた料金体系は変わるため、公式の料金ページで最新の条件を確認してください。動画の視聴データを外部サービスに送ることになるので、プライバシーポリシーへの記載も見直します。

コードを本番に入れる前に、ステージング環境でサンドボックスのキーを使って一連の流れを試し、サイトとデータベースのバックアップを取ってから反映してください。

まとめ

  • APIキーは wp-config.php の定数か環境変数に置き、ブラウザ側のコードや Git に含めない
  • API 呼び出しは wp_remote_request() の共通関数にまとめ、エラー時はキーを記録せずステータスだけ残す
  • 一覧はトランジェントでキャッシュし、埋め込みは ID を検証してエスケープするショートコードで出力する
  • 大きなファイルはアップロードトークンでブラウザから api.video へ直接送り、トークン発行は権限チェックと nonce で守る
  • 認証方式・応答の項目名・料金は変わり得るため、公式ドキュメントで確認してからステージングで試す

お気軽にご相談ください

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