WordPress 製のブログを OGP(Open Graph Protocol) に対応させてみた

OGP ってご存知でしょうか?Open Graph Protocol の略で、「このウェブページは、こんな内容です」ということをプログラムに対し正しく伝達するための仕様だそうです。どんな時に活用されるかというと、Facebook や Google+ 等で OGP が記述されたページがシェアされた際、この OGP の情報をもとにフィードに表示する画像やコンテンツの概要を載せてくれるようになります。

Web ページを OGP に対応させる方法

OGP に対応させる方法は簡単で、対象となる Web ページに対し

  • head タグに prefix 属性を記述する
  • head タグ内に meta タグを記述する

のみです。

head タグに prefix 属性を記述

以下のよう head タグに prefix 属性を記述します。

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">

head タグ内に meta タグを記述

同様に head タグ内に meta タグを記述します。

  1. <meta property="og:type" content="blog">
  2. <meta property="og:site_name" content="CYOKODOG">
  3. <meta property="og:title" content="大人だけど全力で「7人の悪魔超人編」の絵を描いてみた">
  4. <meta property="og:description" content="キン肉マンの「7人の悪魔超人編」の絵を全力で描いてみました!">
  5. <meta property="og:url" content="http://www.cyokodog.net/blog/sketch-akuma-cyoojin/">
  6. <meta property="og:image" content="http://lh4.googleusercontent.com/JXurra1m9PY/s400/IMG_1977.png">
  7. <meta property="og:locale" content="ja_JP">
  8. <meta property="fb:admins" content="100001731701653" />
  • og:type
    • ウェブページが何のページであるか(必須)
    • 例:blog,article,website
  • og:site_name
    • サイト名
  • og:title
    • ウェブページの名前(必須)
  • og:description
    • ウェブページの説明
  • og:url
    • ウェブページの URL(必須)
  • og:image
    • ウェブページのサムネイル(必須)
  • og:emailまたはog:phone_number
    • 連絡先
  • og:locality
    • 場所
  • og:latitude,og:longitude
    • 経度緯度での位置情報
    • 例:37.416343,-122.153013
  • og:country-name
    • 国名
  • og:locale
    • 翻訳言語
    • 日本語しかサポートしてない場合は ja_JP を指定
  • fb:admins
    • Facebook のユーザ ID

Facebook のユーザ ID の確認方法1

fb:admins 属性には Facebook のユーザ ID を指定します。 Facebook のユーザ IDは http://graph.facebook.com/<ユーザー名> にアクセスすると表示される JSON データの中身から確認することができます。 例えばユーザ名が cyokodog.net なら http://graph.facebook.com/cyokodog.net にアクセスし JSON データを表示させます。

  1. {
  2. "id": "100001731701653", Facebook ユーザ ID
  3. "first_name": "\u5927\u5178",
  4. "gender": "male",
  5. "last_name": "\u68ee",
  6. "link": "https://www.facebook.com/cyokodog.net",
  7. "locale": "ja_JP",
  8. "name": "\u68ee \u5927\u5178",
  9. "username": "cyokodog.net"
  10. }

データ内の ID の部分が Facebook ユーザ ID になります。

Facebook のユーザ ID の確認方法2

もう1つの方法として、Facebook のプロフィール写真をクリックし写真が拡大表示された時の URL から読み取る方法があります。 写真をクリックすると以下のような URL になります。

  1. https://www.facebook.com/photo.php?fbid=715746248493092&set=a.148489785218744.33077.100001731701653&type=1&theater

この URL のドット(.)で区切られた末尾の数字の連番が Facebook ユーザ ID にあたります。 上記例では 100001731701653 になります。

画像サイズの注意

og:image 属性に指定する画像サイズは 200 × 200 以上でないと OGP が正しく適用されませんので注意が必要です。 OGP が正しく適用されてるかどうかを確認するには以下 URL にアクセスします。

https://developers.facebook.com/tools/debug/

Debugger

調べたいページの URL を入力し DEBUG ボタンを押すと結果が表示されます。 例えば画像サイズが小さすぎる場合は以下のように表示されます。

result

キャッシュの注意

OGP のあるページを一旦シェアするとキャッシュが残ります。 そのため前述のように小さい画像を割り当ててしまい、後から修正してもキャッシュが適用されてしまい修正が反映されません。 キャッシュをクリアするには前述の確認ページに表示される「Fetch new scrape information」ボタンをクリックします。

clear cache

WordPress で OGP に対応する方法

WordPress で OGP を出力する場合は、表示してるページに応じ出力する meta データの内容を切り替えるようにします。 以下ソースを WpORG.php という名前でテーマフォルダに保存します。

  1. <?php
  2. class WpOGP {
  3.  
  4. private $defaults = array(
  5. 'fb:admins' => '',
  6. 'og:locale' => 'ja_JP',
  7. 'og:site_name' => '',
  8. 'og:image' => '',
  9. 'og:type' => 'blog',
  10. 'og:description' => '',
  11. 'og:title' => '',
  12. 'og:url' => '',
  13. 'defaultImage' => '',
  14. 'descriptionSize' => 100
  15. );
  16.  
  17. private $params;
  18.  
  19. function extend($a, $b) {
  20. $r = array();
  21. foreach($a as $k=>$v) {
  22. $r[$k] = $v;
  23. }
  24. foreach($b as $k=>$v) {
  25. $r[$k] = $v;
  26. }
  27. return $r;
  28. }
  29.  
  30. function __construct($args) {
  31. global $post;
  32. $args = $this->extend($this->defaults, $args);
  33. //サイト情報を設定
  34. $args['og:site_name'] = get_bloginfo('name');
  35. $args['og:description'] = get_bloginfo('description');
  36. $args['og:title'] = get_bloginfo('name');
  37. $args['og:url'] = get_bloginfo('url');
  38. //個別ページの場合、個別の記事情報を設定
  39. if (is_singular()){
  40. $args['og:description'] = mb_substr(
  41. strip_tags($post->post_excerpt ? $post->post_excerpt : $post->post_content),
  42. 0,
  43. $args['descriptionSize']
  44. );
  45. $args['og:title'] = $post->post_title;
  46. $args['og:url'] = get_permalink($post->ID);
  47. }
  48. //表示画像をカスタムフィールド、アイキャッチ、本文画像の優先順位で決定
  49. $args['og:image'] = $args['defaultImage'];
  50. if (is_singular()){
  51. $eyecatch = post_custom('eyecatch');
  52. if($eyecatch != ''){
  53. $args['og:image'] = $eyecatch;
  54. }
  55. else
  56. if (has_post_thumbnail()){
  57. $image = wp_get_attachment_image_src(
  58. get_post_thumbnail_id(),
  59. 'full'
  60. );
  61. $args['og:image'] = $image[0];
  62. }
  63. else
  64. if ( preg_match( '/<img.*?src=(["\'])(.+?)\1.*?>/i',
  65. $post->post_content, $matchText ) && !is_archive()) {
  66. $args['og:image'] = $matchText[2];
  67. }
  68. }
  69. //ピカサの画像の場合は画像サイズを800pxに設定
  70. if(preg_match( '/\.googleusercontent\./i', $args['og:image'])){
  71. $args['og:image'] = str_replace('/s144/', '/s800/', $args['og:image']);
  72. $args['og:image'] = str_replace('/s288/', '/s800/', $args['og:image']);
  73. }
  74. $this->params = $args;
  75. }
  76.  
  77. function getMeta($args=array()){
  78. global $post;
  79. $args = $this->extend($this->params, $args);
  80. $args['og:site_name'] = esc_attr($args['og:site_name']);
  81. $args['og:description'] = esc_attr($args['og:description']);
  82. $args['og:title'] = esc_attr($args['og:title']);
  83. $args['og:url'] = esc_url($args['og:url']);
  84. $args['og:image'] = esc_url($args['og:image']);
  85. //マークアップを返す
  86. ob_start();
  87. foreach($args as $key => $value){
  88. if(strpos($key, ':')){
  89. printf('<meta name="%1$s" content="%2$s" />'."\n", $key, $value);
  90. }
  91. }
  92. return ob_get_clean();
  93. }
  94. }
  95. ?>

og:image 属性の値については、カスタムフィールドに eyecatch という名前で画像 URL が指定されてた場合、そちらが優先されるようにしてます。 また、前述のとおり画像サイズが 200×200 以上必要ですので、ピカサや Google+ の画像リンクで小さい画像サイズを指定してる場合は、強制的に 800px サイズの画像 URL に置換されるようにしています。


functions.php に以下を記述し、OGP メタ情報を出力するようにします。

  1. function WpOGP_put_meta(){
  2. if (!is_admin()) {
  3. require_once('WpOGP.php');
  4. $ogp = new WpOGP(array(
  5. 'fb:admins' => '100001731701651',
  6. 'defaultImage' => 'http://lh4.googleusercontent.com/JXurra1m9PY/s400/IMG_1977.png'
  7. ));
  8. echo $ogp->getMeta();
  9. }
  10. }
  11. add_action('wp_head', 'WpOGP_put_meta');

この例では、Facebook ユーザ ID 、デフォルト画像 URL の値を固定にしてますが、テーマ設定用の管理画面を設け、管理画面から自由に変更できるようにすると便利かと思います。

本ブログのOGP 対応のビフォアー/アフター

jQuery プラグインの紹介ページ を Facebook にシェアした時、 OGP 対応前は以下のように関係ない画像が表示されてしまいました。

NONE OGP


OGP 対応後は、記事中で使用してるアイキャッチ画像が表示されるようになりました。

OGP

参考にしたサイト

以下のサイトを参考にさせていただきました。ありがとうございました。

追記:下記サイトおすすめです。この記事書く前に知りたかったー

ダウンロード

こちらからダウンロードできます。