WordPressでAMPに対応した記事向けJSON-LDを出力する方法

WordPressで投稿ごとにJSON-LDを出力するコードを書いたので紹介。

スポンサーリンク
レクタングル(大)広告

JSON-LDの書き方

サイト上の記事で、schema.org/NewsArticle形式で、AMP向けに情報を指定してやれば、検索結果に意図したように情報を表示することができます。

例えば、JSON-LDで表記したとすると以下のような感じになります。

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "NewsArticle",
  "mainEntityOfPage":{
    "@type":"WebPage",
    "@id":"https://nelog.jp/wordpress-amp-json-ld/" 
  },
  "headline": "WordPressでAMPに対応した記事向けJSON-LDを出力する方法", 
  "image": {
    "@type": "ImageObject",
    "url": "https://nelog.jp/wp-content/uploads/2016/10/Wordpress-AMP-JSON-LD.jpeg",
    "width": 890, 
    "height": 594  },
  "datePublished": "2016-10-05T01:44:51+00:00",
  "dateModified": "2016-10-05T01:46:12+00:00", 
  "author": {
    "@type": "Person",
    "name": "わいひら" 
  },
  "publisher": {
    "@type": "Organization",
    "name": "Instant WordPress",
    "logo": {
      "@type": "ImageObject",
      "url": "https://nelog.jp/wp-content/uploads/2016/10/nelog-logo.png", 
      "width": 128,  
      "height": 60  
    }
  },
  "description": "Wordpressで投稿ごとにJSON-LDを書き出すコードの紹介です。" 
}
</script>

このように書くことで、タイトルや、サムネイル、投稿時間、ロゴなどが反映されて、Googleの検索結果のAMP部分に以下のように出力されます。

Googleの検索結果に以下のように反映される

こういった、schema.orgについて詳しくは、以下を参照してください。

Googleは、AMPに対応した記事の構造化データの仕様をデベロッパー向けサイトで公開した。従来の記事リッチスニペットに比べると必須または推奨のschema.orgのプロパティが大幅に増えている。

WordPressの投稿ごとにJSON-LDを出力する

で、Wordpressの場合だと、投稿ごとにいちいちJSON-LDを書くわけにはいかないので、Wordpress側から取得できる情報で、構造化データを出力してやる必要があります。

以下では、その方法について説明します。

functions.phpに関数を貼り付ける

まずは、functions.phpに以下のコードをコピペで追記してください。

//画像URLから幅と高さを取得する(同サーバー内ファイルURLのみ)
function get_image_width_and_height($image_url){
  $wp_upload_dir = wp_upload_dir();
  $uploads_dir = $wp_upload_dir['basedir'];
  $uploads_url = $wp_upload_dir['baseurl'];
  $image_file = str_replace($uploads_url, $uploads_dir, $image_url);
  $imagesize = getimagesize($image_file);
  if ($imagesize) {
    $res = array();
    $res['width'] = $imagesize[0];
    $res['height'] = $imagesize[1];
    return $res;
  }
}

これは、投稿に割り当てられているアイキャッチ画像から、画像の幅と高さを取得する関数です。

JSON-LDでは、画像を指定する際は、幅と高さも指定する必要があるので、この関数を作成しました。

headタグ内にJSON-LD出力コードを貼り付ける

あとは、ヘッダーにある<head></head>内に、以下のコードを貼り付けます。

headタグは、大抵のテーマの場合は、header.phpにあるかと思います。

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "NewsArticle",
  "mainEntityOfPage":{
    "@type":"WebPage",
    "@id":"<?php the_permalink(); ?>" // パーマリンクを取得
  },
  "headline": "<?php the_title();?>", //ページタイトルを取得
  "image": {
    "@type": "ImageObject",
<?php
// アイキャッチ画像URLを取得
$image_id = get_post_thumbnail_id();
$image = wp_get_attachment_image_src($image_id, true);
if ($image) {
  $image_url = $image[0];
  //アイキャッチから画像の幅と高さを取得
  $size = get_image_width_and_height($image_url);
  $width = $size ? $size['width'] : 800;  //画像の幅
  $height = $size ? $size['height'] : 800;//画像の高さ
} else {
  $image_url = 'アイキャッチが設定されていない時用の画像のURL';//画像URLの指定
  $width = 696; //画像の幅
  $height = 450;//画像の高さ
} ?>
    "url": "<?php echo $image_url;?>",
    "width": <?php echo $width; ?>,  //画像の幅((少なくとも696ピクセル以上が望ましい)
    "height": <?php echo $height; ?> //画像の高さ
  },
  "datePublished": "<?php echo get_the_time('c'); ?>", //記事投稿時間
  "dateModified": "<?php echo get_the_modified_time('c'); ?>", //記事更新時間
  "author": {
    "@type": "Person",
    "name": "<?php the_author_meta('nickname'); ?>" //投稿者ニックネーム
  },
  "publisher": {
    "@type": "Organization",
    "name": "<?php bloginfo('name'); ?>", //サイト名
    "logo": {
      "@type": "ImageObject",
      "url": "ロゴ画像のURL", ////画像URLの指定
      "width": 600,  //ロゴ画像の幅(幅600px以下)
      "height": 60  //ロゴ画像の高さ(高さ60px以下)
    }
  },
  "description": "<?php echo mb_substr(strip_tags($post->post_content), 0, 110); ?>…" //通常のテーマでは投稿から説明文は取得できないので本文の抜粋を取得する
}
</script>

「アイキャッチが設定されていない時用の画像のURL」や「ロゴ画像のURL」は自前でアップロードして、画像の幅と高さも併せて指定してください。

imageのurlは、幅が696px以上ないと、警告が出ます。ですので、696px以上のアイキャッチを設定する必要があるようです。

logoのwidthは600px以下である必要があります。また、logoのheightは60px以下である必要があります。

descriptionに関しては、通常のテーマの場合、Wordpressの投稿情報からだけでは、記事の説明文は取得できないため、本文の抜粋で代用しています。

schema.org/NewsArticleについて詳しくは、以下を参照してください。

Learn how adding article schema markup to your news articles and blogs can enhance their appearance in Google Search results.
Schema.org Type: NewsArticle - A NewsArticle is an article whose content reports news, or provides background context and supporting materials for understanding...

まとめ

こんな感じで、2回コピペするだけで、Wordpress投稿情報からJSON-LDを出力できるようになりました。

とりあえず、この書き方でGoogle Search ConsoleのAMP(Accelerated Mobile Pages)の構造化エラーも出なくなりました。

というわけで、「GoogleのAMP検索結果に意図通りの情報を表示したい」という場合は、JSON-LDを使った出力を試してみると良いかもしれません。