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