東京都府中市、九段下のWeb制作会社Maromaroのブログです

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の松橋でした。