WordPressの記事一覧で投稿毎にSNSのカウント数をAPIを利用して取得し表示する方法

WordPressの記事一覧で投稿毎にSNSのカウント数をAPIを利用して取得し表示する方法

WordPressを使っていると思われるサイトで、投稿記事が一覧表示されているページの投稿記事毎に様々なSNSサイトのカウントが表示されているのを以前から見かけていました。
自分もようやくSNSを始めたので、見た目も華やかだしやってみようと思い試みましたが、SNS用WEBフォントに続き思いっきり手こずりました。 まぁ、もともとSNS用WEBフォントはこのために始めた事ですが色々脱線してようやく妥協ラインまで完成したのでメモリます。

各SNSのカウント数の取得方法

Google+以外の主要なSNSサイトはAPIが用意されいるようで比較的簡単にカウント数の取得が出来ました。
それに、SharedCountという各SNSのカウント数をまとめて取得してくれる便利なサイトも見つけました。
各SNSのカウント数を取得するAPIのURLは以下の通りです。

Facebook
https://graph.facebook.com/調べたいURLをhttp://から入力
Twitter
http://urls.api.twitter.com/1/urls/count.json?url=調べたいURLをhttp://から入力
Google+
https://apis.google.com/_/+1/fastbutton?url=調べたいURLをhttp://から入力
はてなブックマーク
http://api.b.st-hatena.com/entry.count?url=調べたいURLをhttp://から入力
sharedcount
http://api.sharedcount.com/?url=調べたいURLをhttp://から入力
取得可能なSNS(2014年6月現在)
Facebook、Twitter、Google +1、Pinterest、LinkedIn、Delicious、StumbleUpon
※はてなブックマークは、ありませんでした…

取得したデータを処理

色々試し考えましたが、とりあえず以下の2パターンに絞りました。

全て各SNSの公式APIからデータを取得する方法

//全て各SNSの公式APIからデータを取得する方法
function sns_count(){		
	
	//Facebook
	$cnt["fb"] = json_cnt("https://graph.facebook.com/", "shares");
	//Twitter
	$cnt["tw"] = json_cnt("http://urls.api.twitter.com/1/urls/count.json?url=", "count");
	//Google+
	$cnt["gp"] = google_cnt(get_the_permalink());
	//hatena
	$cnt["hb"] = hatena_cnt(get_the_permalink());
	//返り値
	return $cnt;

}

//json
function json_cnt($api_url, $subs){

	$url = $api_url.get_the_permalink();
	$json = file_get_contents($url);
	if($json){

		$obj = json_decode($json);
		$cnt = $obj->{$subs} ? $obj->{$subs} : 0;

	}
	return $cnt;
	
}

//Google+
function google_cnt(){

	$url = "https://apis.google.com/_/+1/fastbutton?url=".get_the_permalink();
	$url = file_get_contents($url);
	preg_match('/\[2,([0-9.]+),\[/', $url, $cnt);
	return $cnt[1];

}

//Hatena
function hatena_cnt(){

	$url = 'http://api.b.st-hatena.com/entry.count?url='.get_the_permalink();
	$cnt= file_get_contents($url) ? file_get_contents($url) : 0;
	return $cnt;
	
}

SharedCountを利用して取得する方法

//SharedCountを利用して取得する方法
function shared_count(){		
	
	//sharedcount
	$json = file_get_contents('http://api.sharedcount.com/?url='.get_the_permalink());
	$counts = json_decode($json, true);
	$cnt = array(
		"tw" => $counts["Twitter"],
		"fb" => $counts["Facebook"]["total_count"],
		"gp" => $counts["GooglePlusOne"]
	);		
	//Hatena
	$hb_url = 'http://api.b.st-hatena.com/entry.count?url='.get_the_permalink();
	$cnt["hb"] = file_get_contents($hb_url) ? file_get_contents($hb_url) : 0;
	//返り値
	return $cnt;

}

出力する場合

//投稿のループ処理中
$cnt = sns_count();	//又は shared_count
echo 'Facebook:'$cnt["fb"].'<br />';
echo 'Twitter:'$cnt["tw"].'<br />';
echo 'Google+:'$cnt["gp"].'<br />';
echo 'Hatena:'$cnt["hb"];

実際にカウント数を取得してみると…

実際に上記で作成したプログラムを試してみるとハッキリ言って重いです。
自分の場合、投稿一覧には10件表示しているからだと思いますが、表示されるまでにやはり時間が掛かります。
2つのパターンの表示速度を数回試したのですが、微妙にSharedCountを利用した方が早い気がしました。
※表示速度の計測は、体感です…

表示速度の対策について考える…

ページを表示する度に毎回、APIからデータを取得し表示するには限界を感じました。
表示するサーバーやAPIのサーバーなどのレスポンスが少しでも悪いと更に遅くなり、訪問者の離脱率にも大きく影響を及ぼす可能性が極めて高いと考えます。
しかし、折角ここまで時間を費やしたので引くに引けません!
なので、何らかの形でAPIから受け取ったデータを保存する対策を考えていこうと思います。
調べてみたらWordPressには、「Transients API」という有効期限を設定して、データベース内に保存する方法があるようなので、次回は「Transients API」を使って各SNSのカウント数取得に再チャレンジしようと思います。

2015年1月1日からsharedcountのAPIの仕様が変更された様子

サーバートラブルの修正直後、今度はsharedcountの仕様が変更された様子で以前の方法で取得が出来ないようです。 どうやら有料サービスなどが始まった模様…英語なので全ては理解できませんでしたが、無料でも使えそうですが制限が限りられていそうですね。 これを機に新しく作りなそうと思います。

【更新履歴】

  • 2015年01月21日 2015年1月1日からsharedcountのAPIの仕様が変更された様子を追加

【参考Webサイト】

コメント(0件)

WordPressの記事一覧で投稿毎にSNSのカウント数をAPIを利用して取得し表示する方法に対するご意見、ご感想、情報提供など皆様からのコメントをお待ちしております。 お気軽にコメントしてください。

コメントフォーム

【ソーシャルボタン】


TOP