



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒博士、構造化データを実装したいんですけど、WordPressやCMSのテンプレートを直接編集できない場合はどうすればいいですか?



よーく聞くんだぞ。今日はJavaScriptで構造化データを動的生成する方法について詳しく解説するぞい!テンプレート編集なしで実装できるんじゃ!



そうなんですか!?ぜひ教えてください!
構造化データは、検索エンジンにWebページの内容を正確に伝えるための重要な仕組みです。通常はHTMLに直接記述しますが、テンプレートファイルを編集できない環境や、ページごとに異なるデータを動的に挿入したい場合、JavaScriptでの実装が有効です。
本記事では、JavaScriptを使った構造化データの動的生成方法を、Google公式のガイドラインに基づいて詳しく解説します。Google Tag Manager、カスタムJavaScript、実装のベストプラクティスまで網羅しています。
「学習→収入」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
堀さん
働く場所や時間に縛られない生活を送りたいと考え、独学でプログラミング学習を開始するもレベルの差を感じ、WithCodeに入会されました。カリキュラムを進めた結果、見事卒業テストを合格し、現在は、WithCode Platinumで副業として案件を担当しています。
詳しくはこちらの記事をご覧ください。


堀さんの主な制作実績はこちら


構造化データ(Structured Data)は、Webページの内容を検索エンジンが理解しやすい形式でマークアップしたデータです。Schema.orgという標準規格に基づいて記述し、JSON-LD、Microdata、RDFaなどの形式で実装します。





HTMLに直接書くのではなく、JavaScriptで生成する理由は何ですか?



テンプレート編集が難しい場合や、動的なデータを扱う場合に便利なんじゃ!
WordPress、Shopify、WixなどのCMSでは、テーマやテンプレートファイルに直接アクセスできない場合があります。特に企業サイトやECサイトでは、開発会社がテーマを管理しており、マーケティング担当者が自由にコードを編集できないケースも珍しくありません。
そのような環境でも、JavaScriptを使えばページに構造化データを追加できます。例えば Google Tag Manager(GTM) を利用すれば、CMSのテンプレートを変更せずに<script type="application/ld+json"> を動的に挿入可能です。
この方法を使えば、
といったメリットがあります。特に大規模サイトでは、テンプレート改修よりもGTMでの実装のほうが運用コストを抑えられる場合があります。
JavaScriptを使う大きな利点のひとつが、ページごとに異なる情報を自動取得して構造化データに反映できる点です。
例えば次のようなケースです。
JavaScriptでDOMから情報を取得すれば、
document.querySelector('.product-price').textContent
のように、ページに表示されているデータをそのまま構造化データへ反映できます。
これにより、
といったメリットがあります。
構造化データはSEOに影響する要素ですが、実際の効果はサイトや検索クエリによって異なります。JavaScriptで生成する場合、Google Tag Managerなどを使ったA/Bテストが容易になるという利点があります。
例えば以下のようなテストが可能です。
これにより、
などを検証できます。
SEO施策は「実装して終わり」ではなく、「効果検証 → 改善」が重要です。JavaScript実装は、この検証サイクルを高速化できる点が強みです。
JavaScriptで構造化データ生成スクリプトを作成しておけば、同じコードを複数のWebサイトで再利用できます。
例えば以下のようなケースです。
一度作ったスクリプトをGTMや外部JavaScriptとして配布すれば、各サイトに簡単に導入できます。
これにより、
が可能になります。
Googleの公式ドキュメントでは、Product構造化データをJavaScriptで動的生成する場合、クロール頻度が低下する可能性があるとされています。
特にECサイトでは、
などが頻繁に更新されます。
もし構造化データがJavaScriptで生成されている場合、Googleがその情報を取得するためにページレンダリング(JavaScript実行) を行う必要があります。その結果、クロールの優先度が下がる場合があります。
そのためGoogleは、
などの重要なProductデータは、サーバーサイドレンダリング(HTML内に直接記述)を推奨しています。
GoogleはJavaScriptを実行してページをレンダリングすることができますが、その処理は二段階インデックスで行われます。
この仕組みのため、
といった場合、構造化データの認識が遅れる可能性があります。
特に以下の環境では注意が必要です。
HTML内に直接構造化データを書く場合は、ソースコードを見ればすぐに確認できます。しかしJavaScriptで生成する場合、どのタイミングでスクリプトが実行されるのかを理解する必要があります。
例えば以下のような問題が発生することがあります。
その結果、
といったトラブルにつながることがあります。
そのため実装後は必ず
などのツールで検証することが重要です。





具体的な実装方法を知りたいです!



うむ。まずはGoogle Tag Manager(GTM)を使った方法じゃ!Google Tag Manager(GTM)は、コードを直接編集せずにタグを管理できるツールじゃ。構造化データの実装にも非常に便利じゃぞ!
<head>と<body>にGTMスニペットを追加

ページから情報を取得するための変数を設定します。


例:記事タイトルを取得する変数
h1.article-title1. GTM管理画面で「タグ」→「新規」をクリック
2. 「タグタイプ」で「カスタムHTML」を選択


3. 以下のコードを入力
<script>
// 構造化データの作成
var structuredData = {
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{articleTitle}}", // GTM変数を使用
"author": {
"@type": "Person",
"name": "{{authorName}}"
},
"datePublished": "{{publishDate}}",
"dateModified": "{{modifiedDate}}",
"image": "{{articleImage}}",
"publisher": {
"@type": "Organization",
"name": "WithCode",
"logo": {
"@type": "ImageObject",
"url": "https://withcode.tech/logo.png"
}
},
"description": "{{articleDescription}}"
};
// script要素を作成
var script = document.createElement('script');
script.type = 'application/ld+json';
script.text = JSON.stringify(structuredData);
// headに追加
document.head.appendChild(script);
</script>






次は、GTMを使わずに、独自のJavaScriptコードで構造化データを生成する方法じゃ!こちらも覚えておくと非常に便利じゃぞ!



へえー、そういうこともできるんですね!はい、お願いします!
// DOMが読み込まれた後に実行
document.addEventListener('DOMContentLoaded', function() {
// ページから情報を取得
const title = document.querySelector('h1.article-title')?.textContent;
const author = document.querySelector('.author-name')?.textContent;
const publishDate = document.querySelector('time[itemprop="datePublished"]')?.getAttribute('datetime');
const modifiedDate = document.querySelector('time[itemprop="dateModified"]')?.getAttribute('datetime');
const image = document.querySelector('meta[property="og:image"]')?.getAttribute('content');
const description = document.querySelector('meta[name="description"]')?.getAttribute('content');
// 構造化データを作成
const structuredData = {
"@context": "https://schema.org",
"@type": "Article",
"headline": title,
"author": {
"@type": "Person",
"name": author
},
"datePublished": publishDate,
"dateModified": modifiedDate || publishDate,
"image": image,
"publisher": {
"@type": "Organization",
"name": "WithCode",
"logo": {
"@type": "ImageObject",
"url": "https://withcode.tech/logo.png"
}
},
"description": description,
"mainEntityOfPage": {
"@type": "WebPage",
"@id": window.location.href
}
};
// script要素を作成してheadに追加
const script = document.createElement('script');
script.type = 'application/ld+json';
script.textContent = JSON.stringify(structuredData, null, 2); // 読みやすいように整形
document.head.appendChild(script);
});document.addEventListener('DOMContentLoaded', function() {
// 商品情報を取得
const productName = document.querySelector('.product-name')?.textContent;
const productImage = document.querySelector('.product-image img')?.src;
const productPrice = document.querySelector('.product-price')?.textContent.replace(/[^0-9]/g, '');
const productCurrency = 'JPY';
const productAvailability = document.querySelector('.in-stock') ? 'InStock' : 'OutOfStock';
const productSKU = document.querySelector('[data-sku]')?.dataset.sku;
const productRating = document.querySelector('.rating-value')?.textContent;
const productReviewCount = document.querySelector('.review-count')?.textContent;
const structuredData = {
"@context": "https://schema.org",
"@type": "Product",
"name": productName,
"image": productImage,
"description": document.querySelector('.product-description')?.textContent,
"sku": productSKU,
"offers": {
"@type": "Offer",
"url": window.location.href,
"priceCurrency": productCurrency,
"price": productPrice,
"availability": `https://schema.org/${productAvailability}`,
"priceValidUntil": new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0] // 30日後
}
};
// 評価がある場合のみ追加
if (productRating && productReviewCount) {
structuredData.aggregateRating = {
"@type": "AggregateRating",
"ratingValue": productRating,
"reviewCount": productReviewCount
};
}
const script = document.createElement('script');
script.type = 'application/ld+json';
script.textContent = JSON.stringify(structuredData, null, 2);
document.head.appendChild(script);
});document.addEventListener('DOMContentLoaded', function() {
// パンくずリストの要素を取得
const breadcrumbItems = document.querySelectorAll('.breadcrumb-item');
if (breadcrumbItems.length === 0) return;
// パンくずリストの配列を作成
const itemListElement = Array.from(breadcrumbItems).map((item, index) => {
const link = item.querySelector('a');
return {
"@type": "ListItem",
"position": index + 1,
"name": item.textContent.trim(),
"item": link ? link.href : window.location.href
};
});
const structuredData = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": itemListElement
};
const script = document.createElement('script');
script.type = 'application/ld+json';
script.textContent = JSON.stringify(structuredData, null, 2);
document.head.appendChild(script);
});




JavaScriptで構造化データを生成するときの注意点はありますか?



Google公式のベストプラクティスに従うことが重要じゃ!



JavaScriptで構造化データをうまく実装するためにはどうしたら良いですか?



良い質問じゃ。ここでは、プロフェッショナルな実装をするための6つの方法を紹介するぞ!
情報を重複させず、既存のHTML要素から動的に取得します。
// 良い例:既存要素から取得
const title = document.querySelector('h1')?.textContent;
// 悪い例:ハードコーディング
const title = "商品タイトル";DOMが完全に読み込まれた後に実行することで、要素が確実に存在する状態で処理できます。
document.addEventListener('DOMContentLoaded', function() {
// 構造化データの生成処理
});要素が存在しない場合のエラーを防ぎます。
// 良い例:要素がなくてもエラーにならない
const author = document.querySelector('.author')?.textContent;
// 悪い例:要素がないとエラー
const author = document.querySelector('.author').textContent;各構造化データタイプには、必須プロパティがあります。Googleのドキュメントで確認しましょう。
例:Articleの必須プロパティ
headline(記事タイトル)image(画像URL)datePublished(公開日)author(著者)特にProductマークアップでは、JavaScriptよりもサーバーサイドレンダリングが推奨されます。Next.jsやNuxt.jsなどのフレームワークを使用すると、SSRが簡単に実装できます。
1つのページに複数の構造化データを配置できます。
// Articleと BreadcrumbListを両方追加
const articleData = { "@type": "Article", ... };
const breadcrumbData = { "@type": "BreadcrumbList", ... };
// それぞれ別のscript要素として追加
const script1 = document.createElement('script');
script1.type = 'application/ld+json';
script1.textContent = JSON.stringify(articleData);
document.head.appendChild(script1);
const script2 = document.createElement('script');
script2.type = 'application/ld+json';
script2.textContent = JSON.stringify(breadcrumbData);
document.head.appendChild(script2);




他にもテストや検証する方法もあるから覚えておくのじゃぞ!



はい、わかりました!よろしくお願いします!
Googleの公式ツール「リッチリザルトテスト」で、構造化データが正しく認識されるか確認します。
注意: コードスニペットを直接入力する方法もありますが、JavaScriptで動的生成する場合はCORS制限により正しく動作しないことがあります。URLを入力する方法を使用しましょう。
Schema.org公式のバリデーターでも検証できます。
実装後、ブラウザの開発者ツールで<head>内に構造化データが追加されているか確認します。
<head>内を確認<script type="application/ld+json">が追加されているか確認




JavaScriptの構造化データを実装するにあたってトラブルシューティングのことも知りたいです!



うむ。ここでは、主なトラブルシューティングを3つ紹介するぞい!
原因と解決法:
DOMContentLoadedイベントを使用?.)を使用JSON.stringify()を使用して正しい形式に原因と解決法:
YYYY-MM-DD)を使用原因と解決法:





実は、サーバーサイドでも構造化データを生成できる方法がある。これも覚えておくと非常に便利じゃぞ!



そうなんですね!勉強になります!
Next.jsを使えば、サーバーサイドで構造化データを生成できます。これはJavaScriptでの動的生成よりも推奨される方法です。
// pages/articles/[slug].tsx
import Head from 'next/head';
export default function ArticlePage({ article }) {
const structuredData = {
"@context": "https://schema.org",
"@type": "Article",
"headline": article.title,
"author": {
"@type": "Person",
"name": article.author
},
"datePublished": article.publishedAt,
"dateModified": article.updatedAt,
"image": article.coverImage,
"publisher": {
"@type": "Organization",
"name": "WithCode",
"logo": {
"@type": "ImageObject",
"url": "https://withcode.tech/logo.png"
}
},
"description": article.description
};
return (
<>



JavaScriptで構造化データを動的生成する方法がよく分かりました!まずはGoogle Tag Managerで試してみます!



その通りじゃ!GTMならコードを書かずに実装できるから、初心者にもおすすめじゃぞ!実装後は必ずリッチリザルトテストで検証するんじゃ!



はい!次のプロジェクトでブログ記事に構造化データを実装してみます!ありがとうございました!
本記事では、JavaScriptを使った構造化データの動的生成方法について、Google公式のガイドラインに基づいて詳しく解説しました。
重要なポイントは以下の通りです。
・構造化データのメリット:リッチリザルト表示、CTR向上、音声検索対応
・実装方法:Google Tag Manager、カスタムJavaScript、サーバーサイドレンダリング
・推奨方法:初心者はGTM、カスタマイズが必要ならJavaScript、本番環境ではSSR
・ベストプラクティス:既存HTML から変数抽出、DOMContentLoaded使用、必須プロパティを含める
・テスト方法:リッチリザルトテスト、Schema Markup Validator、開発者ツール
・注意点:Productマークアップは動的生成でクロール頻度が低下する可能性
WithCodeで学んだHTML・CSS・JavaScriptの基礎知識に、構造化データの実装技術を組み合わせれば、どんな実案件でもSEO最適化されたWebサイトを構築できます。
構造化データは、SEOにおいて非常に重要な要素です。ぜひ実際のプロジェクトで活用し、検索結果での視認性を向上させてください。


副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!