はじめに

WordPressサイトで構造化データ(JSON-LD)を実装していますか?

Googleに対して「このページは何のページか」「誰が書いたのか」「いつ更新されたのか」などを正しく伝えるために、構造化データは非常に重要です。

しかし、ただ固定の構造化データをすべてのページに書くだけでは意味がありません。
大切なのは、ページの種類ごとに内容を動的に変えて出力することです。

本記事では、WordPressで構造化データをページの種類に応じて動的に出力し、
実際にページごとにどのように変わっているのかを検証してみます。


実装例:functions.phpに追加したコード

function add_post_type_jsonld() {
if ( is_singular() ) {
global $post;

$post_type = get_post_type( $post );
$title = get_the_title( $post );
$url = get_permalink( $post );
$author_name = get_the_author_meta( 'display_name', $post->post_author );
$date_pub = get_the_date( 'c', $post );
$date_mod = get_the_modified_date( 'c', $post );
$excerpt = wp_strip_all_tags( get_the_excerpt( $post ) );
$image_url = get_the_post_thumbnail_url( $post, 'full' ) ?: 'https://example.com/default-image.png';

// 投稿タイプに応じてスキーマの種類を切り替え
if ( $post_type === 'post' ) {
$schema_type = 'BlogPosting';
} elseif ( $post_type === 'page' ) {
$schema_type = 'WebPage';
} else {
$schema_type = 'Article';
}

$jsonld = [
'@context' => 'https://schema.org',
'@type' => $schema_type,
'mainEntityOfPage' => [
'@type' => 'WebPage',
'@id' => $url,
],
'headline' => $title,
'author' => [
'@type' => 'Person',
'name' => $author_name,
'url' => get_author_posts_url( $post->post_author ),
],
'publisher' => [
'@type' => 'Organization',
'name' => get_bloginfo( 'name' ),
'logo' => [
'@type' => 'ImageObject',
'url' => 'https://example.com/logo-square.png',
],
],
'datePublished' => $date_pub,
'dateModified' => $date_mod,
'description' => $excerpt,
'url' => $url,
'image' => $image_url,
];

echo '<script type="application/ld+json">' .
wp_json_encode( $jsonld, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ) .
'</script>';
}
}
add_action( 'wp_head', 'add_post_type_jsonld' );

ポイント解説:「@type」と「mainEntityOfPage」

  • @type はページ種別に応じて切り替えています。
    • 投稿は BlogPosting
    • 固定ページは WebPage
    • その他の投稿タイプは汎用的に Article を指定
  • mainEntityOfPage は、この記事が属するページ情報として、WebPage タイプとページのURLを指定しています。
    これによりGoogleに記事とページの関係が正しく伝わります。

実際の出力例

投稿ページ

{
"@type": "BlogPosting",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/sample-post/"
},
...
}

固定ページ

{
"@type": "WebPage",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/about/"
},
...
}

出力の確認方法

  • ブラウザのソースコード(view-source:)で <script type="application/ld+json"> を探す
  • GoogleのリッチリザルトテストにURLを入れて検証
  • ページごとに @type@id が変わっていれば問題ありません

まとめ:構造化データは「動的に」「適切に」

構造化データはただ書くだけでなく、ページの種類に合わせて動的に変える設計が重要です。
WordPressの条件分岐を使い、適切なスキーマタイプを出力しましょう。

この設計によって、Googleへの正確な情報伝達とリッチリザルト獲得に繋がります。

ぜひご自身のサイトで検証してみてください。