OGP and 構造化データ

OGP and 構造化データ

OGP と構造化データ、どちらもやってることはほぼ同じなので一つにまとめてみました。

<?php
/** OGPを使用する宣言(htmlタグに属性を追加)**/
if (!function_exists('add_og_prefix')) :
function add_og_prefix($tagdata)
{
   global $wp_query;
   if ($wp_query->is_front_page || $wp_query->is_home || $wp_query->is_singular) {
      $tagdata .= ' prefix="og: http://ogp.me/ns#"';
   }
   return $tagdata;
}
add_filter('language_attributes', 'add_og_prefix');
endif;


/** OGP and 構造化データ挿入 **/
if (!function_exists('add_og_and_struct')) :
function add_og_and_struct()
{
   global $wp_query, $post;

   if ($wp_query->is_front_page || $wp_query->is_home ||
       $wp_query->is_singular || $wp_query->is_category) {

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

      $st_site_url = home_url(); // サイトアドレス
      if (!$wp_query->is_category) {
         $og_title = '';
         $og_descr = '';
         $og_url   = '';
         $og_img = 'TOPページまたはアイキャッチ画像がないときに使われる画像のURL';
         $logo_img       = 'ロゴ画像のURL';              // ロゴ画像のURL
         $st_author_name = 'サイトの管理者名';           // サイトの管理者名
         $st_author_url  = '管理者のサイトURL';          // 管理者のサイトURL
         $og_site_name   = get_bloginfo('name');        // サイトのタイトル
         $st_site_descr  = get_bloginfo('description'); // キャッチフレーズ

         if ($wp_query->is_singular) { // 記事&固定ページ
            $og_title = $post->post_title;
            $og_descr = mb_substr(get_the_excerpt(), 0, 100); // 抜粋
            $og_url   = get_permalink();
            $og_type  = 'article';
            $st_page_type  = 'Article'; // Article, NewsArticle, BlogPosting のいずれか
            /** 投稿者 **/
            $author = get_userdata($post->post_author); // WP_User オブジェクトを取得
            $st_author_name = $author->display_name; // ブログ上の表示名
            $st_author_url  = $author->user_url;     // 著者のサイトURL

         } else { // トップページ
            $og_title = $og_site_name;
            $og_descr = $st_site_descr;
            $og_url   = $st_site_url;
            $og_type  = 'website';
            $st_page_type  = 'WebSite';
         }

         /** サムネイル画像 **/
         if ($wp_query->is_singular && has_post_thumbnail()) {
            $ps_thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'full');
            $og_img   = $ps_thumb[0];
            $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($og_img),
            );
            $img_size = @getimagesize($og_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];
         }

         // 出力するOGPタグをまとめる
         $og_ins  = '<meta property="og:title" content="' . esc_attr($og_title) . '">';
         $og_ins .= '<meta property="og:description" content="' . esc_attr($og_descr) . '">';
         $og_ins .= '<meta property="og:type" content="' . $og_type . '">';
         $og_ins .= '<meta property="og:url" content="' . esc_url($og_url) . '">';
         $og_ins .= '<meta property="og:image" content="' . esc_url($og_img) . '">';
         $og_ins .= '<meta property="og:site_name" content="' . esc_attr($og_site_name) . '">';
         $og_ins .= '<meta name="twitter:card" content="summary_large_image">';
         $og_ins .= '<meta name="twitter:site" content="@Xのユーザー名">';
         $og_ins .= '<meta property="og:locale" content="ja_JP">';
         $og_ins .= '<meta property="fb:app_id" content="FacebookアプリID(app_id)">';

         echo $og_ins;


         /** 構造化データ **/
         $json_data = array(
            '@context'         => 'https://schema.org',
            '@type'            => $st_page_type,
            'mainEntityOfPage' => array(
               '@type' => 'WebPage',
               '@id'   => esc_url($og_url),
            ),
            'headline'         => $og_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', // Person または Organization
               'name'        => $og_site_name, // サイトのタイトル
               'url'         => esc_url($st_site_url), // サイトアドレス
               'description' => $st_site_descr, // キャッチフレーズ
               'logo'        => $st_logo, // @typeがOrganization時のみ使用可
            ),
            'description'      => $og_descr, // 抜粋
         );
      }

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

         /** カテゴリページ **/
         if ($wp_query->is_category) {
            $term      = get_queried_object(); // WP_Term
            $term_link = get_term_link($term->term_id);

            // 現在のカテゴリ
            $term_list[] = array('name' => $term->name, 'item' => $term_link);

            $term_id = $term->parent;
         }

         /** 記事ページ **/
         else {
            $term = get_the_terms($post->ID, 'category'); // WP_Term[]
            $term_id = ($term[0]->term_id) ?? 0;

            // 現在のページを含める
            // $term_list[] = array('name' => $og_title, 'item' => $og_url);
         }

         while ($term_id != 0) {
            $term        = get_term($term_id);
            $term_link   = get_term_link($term_id);
            $term_list[] = array('name' => $term->name, 'item' => $term_link);
            $term_id     = $term->parent;
         }

         // HOMEを含める
         // $term_list[] = array('name' => 'HOME', 'item' => $st_site_url);

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

         foreach ($term_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 ($wp_query->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 ($wp_query->is_singular) wp_reset_postdata();
   }
} // END add_og_and_struct

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

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

├ functions.php
└ fnc
   └ add_structured_article.php

functions.php に下記を追加記述

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

関連記事

OGP設定
構造化データ 

コメントを残す

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