WordPressのプラグインの中でも結構な割合でお世話になっている「SNS Count Cache」。
感謝しきりのこのプラグインですが、長い間気になっていることがひとつ。それは、Facebookでのいいね!やシャア数のカウントができなくなっていること。
Google+が仕様上カウントできなくなったことは僕にとってそう大きなことではなかったのですが、Facebookとなるとできればカウントしたいところ。
自分で直接取得しようか考えたのですが、SNS Count Cacheの良い点「http・httpsの両方のカウント合算」や「キャッシュ」を考えるとSNS Count Cacheでできれば完結したい気持ちがあり、プラグインの更新を待つことにしてここまで放置してきました。
しかし、SNS Count Cacheはもう8ヶ月ほど更新がない状態。
そろそろ何か対処しなくてはと思い、プラグイン自体を修正することにしました。
取得できなくなっていた原因はFacebookのいいね!・シェア数を取得するためのAPI、Graph APIの仕様変更。
結果シェア数をカウントできるようになったわけですが、プラグインファイルのコードに手を入れることになるので、暫定または最終手段といったところです。
修正手順を書いていきますが、バックアップをとっておこなうようにしてください。またAPIの仕様が変わるかもしれませんしね。
APIバージョンがv2.9の場合はSNS Count Cacheのコードに修正が必要
SNS Count CacheでFacebookのカウントを利用する際、facebook for developersよりアプリを登録し、SNS Count Cacheの管理画面より”APP ID”や”APP Secret”を登録するはずです。
このfacebookのアプリで利用しているAPIのバージョンが今回のポイントとなってきます。
まず、APIのバージョンがv2.8以下であれば、おそらくSNS Count Cache 0.11.1のコードでカウント数が取得できると思います。
しかし、v2.9になるとそれができない。仕様が変わったことで、SNS Count Cache 0.11.1のコードでは対応できないのです。
しかもここで頭を悩ませられるのが、Facebookアプリで使用するAPIのバージョンは、前のバージョンを選択できないこと。
v2.9以前のバージョンでアプリを作っていれば古いバージョンを選べるようですが、v2.9でアプリを作ったらv2.9以上しか選択できないようです。僕がそうでした。
前のバージョンを選べないのであればコード側を直すしかない、というのが今回至った結論です。
Facebook Graph API v2.9でいいね!・シェア数を取得する
まずやるべきことは、Graph API v2.9でいいね!・シェア数を取得してみること。
カウント数の取得方法の前のバージョンとの違いを知らないことには、SNS Count Cacheのコードを見てもよくわからないですからね。
まず、APIを使ってシェア数をカウントする従来の方法は下記のようなURLでアクセスすれば取得可能でした。
https://graph.facebook.com/?id=[URL]&access_token=[ACCESS TOKEN]
※URLはエンコードする必要があります(e.g. “https://www.islog.jp/” → “https%3A%2F%2Fwww.islog.jp%2″)
アクセストークンがわからない場合は下記にアクセスするとわかりますよ。
※Facebookアプリより”APP ID”と”APP Secret”が必要です。
https://graph.facebook.com/oauth/access_token?client_id=【APP ID】&client_secret=【APP SECRET】&grant_type=client_credentials
実際、SNS Count Cacheのコードも上記のようになっていたのですが、試しに上記URLにアクセスするとわかりますが、以前はカウント数が入っていた”share”の項目も無くなっています。
share項目はv2.9以上では非推奨となったようです。
v2.9では、下記のようにする必要があります。
https://graph.facebook.com/?id=[URL]&fields=og_object{engagement},engagement&access_token=[ACCESS TOKEN]
このURLにアクセスして、実際にシェア数がカウントできるかを見ておくと安心です。
{ "og_object": { "engagement": { "count": 161, "social_sentence": "161 people like this." }, "id": "11111111111111" }, "engagement": { "reaction_count": 78, "comment_count": 46, "share_count": 37, "comment_plugin_count": 0 }, "id": "http://www.islog.jp/entry/◯◯◯/" }
og_object内にあるengagement内のcountがシェア数(いいね!とシェアの合算)となります。
ここまできたら、実際にSNS Count Cacheのコードを修正していきます。
SNS Count Cacheのコードを修正してFacebookのシェア数を取得する
まず、SNS Count Cacheの管理画面よりキャッシュ状況を確認してみます。
Facebookの部分が「N/A」になっていて、やはり取得できていないですね。
ではSNS Count Cacheのコードを修正します。
手を入れるのは、”/wp-content/plugins/sns-count-cache/includes/class-scc-share-facebook-strategy.php”です。
まずbuild_query_urlファンクション内に手を入れます。
$url = self::DEF_BASE_URL . '?' . http_build_query( $this->query_parameters , '' , '&' );
79行目辺りの変数$urlに前述の通り、「https://graph.facebook.com/?id=[URL]&access_token=[ACCESS TOKEN]」のURLが入っています。
これを「https://graph.facebook.com/?id=[URL]&fields=og_object{engagement},engagement&access_token=[ACCESS TOKEN]」の形にしなくてはいけません。
$url = self::DEF_BASE_URL . '?id='. rawurlencode($this->query_parameters['id']) . '&fields=og_object{engagement},engagement&access_token=' . $this->query_parameters['access_token'];
上記のようにします。
「$this->query_parameters[‘access_token’]」の部分はSNS Count Cacheの管理画面より設定されたaccess tokenが入っています。僕はそのトークンが間違っていたので直接記述しました。
$url = self::DEF_BASE_URL . '?id='. rawurlencode($this->query_parameters['id']) . '&fields=og_object{engagement},engagement&access_token=' . 'ここにトークン記述';
これでURL部分の修正は完了ですが、share項目が無くなったことで、このままではシェア数を取得することはできません。
さらに、97行目付近のextract_countファンクション内も修正する必要があります。
if ( isset( $content['data'] ) && empty( $content['error'] ) ) { $json = json_decode( $content['data'], true ); if ( isset( $json['share']['share_count'] ) && is_numeric( $json['share']['share_count'] ) ) { $count = (int) $json['share']['share_count']; } elseif ( isset( $json['id'] ) && ! isset( $json['share']['share_count'] ) ) { $count = (int) 0; } else { $count = (int) -1; } } else { $count = (int) -1; }
これが元のコードですが、下記のように変更します。
if ( isset( $content['data'] ) && empty( $content['error'] ) ) { $json = json_decode( $content['data'], true ); if ( isset( $json['og_object']['engagement']['count'] ) && is_numeric( $json['og_object']['engagement']['count'] ) ) { $count = (int) $json['og_object']['engagement']['count']; } elseif ( isset( $json['id'] ) && ! isset( $json['og_object']['engagement']['count'] ) ) { $count = (int) 0; } else { $count = (int) -1; } } else { $count = (int) -1; }
具体的には、「$json[‘share’][‘share_count’]」を「$json[‘og_object’][‘engagement’][‘count’]」にしています。
これで修正は完了。
【追記(2017/10/20)】
当初は上記の[‘og_object’][‘engagement’][‘count’]を取得していましたが、新規で投稿した記事では[‘og_object’]自体が取得データの中に無くカウント数が取れていませんでした。
その問題は取得部分のコードを変更することで対応可能です。
if ( isset( $content['data'] ) && empty( $content['error'] ) ) { $json = json_decode( $content['data'], true ); $reaction = (int) $json[‘engagement’][‘reaction_count’]; $comment_count = (int) $json[‘engagement’][‘comment_count’]; $share_count = (int) $json[‘engagement’][‘share_count’]; $count = $reaction + $comment_count + $share_count; } else { $count = (int) -1; }
※PHPのバージョンが5.5以下の場合に記述エラーが発生しているとのご指摘があり、2017/11/27にコードを修正しました
$json[‘og_object’]内のデータを取得するのではなく、$json[‘engagement’]内のデータを取得しています。
- reaction_count … いいね!の数
- comment_count … コメントの数
- share_count … シェアされた数
をPHP上で合算している形です。
SNS Count Cacheの管理画面より手動でキャッシュをして確認してみると、Facebookのいいね!・シェア数がhttp・https合算で取得できました。
ちなみに、管理画面より手動でキャッシュする際に、httpsのほうのシェア数が取れない場合は、sns-count-cache.php内の1155行目あたりを修正します。
$this->scheme_migration_exclude_keys = array( //self::REF_SHARE_POCKET, //self::REF_SHARE_GPLUS, //self::REF_SHARE_LINKEDIN, //self::REF_FOLLOW_TWITTER, //self::REF_FOLLOW_FACEBOOK, //self::REF_FOLLOW_PUSH7, //self::REF_FOLLOW_INSTAGRAM );
元はコメントアウトされていないわけですが、上記のようにコメントアウトすることで、手動のキャッシュでhttps側のシェア数も取得できるようになります。
まとめ
日頃お世話になっている「SNS Count Cache」。
Facebookでのシェア数のカウントができなかったのが気になっていたのですが、今回の修正でしばらくはこのまま使えそうです。
本当はプラグイン自体の更新があると安心なのですが、SNSのシェア数カウント用のAPIは仕様変更も多いのでメンテナンスが大変なのでしょうね。
プラグイン自体は文句なく優秀なものなので、自分で出来る範囲は誤魔化しながら利用できればと考えています。
Google+のほうもAPIが動くようになったらやってみようかと。
コメント
ishikawaさん
この記事のお陰でFBシェアボタン復活しました!!!
ありがとうございました!!!!(^^)!
ありがとうございます!!
とても参考になったのですが、
【追記(2017/10/20)】の部分を打ち込むと、どうしても
Parse error: syntax error, unexpected T_INT_CAST in /home/users/2/[ここはURLが表示されています]web/blog/wp-content/plugins/sns-count-cache/includes/class-scc-share-facebook-strategy.php on line 97
が返されてしまいます。対処方法などありますでしょうか…。
you-kiさん
PHPのバージョン違いのエラーが考えられます。
$count = (int) $json[‘engagement’][‘reaction_count’] + (int) $json[‘engagement’][‘comment_count’] + (int) $json[‘engagement’][‘share_count’];
の部分を、
$reaction = (int) $json[‘engagement’][‘reaction_count’];
$comment_count = (int) $json[‘engagement’][‘comment_count’];
$share_count = (int) $json[‘engagement’][‘share_count’];
$count = $reaction + $comment_count + $share_count;
としてみるといかがでしょうか?
ありがとうございます!!!
エラーは返されなくなりました!
ところが、facebookのシェア数は全て0になっており、数値を取得できておりません。
https://graph.facebook.com/?id=%5BURL%5D&fields=og_object{engagement},engagement&access_token=[ACCESS TOKEN]
こちらから見ると一応シェアは0ではありません。
これもPHPのバージョンで何か別の場所も記述を変えないといけないのでしょうか。
無知でお恥ずかしいのですが、お教えいただけますと幸いです。
> こちらから見ると一応シェアは0ではありません。
おそらく下記のようになっているかと思います。
{
“og_object”: {
“engagement”: {
“count”: 161,
“social_sentence”: “161 people like this.”
},
“id”: “idが入ります”
},
“engagement”: {
“reaction_count”: 78,
“comment_count”: 46,
“share_count”: 37,
“comment_plugin_count”: 0
},
“id”: “URLが入ります”
}
上記のような形でしょうか?
追記した部分では、下記のreaction_count・comment_count・share_countを合算してカウントしています。
下記の$countにカウント数が代入されています。
$count = $reaction + $comment_count + $share_count;
print_r($count);
print(‘
‘);
試しにコードでカウント数を出力(print)できるようにして、WP管理画面にログインしてSNS Count Cacheの管理画面から、シェアがある記事のキャッシュを押してみてください。
ページ上部にカウント数が出力されるかと思います。
上記のうえで、
・URLからアクセスしてシェアがあるようなのにカウント数が0の場合 → カウント数の取得に失敗している(当記事でのコードで取得できていない)
・上記段階でカウント数は取れているのに、SNS Count Cacheでカウントができない → 環境(他プラグインとの干渉、WPやSNS Count Cacheなどのバージョンやサーバ環境)によるもの
のどちらかとなるかと思います。
前者であればまだこちらでも考えられることがありますが、後者の場合は残念ですが環境諸々お聞きして実際のコードを見ないとわからないです。
ishikawaさん、ありがとうございます!
そして、再度最初からやりなおしてみた結果、
(PHPのバージョン違いのコードも入れ直し)
ちゃんとシェア数を取得することができました!
どうやら、どこかで記述ミスがあったのかもしれません…。
お手数をおかけしてしまい、申し訳ございませんでした。
本当にありがとうございます。
とても分かりやすい記事をありがとうございました。
こちらを参考に作業をしたところ、SNS Count Cacheのほうで「N/A」と表示されていたものが「0」に変わりました。
しかし、上記のURLでシェア数などを調べてみるとシェアされていて数字がちゃんと表示されます。
なにか原因になりそうなところがありましたら、教えていただけると助かります。
マツザキさん
> しかし、上記のURLでシェア数などを調べてみるとシェアされていて数字がちゃんと表示されます。
APIを直接叩くとシェア数が0ではないということでしょうか?
これまでのコメント欄でのやりとりにも同様の現象がありましたので、参考にしていただければと思います。
こちらを参考にコードを修正したところ、カウント数が無事表示されたのですが、「HTTPからHTTPSへのスキーム移行モード」を有効にしても、httpsのカウント数のみ表示され、httpのカウント数との合算になりません。
APIでhttpsとhttpそれぞれのカウントを見てみると、httpsで1件とhttpで2件あるため、3と表示されるはずなのですが、どのあたりを調べてみるといいでしょうか?もしよければアドバイスをいただけると助かります。
先程httpとhttpsの合算にならないとご相談させていただきましたが、sns-count-cache.php内の1155行目付近のコメントアウトをしたところ合算数が表示されました。
お騒がせしました。