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の時のものです。
©Uemachi Web Factory