2025.10.27
# Web制作
【WordPress】YouTube Data APIでチャンネルの最新動画を自動表示する方法
こんにちは、Maromaroの松橋です。
WordPressとYouTubeを運用されている方々はとても多いですが、WEBサイトに自社YouTubeアカウントの最新の動画を表示させて、サイト閲覧ユーザーにもYouTube動画を訴求したいというときがあると思います。
ということで、WordPressサイトにYouTubeの動画一覧をYouTube Data APIで実装する例をご紹介します。
Google Cloud PlatformでAPIキーを準備する
Googleに利用するアカウントでログインし、Google Cloud Platformにアクセスします。
プロジェクトの作成
「プロジェクトの選択」をクリック。
「新しいプロジェクト」をクリック。

「プロジェクト名」に任意の名前を入力し、「作成」をクリックしてプロジェクトを作成します。

作成したプロジェクト内で「YouTube Data API v3」を有効にする
「有効なAPIとサービス」をクリック、「+APIとサービスを有効にする」をクリックします。

APIライブラリの一覧が表示されるので、検索し、「YouTube Data API v3」をクリックします。

「YouTube Data API v3」を「有効にする」をクリックします。

作成したプロジェクト内で「APIキー」を作成する
サイドバーの「認証情報」をクリック、「+認証情報を作成」をクリック、「APIキー」をクリックします。

APIキーの「名前」に任意の名称を入力します。

「アプリケーションの制限」を「ウェブサイト」に選択、「ウェブサイト」の制限で利用するサイトのドメインを入力します。
「APIの制限」に「キーを制限」を選択し、「YouTube Data API v3」を選択して、APIキーと利用できるAPIサービスを関連付けさせます。
その後、「作成」をクリックします。

上記の後、APIキーが表示されるのでメモして控えておきましょう。

チャンネルIDを取得する
取得したいYouTubeチャンネルのページにアクセスし、「さらに表示」をクリックします。

「チャンネルを共有」をクリックすると「チャンネルIDをコピー」をクリックし、YoutubeのチャンネルIDをメモして控えましょう。

WordPressに実装する
必要な情報が揃ったら、WordPressにコードを実装していきます。
APIキーを環境変数で管理する
APIキーは第三者に漏洩すると悪用される危険性があるため、コードに直接書き込まず、サーバー側でのみ読み込める環境変数として管理します。
.env
YOUTUBE_DATA_API=ここに取得したAPIキーを貼り付け
functions.phpに以下のコードを追記し、.envファイルの内容を読み込めるようにします。
functions.php
// .envファイルの読み込み
function load_env() {
$path = dirname(ABSPATH) . '/.env';
if (!file_exists($path)) {
return null;
}
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos(trim($line), '#') === 0) {
continue; // コメントをスキップ
}
list($name, $value) = explode('=', $line, 2);
$name = trim($name);
$value = trim($value);
if (!array_key_exists($name, $_SERVER) && !array_key_exists($name, $_ENV)) {
putenv(sprintf('%s=%s', $name, $value));
$_ENV[$name] = $value;
$_ENV[$name] = $value;
}
}
}
load_env();
フロントエンドの準備(JS/CSS/HTML)
次に、動画一覧を表示するためのJavaScriptやCSS、HTMLを準備します。
必要なライブラリの読み込み (functions.php)
functions.phpに、動画リストの描画やモーダル表示に必要なスクリプトとスタイルを読み込むコードを追記します。
wp_enqueue_script( 'modal-video', get_theme_file_uri('/js/modal-video/js/jquery-modal-video.min.js'), ['jquery'], 0, true);
wp_enqueue_style( 'modal-video', get_theme_file_uri('/js/modal-video/css/modal-video.min.css'));
wp_enqueue_script( 'handlebars', get_theme_file_uri('/js/handlebars/handlebars.js'), [], 0, true);
wp_enqueue_script( 'youtube-list', get_theme_file_uri('/js/youtube-list.js'), ['handlebars','modal-video', 'jquery'], 0, true);
// ajaxDataをyoutube-list.jsスクリプトに渡す。
// nonceを生成し、値をcheck_ajax_referer()に渡して認証させる。
wp_localize_script(
'youtube-list',
'ajaxData',
[
'nonce' => wp_create_nonce('ajax_nonce'),
'ajaxurl' => admin_url('admin-ajax.php')
]
);
wp_localize_script()では、CSRF(クロスサイト・リクエスト・フォージェリ)攻撃を防ぐためのnonce(一時的なトークン)と、Ajax通信のエンドポイントURLをJavaScript側に渡しています。
HTMLの記述
動画一覧を表示させたいテンプレートファイル(front-page.phpなど)に、以下のHTMLを記述します。data-youtube-list属性が、JavaScriptで動画リストを挿入する目印です!。
<script id="youtube_list_item" type="text/x-handlebars-template">
{{#each items}}
<li><a href="#" class="js-modal-video" data-video-id="{{video_id}}">
<img style="border:1px solid #ccc;" src="{{thumb_src}}" alt="{{title}}">
<p>{{date}} : {{title}}</p>
<p class="channel">{{channelTitle}}</p>
</a></li>
{{/each}}
</script>
JavaScriptの実装 (youtube-list.js)
WordPressのAjax機能を使ってサーバーにリクエストを送り、取得した動画データをHandlebars.jsでHTMLに変換して表示します。
(function ($) {
/**
* youtubeのデータを取得してリストに追加
*/
$.ajax({
type: 'POST',
url: ajaxData.ajaxurl, // WordPress AjaxのURL
data: {
nonce: ajaxData.nonce, // CSRF対策用のnonce値を送信
action: 'get_youtube_list' // サーバー側で実行するWordPress Ajaxアクション
},
success: function(response) {
// レスポンスが不正な場合やエラーの場合
if (typeof response.success === 'undefined' || response.success !== true) {
console.error('Ajax Error:', response);
return;
}
// 成功の場合、youtubeデータを表示
append_youtube_list(response);
},
error: function(xhr, status, error) {
// Ajax通信自体でエラーが発生した場合
console.error('Ajax通信エラー:', error);
}
});
/**
* YouTubeのデータを追加
* @param {object} response YouTube APIのレスポンス
*/
function append_youtube_list(response) {
const $youtube_list = $('[data-youtube-list]'); // 動画リストを挿入する要素
const $youtube_list_item_template = $('#youtube_list_item'); // Handlebarsテンプレート
// 該当要素が存在しない場合は処理を終了
if ($youtube_list.length === 0 || $youtube_list_item_template.length === 0) {
return;
}
console.log('YouTube API Response:', response);
// レスポンスからYouTube動画データを取得。データがない場合は空の配列を設定
const youtube_list_items = response.data && response.data.items ? response.data.items : [];
// YouTube APIのデータ構造に合わせてアイテムを変換
const items = youtube_list_items.map(item => ({
video_id: item.id.videoId,
title: item.snippet.title,
thumb_src: item.snippet.thumbnails.medium.url, // mediumサイズのサムネイルを使用
date: new Date(item.snippet.publishedAt).toLocaleDateString('ja-JP'),
description: item.snippet.description,
channelTitle: item.snippet.channelTitle
}));
// Handlebarsテンプレートをコンパイルし、HTMLを生成
const template = Handlebars.compile($youtube_list_item_template.html());
const html = template({
items: items
});
// 生成したHTMLをリスト要素に挿入
$youtube_list.html(html);
// jQuery Modal Videoライブラリを初期化
initializeModalVideo();
}
/**
* jQuery Modal Videoライブラリを初期化
*/
function initializeModalVideo() {
// 新しく追加されたYouTube動画リンクにモーダル機能を適用
$('.js-modal-video').modalVideo();
}
})(jQuery);
PHPでAPIコールを受けて、結果を返却
最後に、JavaScriptからのAjaxリクエストを受け取り、YouTube Data APIを呼び出して結果を返すPHPの処理をfunctions.phpに記述します。
functions.php
// Ajaxリクエストのハンドラーを登録
// `wp_ajax_`はログインユーザー向け、`wp_ajax_nopriv_`は未ログインユーザー向け
add_action('wp_ajax_get_youtube_list', 'handle_get_youtube_list');
add_action('wp_ajax_nopriv_get_youtube_list', 'handle_get_youtube_list');
function handle_get_youtube_list() {
// nonceチェック(CSRF対策)。クライアントサイドから送られたnonce値を検証
check_ajax_referer('ajax_nonce', 'nonce');
// youtube APIからデータを取得する関数を呼び出す
$response = get_youtube_list_from_api();
// APIリクエストの成否に応じてJSONレスポンスを返す
if ($response === null) {
wp_send_json_error('APIリクエストに失敗しました'); // 失敗時はエラーレスポンス
} else {
wp_send_json_success($response); // 成功時はデータをJSONで返す
}
}
/**
* youtube APIからデータを取得する
* @return object|null 成功時はデコードされたJSONデータ(stdClassオブジェクト)、失敗時はnull
*/
function get_youtube_list_from_api() {
// キャッシュキーを設定(1日 = 24時間 = 86400秒)
$cache_key = 'youtube_list_cache';
$cache_duration = 24 * HOUR_IN_SECONDS; // 1日
// キャッシュからデータを取得
$cached_data = get_transient($cache_key);
// キャッシュが存在する場合はそれを返す
if ($cached_data !== false) {
return $cached_data;
}
$youtube_data_api = getenv('YOUTUBE_DATA_API');
$youtube_channel = 'UCOvyMBPp9M7KNZACW7QPtrA';// 東京都のチャンネルID
$url = 'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId='.$youtube_channel.'&maxResults=6&order=date&type=video&key='.$youtube_data_api;
// cURLを使ってAPIリクエストを送信
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 参照元を設定
curl_setopt($curl, CURLOPT_REFERER, 'http://localhost:8080');
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: application/json',
'Content-Type: application/json'
));
$response = curl_exec($curl);
curl_close($curl);
// cURLが失敗した場合
if ($response === false) {
return null;
}
// JSONレスポンスをデコード
$decoded_response = json_decode($response);
// 成功した場合のみキャッシュに保存
if ($decoded_response !== null) {
set_transient($cache_key, $decoded_response, $cache_duration);
}
return $decoded_response;
}
ポイント : CURLOPT_REFERERには、「APIキー」作成時に設定した「アプリケーションの制限」の「ウェブサイト」のドメインを入力しないと、403エラーを返されますので設定しましょう。
重要:APIの利用上限(クォータ)について
YouTube Data APIは無料で利用できますが、クォータ(利用割り当て)という上限が設定されています。
https://developers.google.com/youtube/v3/determine_quota_cost?authuser=4&hl=ja
・1日の上限: 10,000ユニット
・動画検索1回の消費: 100ユニット
ページが表示されるたびにAPIを呼び出すと、すぐに上限に達してエラーが発生してしまいます。
これを避けるため、上記のPHPコードではWordPressのTransient APIというキャッシュ機能を利用しています。一度取得したデータを一定時間(例では24時間)サーバーに保存しておくことで、APIへの無駄なリクエストを大幅に削減できます。
現在のクォータ消費量は、Google Cloud Platformの「YouTube Data API v3」>「割り当て」ページにある「Queries per day」で確認できます。

さいごに
今回は、YouTube Data APIを使ってWordPressに最新動画一覧を実装する方法をご紹介しました。
この方法を使えば、サイトのコンテンツを常にフレッシュな状態に保ち、訪問者へ最新情報を提供し続けることができます。ぜひ、ご自身のサイトでも活用してみてください。
以上、Maromaroの松橋でした。









