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');
コメントを残す