WordPressの構造化データ実装|プラグインなしでJSON-LDを出力する方法
WordPressサイトのSEOをさらに一歩先へ進めるために欠かせないのが「構造化データ」の実装です。検索エンジンのクローラーに対して、ページのコンテンツが「何について書かれているのか」をより正確に伝えるための技術的なマークアップを指します。
構造化データを適切に実装すると、Googleの検索結果に「よくある質問(FAQ)」「星評価(レビュー)」「パンくずリスト」などの「リッチリザルト」が表示されるようになり、クリック率(CTR)の劇的な向上に繋がります。
一般的にプラグインで実装する手法が知られていますが、本記事ではサイトの軽量化と自由度を優先し、「プラグインなし(functions.phpへの記述)」でJSON-LDを出力する方法を5つのパートに分けて詳しく解説します。
1. 構造化データとは?検索エンジンとの「共通言語」
構造化データとは、Webページ上の情報を検索エンジンが理解しやすいようにタグ付けしたデータのことです。人間はデザインを見て「これが記事のタイトルだ」「これが著者の名前だ」と直感的に理解できますが、クローラーはコードからそれを読み取る必要があります。
そこで、「Schema.org」という世界共通の規格に基づき情報を整理して記述することで、Googleなどの検索エンジンがコンテンツの内容を100%理解できるように手助けをするのです。
これは、SEO対策の基本をマスターした後に取り組むべき、高度な技術的SEOの一つです。
2. なぜプラグインなしの「JSON-LD」が最強なのか
構造化データの実装方法にはいくつか種類がありますが、現在Googleが最も推奨しているのが「JSON-LD(ジェイソン・エルディー)」という記述形式です。そして、それをプラグインなしで自作することには大きなメリットがあります。
2-1. サイトの表示速度を落とさない
構造化データ用のプラグインを導入すると、それだけでPHPの処理やデータベースへの負荷が増えます。前回の連載で解説したWordPressの表示速度を改善する方法でも触れた通り、不要なプラグインは極限まで減らすのが理想です。直接記述すれば、コードの肥大化を最小限に抑えられます。
2-2. 柔軟なカスタマイズが可能
プラグインの場合、出力される項目が制限されていたり、余計なデータが出力されたりすることがあります。自作(直書き)であれば、記事ごとに著者のプロフィールを変更したり、特定のカテゴリだけ特別なマークアップを適用したりといった細かな調整が可能です。
2-3. テーマのアップデートに強い
適切に子テーマのfunctions.phpで管理すれば、テーマやプラグインの更新によって設定が上書きされたり、バグが発生したりするリスクを軽減できます。
3. 構造化データの基本構成(JSON-LDの型)
プラグインなしで実装する場合、まず理解すべきなのはJSON-LDの記述形式です。HTMLのどこに置いても動作しますが、一般的には <head> 内に出力させます。基本の型は以下のようになります。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "記事のタイトル",
"author": {
"@type": "Person",
"name": "著者名"
},
"datePublished": "公開日"
}
</script>
このように、波括弧 {} 内に情報を並べていく非常にシンプルな構造です。WordPressでは、この「記事のタイトル」や「公開日」の部分に、WordPressの関数(get_the_titleなど)を当てはめて動的に出力させることになります。
こうした技術的な対応は、ホームページ制作の現場でも、SEOに強い制作会社が必ずと言っていいほど行っている施策です。
4. パンくずリストをJSON-LDで自動出力する
「パンくずリスト」の構造化データは、Googleの検索結果にサイトの階層構造(リッチリザルト)を表示させるために不可欠です。これにより、ユーザーは検索結果の時点から「このページがどのカテゴリに属しているか」を把握できるようになり、安心感とクリック率の向上に繋がります。
4-1. テンプレートに依存しない実装のメリット
多くのWordPressテーマにはパンくずリストの表示機能がありますが、必ずしもJSON-LD形式で出力されているとは限りません。functions.phpに直接記述することで、どんなテーマを使用していても一貫して高品質な構造化データをGoogleに提供できます。これは、ホームページの作り方において、「デザイン」と「検索エンジン向けデータ」を分離して管理するプロのテクニックです。
4-2. 【コード】パンくずリスト自動出力関数
以下のコードを、子テーマの functions.php に追加します。このコードは、トップページ、投稿ページ、カテゴリーページの階層を自動で判別してJSON-LDを生成します。
function add_breadcrumb_structered_data() {
if (is_front_page()) return; // トップページは除外
$breadcrumbs = [
["name" => "ホーム", "item" => home_url('/')]
];
if (is_single()) {
$categories = get_the_category();
if ($categories) {
$cat = $categories[0];
$breadcrumbs[] = ["name" => $cat->name, "item" => get_category_link($cat->term_id)];
}
$breadcrumbs[] = ["name" => get_the_title(), "item" => get_permalink()];
} elseif (is_category()) {
$cat = get_queried_object();
$breadcrumbs[] = ["name" => $cat->name, "item" => get_category_link($cat->term_id)];
}
$json_data = [
"@context" => "https://schema.org",
"@type" => "BreadcrumbList",
"itemListElement" => []
];
foreach ($breadcrumbs as $index => $breadcrumb) {
$json_data["itemListElement"][] = [
"@type" => "ListItem",
"position" => $index + 1,
"name" => $breadcrumb["name"],
"item" => $breadcrumb["item"]
];
}
echo '<script type="application/ld+json">' . json_encode($json_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</script>';
}
add_action('wp_head', 'add_breadcrumb_structered_data');
5. 記事(Article)の構造化データで信頼性を伝える
次に重要なのが「Article(記事)」または「BlogPosting」のマークアップです。これにより、ニュースサイトのトップ記事のような大きなサムネイル付きの表示(カルーセルなど)に選ばれる可能性が高まります。
5-1. E-E-A-T(専門性・権威性など)の強化
Googleは近年、記事の「著者」が誰であるかを非常に重視しています。構造化データ内で著者の情報(Person)やサイト名(Organization)を明記することは、WordPressは初心者には難しい?と悩む層に対しても、情報の信頼性を証明する強力な手段となります。
5-2. 必要なプロパティの整理
Article構造化データには、以下の情報を盛り込むのが標準的です。
- headline: 記事のタイトル
- image: アイキャッチ画像のURL
- datePublished: 公開日
- dateModified: 最終更新日
- author: 著者名とプロフィールURL
これらを動的に取得することで、投稿を更新するたびに自動で最新のデータがGoogleに送信されます。これはブログ更新のSEO効果を最大化するために必須の設定です。
6. よくある質問(FAQ)を記事ごとに出力する実装術
Googleの検索結果で、タイトルの下に質問と回答が折りたたみ形式で表示されているのを見たことがないでしょうか?これが「FAQリッチリザルト」です。これを実装すると、検索結果画面での自サイトの面積が広がり、競合サイトよりも目立たせることができます。
6-1. カスタムフィールドを活用した動的出力
全ページ共通のFAQではなく、各記事の内容に沿ったFAQを出力するには、WordPressの「カスタムフィールド」を利用するのが最もスマートです。これは、ホームページ集客のコツとしても非常に有効な手法です。デザインを崩すことなく、検索エンジンにだけ追加の付加価値情報を伝えることができます。
6-2. 【コード】FAQ構造化データの自動生成関数
以下のコードを functions.php に追加してください。この記事では、カスタムフィールドの名前(キー)を faq_question_1, faq_answer_1 のように設定することを想定しています。
function add_faq_structured_data() {
if (is_single()) {
$faq_items = [];
// 最大3つまでのFAQを取得する例
for ($i = 1; $i <= 3; $i++) {
$question = get_post_meta(get_the_ID(), 'faq_question_' . $i, true);
$answer = get_post_meta(get_the_ID(), 'faq_answer_' . $i, true);
if ($question && $answer) {
$faq_items[] = [
"@type" => "Question",
"name" => $question,
"acceptedAnswer" => [
"@type" => "Answer",
"text" => $answer
]
];
}
}
if (!empty($faq_items)) {
$json_data = [
"@context" => "https://schema.org",
"@type" => "FAQPage",
"mainEntity" => $faq_items
];
echo '<script type="application/ld+json">' . json_encode($json_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</script>';
}
}
}
add_action('wp_head', 'add_faq_structured_data');
6-3. FAQ実装時の注意点とポリシー遵守
FAQ構造化データを実装する際は、必ず「ページ内に実際に記載されている内容」を記述してください。ページに存在しない回答を構造化データだけで出力すると、Googleのスパムポリシーに抵触し、手動対策(ペナルティ)を受けるリスクがあります。
失敗しないホームページ制作会社の選び方でも、こうした「表に見える部分と裏側の整合性」を正しく管理できるかどうかが、プロの技術力の見せ所となります。
7. サイトロゴと運営者情報(Organization)の共通化
個別の記事だけでなく、サイト全体の信頼性を示すための構造化データも重要です。トップページのみに出力される「Organization(組織)」や「WebSite」のマークアップを設定しましょう。
7-1. E-E-A-Tを高める組織情報の記述
「このサイトは誰が運営しているのか」を明確にすることは、SEO対策の基本において信頼性(Trustworthiness)の向上に直結します。会社名、ロゴURL、公式SNSアカウント(sameAs)などを紐付けることで、Googleに対して「実在する組織による信頼できるサイト」であることをアピールできます。
7-2. ナレッジパネルへの影響
Organizationを正しく記述しておくと、社名やサイト名で検索した際に、画面右側に表示される「ナレッジパネル」にロゴやSNSリンクが表示されやすくなります。これは、MEO対策と並んで、指名検索(ブランド名検索)時の成約率に大きく寄与します。
8. 記事(Article)構造化データの全自動出力
ブログ記事やニュースページにおいて、Googleに最も多くの情報を伝えられるのが「Article」構造化データです。これを正しく実装すると、検索結果のトップニュース枠やカルーセルに掲載されるチャンスが広がります。手動で設定するのは現実的ではないため、WordPressのテンプレートタグを活用して自動化しましょう。
8-1. 【コード】Article構造化データの完全版
以下のコードを functions.php に追加してください。このコードは、投稿ページ(single)の場合に、記事タイトル、画像、投稿日、更新日、著者名を自動的にJSON-LDとして出力します。
function add_article_structured_data() {
if (is_single()) {
global $post;
$setup_post = $post;
// アイキャッチ画像の取得
$image_id = get_post_thumbnail_id($setup_post->ID);
$image_url = $image_id ? wp_get_attachment_image_url($image_id, 'full') : 'デフォルト画像のURL';
$json_data = [
"@context" => "https://schema.org",
"@type" => "BlogPosting",
"mainEntityOfPage" => [
"@type" => "WebPage",
"@id" => get_permalink($setup_post->ID)
],
"headline" => get_the_title($setup_post->ID),
"image" => [
$image_url
],
"datePublished" => get_the_date('c', $setup_post->ID),
"dateModified" => get_the_modified_date('c', $setup_post->ID),
"author" => [
"@type" => "Person",
"name" => get_the_author_meta('display_name', $setup_post->post_author),
"url" => get_author_posts_url($setup_post->post_author)
],
"publisher" => [
"@type" => "Organization",
"name" => get_bloginfo('name'),
"logo" => [
"@type" => "ImageObject",
"url" => "サイトロゴのURL"
]
]
];
echo '<script type="application/ld+json">' . json_encode($json_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</script>';
}
}
add_action('wp_head', 'add_article_structured_data');
8-2. 日付フォーマット「ISO 8601」の重要性
構造化データにおいて、日付は get_the_date('c') のように、ISO 8601形式(例:2024-05-20T10:00:00+09:00)で出力する必要があります。これはクローラーがタイムゾーンを正確に理解するために必須です。更新日(dateModified)を明記することは、ホームページのリニューアルや記事のリライトを行った際、検索エンジンに「最新の情報である」ことを伝える強力なシグナルになります。
9. 画像リソースの最適化とエラー回避
Article構造化データで最もエラーが出やすいのが画像(image)項目です。Googleは特定の解像度やアスペクト比を推奨しています。
9-1. アイキャッチ未設定時のフォールバック
記事にアイキャッチ画像が設定されていない場合、構造化データが空になりエラーとなります。上記のコードでは、アイキャッチがない場合に「デフォルト画像のURL」を出すように制御していますが、これはサイトロゴや共通のバナー画像に設定しておくのがベストです。飲食店・美容室のホームページ制作など、ビジュアルが重視されるサイトでは、必ず魅力的なアイキャッチを設定する運用を徹底しましょう。
9-2. 適切な画像サイズの指定
Googleのリッチリザルト要件では、画像は幅1200ピクセル以上であることが推奨されています。あまりに小さな画像を指定すると、Search Consoleで警告が出る場合があります。前回の表示速度改善の回でも触れましたが、「軽量化しつつ、高解像度を維持する」というバランスが構造化データSEOにおいても重要です。
10. 実装後の検証:リッチリザルトテストとSearch Console
コードを functions.php に記述した後は、必ず「正しく認識されているか」をテストする必要があります。記述ミスがあると、リッチリザルトが表示されないだけでなく、Search Consoleでエラーが通知される原因になります。
10-1. リッチリザルトテストの活用
Googleが提供している「リッチリザルトテスト」ツールを使用します。公開後のURLを入力するか、公開前であればコードを直接貼り付けてテストできます。 ここで「有効なアイテム」として検出され、プレビューで意図した通り(パンくずリストやFAQなど)に表示されていれば成功です。
10-2. Search Consoleでのモニタリング
実装から数日〜数週間経つと、Google Search Consoleの「拡張」メニューに各構造化データの項目が出現します。
- 有効:正しく認識され、リッチリザルトの対象になっています。
- 致命的な問題:コードにエラーがあり、認識されていません。早急な修正が必要です。
- 警告(非致命的な問題):推奨される一部の項目(例:Articleの著者URLなど)が不足していますが、リッチリザルト自体は表示可能です。
これは、ホームページのリニューアルを行った際にも、検索エンジンからの再評価を促すために必ずチェックすべきポイントです。
11. 複数の構造化データを統合して管理するコツ
これまでの回で「パンくずリスト」「FAQ」「Article」など複数のデータを紹介してきました。これらをバラバラに出力するのではなく、一つの @graph という仕組みを使って統合すると、コードがさらにスリムになります。
11-1. @graph によるデータ連結
JSON-LDには、複数の型を一つの <script> タグにまとめる「@graph」という記法があります。これを使うと、ブラウザの読み込み回数を減らせるため、WordPressの表示速度改善の観点からも非常に有利です。
11-2. コードの保守性を高める
functions.phpが肥大化して管理しにくい場合は、structured-data.php のような別ファイルを作成し、それを functions.php から get_template_part などで読み込むようにしましょう。これは、失敗しないホームページ制作会社の選び方でも重視される「メンテナンス性の高いサイト設計」の基本です。
ユーザーには「使いやすいデザイン」を、検索エンジンには「理解しやすい構造化データ」を。この両輪を回すことで、あなたのWordPressサイトはより多くのターゲットに届くようになるはずです。