SUMIT.JP

IT Outsourcing Company

インデックスページのFacebookのアイコン横の”数値”を考える 〜 FQLによるカウント数の取得とwp_remote_getとキャッシュ〜

      2014/07/30

WordPress

はじめに

 

WordPressのインデックスページをどのように構成したらよいのかいつも悩んでいます、一つの提案として”株式会社LIG”さんで使われているような「タイトルとイメージ画像」というシンプルな構成が考えられます。

インデックスページには固定フォーマットで列挙した方が効率はいいのではと思います。 そこで、モノマネですが自分のサイトのインデックスページも「タイトル+イメージ画像」構成に変更してみました。

ここで一つの疑問、Facebook・Twitter・はてなブックマークのアイコン+数で興味度の尺度としていると思います。 表示数はおそらく、ツイッターはtweet/Retweet数を表示、はてなブックマークはブックマーク数と容易に推測できるのですがFacebookの数は何でしょう?

 

Facebookの「いいね」と「シェア」

まずは、インデックスページの記事ボックス内のFacebookアイコンの場所に表示する数値を何にするかということを考えてみます。

Facebookの「いいね」「コメント」「シェア」の違いに関しては熊坂仁美氏にとてもわかりやすい解説記事があります。 この記事によりますと、「いいね」と「コメント」は直接対話、「シェア」は口コミのような図式ととらえる事ができそうです。

 

案外知られていないFacebook「いいね!」「コメント」「シェア」の違いを解説

案外知られていないFacebook「いいね!」「コメント」「シェア」の違いを解説 (引用元へリンクしています)

ということは、Facebookアイコン横の数値は「いいね」+「シェア」+「コメント」が良いと思われます。

ところで、これらの数値をPHPで得る事は可能でしょうか。

 

「いいね」数の取得

WordPressにFacebookの「いいね」数を表示する場合、プラグインを用いて個々の記事に表示することが一番簡単な方法です。 インデックスページ用に手頃なプラグインがあれば良いのでしょうが容易には見つけ出せません。

シンプルなPHPコードで実現できれば良いので方法を探ってみますと、Facebookの「いいね」数を得るには複数の方法があるようです。

1)graphを使う方法

バニラデザインノートさん(2011年記事)で紹介されている方法として、graph.facebook.comを使っています。

バニデザノート

バニデザノート/2011年記事より(参照元記事にリンクしています)

そこで、graph.facebook.comを使った際の戻り値をブラウザで確認をしてみました。

http://graph.facebook.com/http://sumit.jp/cloud/azure/270/
戻り値:
{
   "id": "http://sumit.jp/cloud/azure/270/",
   "shares": 1
}

当方の記事の1つに「いいね」を行い、当該記事のURL(パーマリンク)で問い合わせを行うと、sharesという項目名で1が戻ってきます。 ”shares”が「いいね」を示しているように見えます。

しかし、項目名は『なぜlikeではなくてsharesなんだろう』という疑問は残ります。

 

2)FQLを使う方法

Facebookの「いいね」を取り出す別の方法に、FQLという方法があります。 「今村だけがよくわかるブログ」さんの記事にその方法を見る事ができます。 こちらでは、Graph APIで数値が得られないケースがあるとの事でFQLでの実装方法を解説しています。

今村だけがよくわかるブログ 〜2013/01/07記事 (参照元へリンクしています)

今村だけがよくわかるブログ 〜2013/01/07記事 (参照元へリンクしています)

 

FQL用いた場合にどのような戻り値となるかを確認してみました。

http://api.facebook.com/method/fql.query?format=json&query=select%20total_count,like_count,share_count,comment_count%20from%20link_stat%20where%20url=%22http://sumit.jp/cloud/azure/270/%22
戻り値

記事を「いいね」後
[{"total_count":1,"like_count":1,"share_count":0,"comment_count":0}]

記事を「シェア」後:
[{"total_count":2,"like_count":1,"share_count":1,"comment_count":0}]

この結果から、FQLを使うと「いいね」と「シェア」を区別して値を取り出す事ができそうです。

 

WordPressへの実装

PHPコードでのテスト

WordPressで実験をしてみます:

$url = "http://sumit.jp/cloud/azure/270/";
$fqlquery = 'select like_count from link_stat where url="'. encode_url($url).'"';
$fqlurl = "http://api.facebook.com/metho/fql.query?format=json&query=".$fqlquey;
$response = file_get_contents($fqlurl, true);
$decode  = json_decode($response, true);
$fblike = $decode['0']['like_count'];

このようなテストコードで確認すると「いいね」数を得る事が出来ます。

ところが、インデックスページへ適用すると表示が非常に遅くなります。

 

file_get_contentとwp_remote_get

Stackexchangeにて、取得時のエラー処理等を踏まえPHPコードをどうするか探してみると、wp_remote_getを使う方法の提案が見つかります。

 

wp_remote_getを使う例@StackExchange(参照元記事へリンクしています)

wp_remote_getを使う例@StackExchange(参照元記事へリンクしています)

 

オリジナルの記事では、graph APIを使っていますがwp_remote_getを使った際のエラー処理は同様に使えますので先のコードをwp_remote_getを使う様に書き替え・エラー処理追加を行います。

 

キャッシュを使う

 

外部APIを用いますので、速度が遅くなるとは思いましたがインデックスに20記事程度でもかなり表示に時間がかかります。

この表示速度問題を解決する方法として、値をキャッシュ(一時保存)して使う方法を考えます、「今村だけがよくわかるブログ」さんの記事に、Transientを使ったキャッシュを利用方法の提案があります。

今村だけがよくわからブログ 〜Transientを使う方法

今村だけがよくわからブログ 〜 Transientを使う 2012/04/22(参照元記事へリンクしています)

 

このTransientを用いたキャッシュのコードを追加します:

// キャッシュキー生成
$transient_key = md5('get_social_counts_facebook-' . $encode_url);
// キャッシュからの取り出し
if ( false === ($counts['facebook'] = get_transient($transient_key)) ) {

    // FQL API
    $fqlurl = "http://api.facebook.com/method/fql.query?format=json&query=";
    $query= 'SELECT like_count, total_count FROM link_stat WHERE url="'.$url.'"';
    $fqarg = $fqlurl . urlencode($query);
    $response_fb = wp_remote_get($fqarg);

    // アクセス・エラー処理
    if ( !is_wp_error( $response_fb ) && $response_fb['response']['code'] === 200 ) {
      $decode_likecount = json_decode( $response_fb['body'], true);
      $facebook_likecount = (isset($decode_likecount['0']['like_count']))? $decode_likecount['0']['like_count'] : 0;
    } else {
      $facebook_likecount = 0;
    }
  counts['facebook'] = $facebook_likecount;
   // キャッシュ有効期間
   set_transient($transient_key, $counts['facebook'], 60*60*6);  // expires 8H
}

キャッシュ期間は6時間として、1日4回更新することにしました。 
 アクセス数が多い記事でも朝、昼、夕、夜で更新するタイミングになると思われますので期間は手頃ではないでしょうか。

完全とは言えませんが、インデックスページにカウント値を表示することができるようになります。

まとめ

 Facebookの「いいね」の回数を表示する場合、FQLを用いた問い合わせとTransientキャッシュを組み合わせる事で表示速度の大幅な遅延を押さえる事は可能です。

 今回は「いいね」を表示することに限定しましたが、記事ランキングを行う場合には「いいね」、「シェア」、「コメント」で貢献度が違うと考えるとファクタリングして記事のランキングのファクターの一つとすることも面白いかもしれません。

 

 - WordPress