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

2025.08.04

松橋一誠

Instagram GraphAPI で画像一覧をWordPressで実装するパターン例

こんにちは、Maromaroの松橋です。

WordPressとInstagramを運用されている方々はとても多いですが、WEBサイトにInstagramの画像一覧を表示させたいときがあると思います。

WordPressサイトにInstagramの画像一覧をGraph APIで実装する例をご紹介します。
Graph APIを使えば、無料で自由に表示をカスタマイズできるので、こだわり派の方には特におすすめです。

APIトークンの取得

Instagramの画像一覧を取得するには、APIトークン(アクセストークン)が必要です。
また、FacebookページとInstagramプロアカウントが紐付いている必要があります。
具体的な取得手順は、以下の記事が非常に分かりやすいので、こちらをご参照ください。
https://arts-factory.net/insta_api/#google_vignette

実装手順

.env

環境変数に、ビジネスカウントIDと有効期限なしのアクセストークンを設定します。

# ビジネスカウントID
INSTAGRAM_BUSINESS_ACCOUNT_ID=00000000000000000
# 有効期限なしのアクセストークン INSTAGRAM_ETERNAL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXX

Instagram Graph APIを利用する際は、ビジネスアカウントIDと有効期限なしのアクセストークンは、環境変数として設定しましょう。
もし外部に漏洩すると、第三者に利用されるリスクがあるためです。

特に注意が必要なのは、これらの機密情報をJavaScriptに直接記述して、クライアントサイドからInstagram APIへ直接コールする手法です。
JavaScriptのコードはブラウザから容易に解析されてしまうため、これらの情報が抜き取られる可能性があります。

そのため、これらの情報はサーバーサイドで管理し、サーバー経由でAPIコールを行うのが良いです!

Instagramの画像一覧表示設定

次に、Instagramの画像一覧を表示するための設定を行います。
コードの配置場所は、トップページ(front-page.php)や固定ページ(page.php)、またはカスタムテンプレートファイルなど、表示させたい場所のテンプレートファイル内に直接記述します。

PHP

wp_enqueue_script( 'handlebars', get_theme_file_uri('/js/handlebars/handlebars.js'), [], 0, true);
wp_enqueue_script( 'instagram-list', get_theme_file_uri('/js/instagram-list.js'), ['handlebars', 'jquery'], 0, true);

// ajaxDataをinstagram-list.jsスクリプトに渡す。
// nonceを生成し、値をcheck_ajax_referer()に渡して認証させる。
wp_localize_script(
  'instagram-list',
  'ajaxData',
  [
    'nonce' => wp_create_nonce('ajax_nonce'),
    'ajaxurl' => admin_url('admin-ajax.php')
  ]
);

HTML


<ul class="instagram_list" data-instagram-list>

<script id="instagram_list_item" type="text/x-handlebars-template">
{{#each items}}
<li><a href="{{permalink}}" target="_blank">
<img src="{{src}}" alt="{{caption}}">
</a></li>
{{/each}}
</script>
</ul>

上記のコードでは、まずwp_enqueue_scriptで必要なJavaScriptライブラリ(Handlebars.jsと自作のinstagram-list.js)を読み込んでいます。
そして、wp_localize_script関数を使ってajaxDataというJavaScript変数に以下の情報を渡しています。

  • CSRF対策のためのnonce値: wp_create_nonce(‘ajax_nonce’)で生成。
  • Ajaxリクエストの送信先URL: WordPressのAjax処理の標準エンドポイントであるadmin_url(‘admin-ajax.php’)を指定。

このajaxData変数は、後述のinstagram-list.jsスクリプトで利用します。
また、HTML部分では、Instagramの画像一覧を挿入する要素にdata-instagram-list属性を付与し、その中にHandlebarsのテンプレートを定義します。

JavaScript(instagram-list.js)

AjaxリクエストでInstagramデータを取得し、Handlebars.jsを使ってHTMLを生成・表示します。



/**
 * Instagramのデータを取得してリストに追加
 */
$.ajax({
    type: 'POST',
    url: ajaxData.ajaxurl, // WordPress AjaxのURL
    data: {
        nonce: ajaxData.nonce,             // CSRF対策用のnonce値を送信
        action: 'get_instagram_list'       // サーバー側で実行するWordPress Ajaxアクション
    },
    success: function(response) {
        // レスポンスが不正な場合やエラーの場合
        if (typeof response.success === 'undefined' || response.success !== true) {
            console.error('Ajax Error:', response);
            return;
        }

        // 成功の場合、Instagramデータを表示
        append_instagram_list(response);
    },
    error: function(xhr, status, error) {
        // Ajax通信自体でエラーが発生した場合
        console.error('Ajax通信エラー:', error);
    }
});

/**
 * インスタグラムのデータを追加
 * @param {object} response Instagram APIのレスポンス
 */
function append_instagram_list(response) {
    const $instagram_list = $('[data-instagram-list]');             // 画像リストを挿入する要素
    const $instagram_list_item_template = $('#instagram_list_item'); // Handlebarsテンプレート

    // 該当要素が存在しない場合は処理を終了
    if ($instagram_list.length === 0 || $instagram_list_item_template.length === 0) {
        return;
    }

    // レスポンスからメディアデータを取得。データがない場合は空の配列を設定
    const instagram_list_items = response.data && response.data.media && response.data.media.data ? response.data.media.data : [];

    // メディアタイプに応じてsrc(画像URLまたは動画サムネイルURL)を設定
    const items = instagram_list_items.map(item => ({
        ...item,
        src: item.media_type === 'VIDEO' ? item.thumbnail_url : item.media_url
    }));

    // Handlebarsテンプレートをコンパイルし、HTMLを生成
    const template = Handlebars.compile($instagram_list_item_template.html());
    const html = template({
        items: items
    });

    // 生成したHTMLをリスト要素に挿入
    $instagram_list.html(html);
}

上記のコードでは、wp_localize_script関数で定義したajaxData変数を利用して、WordPressのAjaxエンドポイントであるajaxData.ajaxurl (admin-ajax.php) にAPIコールを行います。
このリクエストでは、後ほどfunctions.phpで定義するアクションget_instagram_listを呼び出します。
これにより、サーバーサイドでInstagramのデータを取得し、その結果を受け取ります。

そして、Ajaxレスポンスをappend_instagram_list関数に渡し、Handlebars.jsでHTMLを生成し、data-instagram-list属性が付与された要素に挿入することで、画像一覧が表示されます。
※Instagramには動画もあるので、動画の場合はサムネイルURLを、画像の場合はメディアURLをsrcとして分岐して処理します。

PHP(functions.php)

WordPressテーマ内のfunctions.phpで、Instagram APIからデータを取得します。


// Ajaxリクエストのハンドラーを登録
// `wp_ajax_`はログインユーザー向け、`wp_ajax_nopriv_`は未ログインユーザー向け
add_action('wp_ajax_get_instagram_list', 'handle_get_instagram_list');
add_action('wp_ajax_nopriv_get_instagram_list', 'handle_get_instagram_list');

function handle_get_instagram_list() {
    // nonceチェック(CSRF対策)。クライアントサイドから送られたnonce値を検証
    check_ajax_referer('ajax_nonce', 'nonce');

    // Instagram APIからデータを取得する関数を呼び出す
    $response = get_instagram_list_from_api();

    // APIリクエストの成否に応じてJSONレスポンスを返す
    if ($response === null) {
        wp_send_json_error('APIリクエストに失敗しました'); // 失敗時はエラーレスポンス
    } else {
        wp_send_json_success($response); // 成功時はデータをJSONで返す
    }
}

/**
 * Instagram APIからデータを取得する
 * @return object|null 成功時はデコードされたJSONデータ(stdClassオブジェクト)、失敗時はnull
 */
function get_instagram_list_from_api() {
    // 環境変数からビジネスカウントIDとアクセストークンを取得
    $instagram_business_account_id = getenv('INSTAGRAM_BUSINESS_ACCOUNT_ID');
    $eternal_access_token = getenv('INSTAGRAM_ETERNAL_ACCESS_TOKEN');

    // Instagram Graph APIのURLを構築
    // 取得したいフィールド(name, mediaなど)を指定し、メディアの取得数も制御
    $url = 'https://graph.facebook.com/v22.0/' . $instagram_business_account_id . '?fields=name,media.limit(8){caption,media_url,thumbnail_url,permalink,like_count,comments_count,media_type}&access_token=' . $eternal_access_token;

    // cURLを使ってAPIリクエストを送信
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で取得
    $response = curl_exec($curl);
    curl_close($curl);

    // cURLが失敗した場合
    if ($response === false) {
        return null;
    }

    // JSONレスポンスをデコードして返す
    return json_decode($response);
}

WordPressのAjax機能を利用するために、add_action関数を使って、handle_get_instagram_list関数を登録します。
※ログインユーザー向けと未ログインユーザー向けどちらも登録が必要です。

handle_get_instagram_list関数では、まずcheck_ajax_refererを使ってCSRF対策のためのnonce値を検証し、不正なリクエストでないことを確認します。
その後、Instagram APIからデータを取得するget_instagram_list_from_api関数を呼び出し、結果をJSON形式でフロントエンドに返します。

【番外編】SnapWidgetでも簡単にInstagramの画像一覧を埋め込みは可能。

「自分でコードを書くのはちょっと大変…」と感じる方には、SnapWidget(https://snapwidget.com/)のサービスを利用する方法もあります。

SnapWidgetを使えば、簡単にInstagramの画像一覧をWebサイトに埋め込むことができます。
無料で利用できますが、無料版の場合、画像をクリックすると広告が掲載されたSnapWidgetのページに遷移する点がデメリットです。
また、表示レイアウトのパターン数にも制限があり、表現の幅は狭まります。

もし、広告なしでInstagramの画像ページへ直接リンクさせたい、またはレイアウトやデザインにこだわりたいという場合は、今回の記事でご紹介したInstagram Graph APIを使った自社実装がおすすめです。
実装の手間はかかりますが、その分、自由にカスタマイズできる大きなメリットがあります。

さいごに

今回は、Instagram Graph APIを使ってWordPressに画像一覧を実装する具体的なパターンをご紹介しました。

この方法であれば、ある程度自由に画像を並べて表示でき、デザインの自由度も高まります。ぜひご自身のWebサイトに活用してみてください!

以上、Maromaroの松橋でした。