facebookのogpキャッシュをクリアするボタンを作ってみよう

2017年12月5日現在、Facebookの仕様変更によりOAuth認証が必要となったため、この記事のプログラムは動作しません。
代替案としてこちらのページにリンクするためのボタンなどを設置して遷移先で手動でキャッシュをクリアするようにしてください。https://developers.facebook.com/tools/debug/
記事を更新した時、facebookのOGP画像が以前の画像のままで困った事はないでしょうか? ここでは、facebook側でキャッシュを行っている為、キャッシュを削除してあげる必要があります。
方法の一つとして、Facebook Batch Invalidator にアクセスして削除したいURLを入力して、Debugボタンを押せばキャッシュを削除する事ができます。
ただキャッシュを削除したい場合に毎回このサイトにアクセスするのは手間がかかります。そこで今回は、a-blog cmsのサイトから記事を更新したらすぐキャッシュをクリアできるようにしたいと思います。
対応方針
今回は、a-blog cmsの独自POSTモジュールを1つ作る事で対応したいと思います。ログインした時の、記事作成ボタンや管理ページに移動するボタンと同じ場所に、FBのキャッシュをクリアするボタンを設置します。
POSTモジュール
/php/ACMS/User/POST/FBDebugger.php というファイルを作成してください。中は以下のコードを貼り付けてください。
<?php
/**
* php/ACMS/User/POST/FBDebugger.php
*
* テンプレート上では、標準のPOSTモジュールと同様に、
* <input type="submit" name="ACMS_POST_FBDebugger" value="Clear FB Cache"> で呼び出されます。
*/
class ACMS_User_POST_FBDebugger extends ACMS_POST
{
protected $endpoint = "https://graph.facebook.com/?scrape=true&id=%s";
/**
* run
*
* @return ACMS_POST
*/
public function post()
{
if ( !sessionWithAdministration() ) return false;
$url = sprintf($this->endpoint, rawurlencode(HTTP_REQUEST_URL));
$this->request($url);
return $this->Post;
}
/**
* post request
*
* @param string $url
* @return void
*/
protected function request($url)
{
include_once 'HTTP/Request.php';
$req = new HTTP_Request($url);
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addHeader('Content-Type', 'application/x-www-form-urlencoded');
if ( $req->sendRequest() ) {
$body = $req->getResponseBody();
} else {
userErrorLog('ACMS Warning: Failed to clear fb cache.');
die503('Failed to clear fb cache.');
}
}
}
ボタンの設置
このPOSTモジュールを呼び出すボタンを設置します。/themes/system/admin/action.html を 自分のテーマに持ってきて、以下のコードを追記してください。
<form action="" method="post" class="acms-admin-inline-btn">
<input type="submit" name="ACMS_POST_FBDebugger" value="Clear FB Cache" class="acms-admin-btn-admin">
</form>
これでボタンを押す事により、そのページのOGPキャッシュを削除できるようになりました。今回はFormのボタンで実装しましたが、フックを使って自動的にキャッシュを削除する事もできると思います。興味のある方はお試しください。