FacebookでOGPの修正がウォールに反映されない時の対処方法

Facebookでいいねボタンをクリックしてもらったときにウォールに流れる情報を最適化できるOGP(Open Graph Protocol)タグで、metaの内容を修正したにも関わらずウォール反映されない場合は、FacebookのDebugger(旧URLリンター)を使用することでFacebook側のキャッシュを強制的にクリアすることができます。

基本的にOGPがきちんと適応できているか確認したりmetaタグ内容のチェックなどで使われているツールですが、キャッシュクリアまでできるんですね。メモ。

Facebookページでファンゲートを実装

iframeを使用したFacebookページで「いいね」をクリックしていない人とクリックした人で見せるコンテンツを変える方法です。

まずユーザーが「いいね」を押しているかどうかを判別する以下のコードをparse_signed_request.phpとして外部サーバー(コンテンツページを置くサーバー)にアップします。

<?php
function parse_signed_request($signed_request, $secret) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);
  if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
    error_log('Unknown algorithm. Expected HMAC-SHA256');
    return null;
  }
  // check sig
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }
  return $data;
}
function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
  }
?>

ウェルカムページ等のxxxx.phpなどではbody直下に以下のような条件分岐を記述して、ファンならばaaa.htmlを表示、そうでないならbbbb.htmlを表示。

<?php
include 'parse_signed_request.php';
if (isset($_POST['signed_request'])) {
    $data = parse_signed_request($_POST['signed_request'], 'xxxxxxxxxxxxx');
}
if($data['page']['liked'] == '1'){
include 'aaa.html';
} else {
include 'bbb.html';
}
?>

※ xxxxxxxxxxxxx はFacebook開発ページでアプリを作成した際に表示される「アプリの秘訣」キーを入力。

ウェルカムページも下のコンテンツが透けて見えたり、思わせぶりなコピーがあったりと、いろんな見せ方でファンゲートを実装していて発想の参考になります。

FacebookのカスタムタブでSSLサポートされていないページを見る設定

Facebookの外部サーバーを利用したiframeベースのカスタムタブはSSLサポートが必須条件になっています。

これは今年の10/1からの仕様みたいで、いろんな企業のFacebookページで以下のようなメッセージが表示されるようになりました。

これはユーザーがSSL接続した状態で、なおかつiframe内のコンテンツがSSLサポートされていないサーバーにある時に出ます。

わりと大手企業でも表示されるので今後順次対応されていくと思いますが、取り急ぎサポートされていないページを閲覧したい場合は、以下の手順で設定を変更。

Facebookの右上の

「アカウント設定」→「ホーム」→「セキュリティ」→「セキュアな接続」

で「セキュアな接続(https)を利用する(可能な場合)」のチェックを外して設定を保存。

自分で設定を変更した記憶がないのですが、もしかしたら忘れてるだけかも。。なのでメモとして。

WordPressでindex.phpからindex.html等にリダイレクトさせない方法

WordPress使用中になんらかの理由で、メンテナンスモード以外に一時的にルートディレクトリのindex.htmlを生かしたままindex.phpの編集を行ないたい場合があります。

そういった場合でもWordPress2.7以降はindex.phpにアクセスするとindex.htmlに自動的にリダイレクトされてしまうので、その回避方法。

wp-includes/canonical.php の286行目付近、

$redirect['path'] = preg_replace('|/index.php/*?$|', '/', $redirect['path']);

の記述を

$redirect['path'] = preg_replace('|/index.php/$|', '/', $redirect['path']);

に変更(「*?」を削除)するとリダイレクトされずにhtmlファイルを別に表示させておくことができます。

WordPressのCommented entry listプラグイン不具合の対処方法

先日某サイトのサーバー移転をした際にWordPressのコメントリストを表示する”Commented entry list“プラグインが正常に機能せず、「No Response」と出てしまったのでその対処法。

原因としては、$tablecommentsと$tablepostsにテーブル名が入っていないので、プラグイン自体を修正して正しい値が入るようにすればOK。

commented-entry-list.php内の

function get_recently_commented($limit = 10) {
global $wpdb, $tablecomments, $tableposts;

function get_recently_commented($limit = 10) {
	global $wpdb;
	$tablecomments = $wpdb->comments;
	$tableposts = $wpdb->posts;

に変更、続いて

function get_recently_trackbacked($limit = 10) {
global $wpdb, $tablecomments, $tableposts;

function get_recently_trackbacked($limit = 10) {
	global $wpdb;
	$tablecomments = $wpdb->comments;
	$tableposts = $wpdb->posts;

に変更すると無事機能しました。