DrupalのOpen Graphメタタグ

ウェブサイトのタイトルや要約、画像、URLなどの情報を正確にFacebookにフィードするためのOpen Graphメタタグ(OGP)、Facebook疲れ、といった言葉もチラホラ聞こえる一方、TwitterでもOGPが使われるようになって、OGP自体の重要度は下がっていないと思います。

DrupalではOpen Graph meta tagsというOGPの設定に特化したモジュールがずいぶん前から配布されていて、自分も以前はこれを使わせてもらっていたのですが、何かと使い勝手がよくなくて(スミマセンだいぶ前なので詳しくは覚えていません)、Metatag moduleに乗り換えました。OGPはメタタグ全般の設定のごく一部ですが、node毎にFieldとして組み込まれた画像から、og:imageに設定する画像を自由に選択することもできます。たとえば自分のブログでは今もこの方法で、ブログの設定とは異なる画像Facebookの友人たちに向けてog:imageを設定したりしています。

ただMetatagモジュールは設定項目が多すぎて、お手伝いしているサイトでユーザーさんに自分のブログと同じような設定をしてもらうのは、かなり面倒です。色々やってみた結果、template.phpにOGPの設定を追加する方法に行きつきました。参考サイト

<?php
// 以下my_theme_nameの部分はそれぞれのテーマ名に置き換えてください。
function my_theme_name_preprocess_html ( &$variables ) {  
  global $user;  
  foreach ( $user->roles as $role_id => $role ) {  
    $variables['classes_array'][] = "role-id-".$role_id;  
    $variables['classes_array'][] = "role-".strtolower(drupal_clean_css_identifier($role));  
  }  
  $variables['classes_array'][] = "user-uid-".$user->uid;  
}
function my_theme_name_preprocess_node(&$vars) {

// 以下 node type 毎に設定
if ($vars['type'] == 'story') {
$og_title = array(
  '#tag' => 'meta',
  '#attributes' => array(
    'property' => 'og:title',
    'content' => $vars['title'],
  ),
);
 
drupal_add_html_head($og_title, 'og_title');

$img = field_get_items('node', $vars['node'], 'field_images');
$img_url = file_create_url($img[0]['uri']);
$og_image = array(
  '#tag' => 'meta',
  '#attributes' => array(
  'property' => 'og:image',
  'content' => $img_url,
  ),
);
drupal_add_html_head($og_image, 'og_image');

$body_field  = field_view_field('node', $vars['node'], 'body', array('type' => 'text_plain'));
 
$og_description = array(
 '#tag' => 'meta',
 '#attributes' => array(
   'property' => 'og:description',
   'content' => text_summary($body_field[0]['#markup'], NULL, 150),
 ),
);
 
drupal_add_html_head($og_description, 'og_description'); 
}

og:imageはimagesというフィールドの0番目、つまり最初の1枚に固定しているので、ユーザーがフィードする画像を変更したければ、ノードの編集画面でimagesフィールドの順番をドラッグして変えるだけです。og:descriptionは本文の150文字にトリムしています。

template.phpは構文エラーとかがあると、WSOD(white screen of death)、つまり画面が真っ白けになったりしますが、慌てずにソースを見直してください。あとはFacebookのデバッガーで出力しておけば、Facebook側のキャッシュができるはずです。

4年前に自分で似たようなことを書いているのに気づきました。pageテンプレートにOGPメタタグを書くことを説明していますが、Drupal7ではメタタグはhtmlテンプレートなので、Drupal6の時のものです。