構造化データ

構造化データを設定すると…

Google検索でちょっといいことがある。

下記をコピペして、add_structured_article.php として保存。自分の環境に応じて数ヶ所設定して下さい。

<?php
/** 構造化データ挿入 **/
if (!function_exists('add_structured_article')) :
function add_structured_article()
{
   global $post;
   if (is_front_page() || is_home() || is_singular() || is_category()) {

      $st_site_url = home_url(); // サイトアドレス

      if (is_singular()) { // 記事&固定ページ
         $post = get_queried_object(); // 表示ページのWPオブジェクトを取得
         setup_postdata($post);
      }

      if (!is_category()) {
         $st_page_title  = '';
         $st_page_descr  = '';
         $st_page_url    = '';
         $default_img = 'TOPページまたはアイキャッチ画像がないときに使われる画像のURL';
         $logo_img       = 'ロゴ画像のURL';              // ロゴ画像のURL
         $st_author_name = 'サイトの管理者名';           // サイトの管理者名
         $st_author_url  = '管理者のサイトURL';          // 管理者のサイトURL
         $st_site_name   = get_bloginfo('name');        // サイトのタイトル
         $st_site_descr  = get_bloginfo('description'); // キャッチフレーズ

         if (is_singular()) { // 記事&固定ページ
            $st_page_title = $post->post_title;
            $st_page_descr = mb_substr(get_the_excerpt(), 0, 100); // 抜粋
            $st_page_url   = get_permalink();
            $st_page_type  = 'Article'; // Article, NewsArticle, BlogPosting のいずれか
            /** 投稿者 **/
            $author = get_userdata($post->post_author);
            $st_author_name = $author->display_name; // ブログ上の表示名
            $st_author_url  = $author->user_url;     // 著者のサイトURL

         } else { // トップページ
            $st_page_title = $st_site_name;
            $st_page_descr = $st_site_descr;
            $st_page_url   = $st_site_url;
            $st_page_type  = 'WebSite';
         }

         /** サムネイル画像 **/
         if (is_singular() && has_post_thumbnail()) {
            $ps_thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'full');
            $st_image = array(
               '@type'  => 'ImageObject',
               'url'    => esc_url($ps_thumb[0]),
               'width'  => $ps_thumb[1],
               'height' => $ps_thumb[2],
            );
         } else { // トップページまたはアイキャッチなし場合
            $st_image = array(
               '@type' => 'ImageObject',
               'url'   => esc_url($default_img),
            );
            $img_size = @getimagesize($default_img);
            if ($img_size) {
               $st_image['width']  = $img_size[0];
               $st_image['height'] = $img_size[1];
            }
         }

         /** ロゴ画像 **/
         $st_logo = array(
            '@type' => 'ImageObject',
            'url'   => esc_url($logo_img),
         );
         $img_size = @getimagesize($logo_img);
         if ($img_size) {
            $st_logo['width']  = $img_size[0];
            $st_logo['height'] = $img_size[1];
         }

         /** 構造化データ **/
         $json_data = array(
            '@context'         => 'https://schema.org',
            '@type'            => $st_page_type,
            'mainEntityOfPage' => array(
               '@type' => 'WebPage',
               '@id'   => esc_url($st_page_url),
            ),
            'headline'         => $st_page_title,
            'image'            => $st_image,
            'datePublished'    => get_the_time('c'),
            'dateModified'     => get_the_modified_time('c'),
            'author'           => array(
               '@type' => 'Person', // Person または Organization
               'name'  => $st_author_name, // 著者名
               'url'   => esc_url($st_author_url), // 著者のサイトURL
            ),
            'publisher'        => array(
               '@type'       => 'Organization', // Organization または Person
               'name'        => $st_site_name, // サイトのタイトル
               'url'         => esc_url($st_site_url), // サイトアドレス
               'description' => $st_site_descr, // キャッチフレーズ
               'logo'        => $st_logo, // @typeがOrganization時のみ使用可
            ),
            'description'      => $st_page_descr, // 抜粋
         );
      }

      /** パンくずリストの構造化データ **/
      if (is_category() || is_single()) {
         $cat_list = array();

         /** カテゴリページ **/
         if (is_category()) {
            $cat      = get_queried_object(); // WP_Term
            $cat_link = get_category_link($cat->cat_ID);

            // 現在のカテゴリ
            array_unshift($cat_list, array('name' => $cat->name, 'item' => $cat_link));

            $cat_id = $cat->parent;
         }

         /** 記事ページ **/
         else {
            $cat = get_the_category(); // WP_Term[]
            $cat_id = (isset($cat[0]->cat_ID)) ? $cat[0]->cat_ID : 0;

            // 現在のページを含める
            // array_unshift($cat_list, array('name' => $st_page_title, 'item' => $st_page_url));
         }

         while ($cat_id != 0) {
            $cat      = get_category($cat_id); // WP_Term
            $cat_link = get_category_link($cat_id);
            array_unshift($cat_list, array('name' => $cat->name, 'item' => $cat_link));
            $cat_id = $cat->parent;
         }

         // HOMEを含める
         // array_unshift($cat_list, array('name' => 'HOME', 'item' => $st_site_url));

         $i = 1;
         $st_itemListElement= array();

         foreach ($cat_list as $value) {
            $st_itemListElement[] = array(
               '@type'    => 'ListItem',
               'position' => $i,
               'name'     => $value['name'],
               'item'     => esc_url($value['item']),
            );
            $i++;
         }

         $json_breadcrumb = array(
            '@context'        => 'https://schema.org',
            '@type'           => 'BreadcrumbList',
            'itemListElement' => $st_itemListElement,
         );

         if (is_single())
            $json_data = array($json_data, $json_breadcrumb);
         else
            $json_data = $json_breadcrumb;
      }

      echo '<script type="application/ld+json">';
      echo json_encode($json_data, JSON_UNESCAPED_SLASHES |
         JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
      echo '</script>';

      if (is_singular()) wp_reset_postdata();
   }
} // END add_structured_article

add_action('wp_head', 'add_structured_article');
endif;

ファイル構成が下記の場合

├ functions.php
└ fnc
   └ add_structured_article.php

functions.php に下記を追加記述

/** 構造化データ挿入 **/
get_template_part('fnc/add_structured_article');

簡単な説明

22、23行目はトップページ表示時に使用されます。管理者のサイトURL は管理者のプロフィールページや SNS など。

$st_author_name = 'Qarry'; // サイトの管理者名
$st_author_url  = '';      // 管理者のサイトURL

トップページまたはアイキャッチ画像がない場合に使用されるデフォルトの画像を 20行目で設定しておきます。

$default_img = 'https://qarry.net/images/top.jpg'; // デフォルト画像URL

デフォルト画像の幅と高さは 58行目で getimagesize() 関数で取得してますが、直接書いてもいいです。(53~63行目)

} else { // トップページまたはアイキャッチなし場合
   $st_image = array(
      '@type'  => 'ImageObject',
      'url'    => esc_url($default_img),
      'width'  => 1200,
      'height' => 630,
   );
}

35行目、著者のサイトURL は WordPress の「ユーザー」で設定しているサイトを取得しています。プロフィールページや SNSページを設定しておいて下さい。

著者のサイト、管理者のサイトのいずれもない場合は 91行目を削除して下さい。

'url'   => esc_url($st_author_url), // 著者のサイトURL

93~99行目の 'publisher' の設定では '@type' が 'Organization' でないと 'logo' が使えません。個人のブログなどではとりあえず 'name' と 'url' があればいいんじゃないかな?

   'publisher'        => array(
      'name' => $st_site_name,         // サイトのタイトル
      'url'  => esc_url($st_site_url), // サイトアドレス
   ),

'publisher' の '@type' が 'Organization' で、'logo' を設定する場合は 21行目にロゴ画像のURL を書いて下さい。
サムネイル画像と同様にサイズが分かっている場合は直接書いても OK。(65~74行目)

      /** ロゴ画像 **/
      $st_logo = array(
         '@type'  => 'ImageObject',
         'url'    => esc_url($logo_img),
         'width'  => 600,
         'height' => 60,
      );

使用できるロゴ画像は 600x60ピクセル以内の長方形で、かつ、幅が600ピクセルか高さが60ピクセルでなければならず、ほかにも文字サイズなどに制限があるらしい。

パンくずリストに HOME を含める場合や現在のページを含める場合は、それぞれ 136行目、125行目の先頭の // を削除して下さい。

// HOMEを含める
 array_unshift($cat_list, array('name' => 'HOME', 'item' => $st_site_url));
 // 現在のページを含める
 array_unshift($cat_list, array('name' => $st_page_title, 'item' => $st_page_url));

関連記事

OGP and 構造化データ 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です