SNS Count Cacheプラグインでhttps化対策

# SNS Count Cacheプラグインについて

SNS Count Cacheプラグインは、SNS系ボタンを高速に表示させるためのプラグインです。

https://ja.wordpress.org/plugins/sns-count-cache/

SNS Count Cacheプラグインをインストールすると、SNS系ボタンのカウント数を定期的にDBにキャッシュするようになります。
各種SNSボタンのデザインを別途用意し、カウント数を関数で取得させることで高速なボタン表示が可能になります。

# SNS Count Cacheプラグインのhttps合算機能

この他にもSNS Count Cacheプラグインには、httpとhttpsを合算して表示する機能があります。

httpで運用しているWordpressサイトをhttps化すると、facebookのいいね！数等のSNS系ボタンのカウント数が0にリセットされてしまいますので、https化の際には是非導入しておきたいプラグインです。

SNS Count Cacheの設定画面で、https化の際に、以下の項目に設定を行います。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/38162/dede5f41-82c6-661c-00d6-b9b842bf4d6c.jpeg)

設定更新直後は、カウント数が一時的に0になりますが、徐々にキャッシュが始まり、httpとhttpsのカウント数を合算して表示されるようになります。

# https化後にプラグインを正しく動作させるために行ったこと

SNS Count Cacheプラグインのバージョン0.9.1を導入し、https化の設定を行いましたが、うまく動作せずカウント数が0のままでした。

（補足すると、管理画面から手動でキャッシュするとhttp分だけキャッシュされました。また、はてなブックマークだけは正しく合算表示されていました）

ソースをデバッグして調査した結果、sns-count-cache.php の1016行目の、以下の設定をコメントアウトすることで、うまく動作しました。

```
// Pocket and Google+ are excluded from migration target because they are migrated automatically.
$this->scheme_migration_exclude_keys = array(
    //self::REF_SHARE_POCKET,
    //self::REF_SHARE_GPLUS,
    //self::REF_FOLLOW_TWITTER,
    //self::REF_FOLLOW_FACEBOOK,
    //self::REF_FOLLOW_PUSH7,
    //self::REF_FOLLOW_INSTAGRAM
);
```

# SNS Count Cacheプラグインの動作概要

SNS Count Cacheプラグインは、以下のURLでアクセスして、取得したJSONデータからカウント数を取得し、DBにキャッシュします。

+ FaceBook
 https://api.facebook.com/method/links.getStats?format=json&urls=【SNSボタンを設置したURL】

+ Google+
https://apis.google.com/_/+1/fastbutton?url=【SNSボタンを設置したURL】

+ Pocket
http://widgets.getpocket.com/v1/button?v=1&count=horizontal&url=【SNSボタンを設置したURL】

+ はてな
http://api.b.st-hatena.com/entry.count?url=【SNSボタンを設置したURL】

httpで稼働していたWordPressサイトをhttps化し、SNS Count Chacheプラグインのhttps設定を行っておくと、自動キャッシュ時に、まずhttpでカウント数を取得した後、httpsでもカウント数を取得しに行きます。

この処理を行っているのが、
class-share-cache-engine.php 72行目のcache関数
になります。

```

	public function cache( $options = array() ) {
...
		if ( $this->scheme_migration_mode && Common_Util::is_secure_url( $target_url ) ) {
			if ( ! isset( $this->scheme_migration_date ) ) {
				$target_normal_url = Common_Util::get_normal_url( $target_url );
				$target_sns_migrated = $target_sns;

				foreach ( $this->scheme_migration_exclude_keys as $sns ) {
					unset( $target_sns_migrated[$sns] );
				}
...
				$migrated_data = $this->get_data( $target_sns_migrated, $target_normal_url );
...
				foreach ( $target_sns_migrated as $sns => $active ) {
					if ( $active && isset( $migrated_data[$sns] ) && is_numeric( $migrated_data[$sns] ) && $migrated_data[$sns] > 0 ){
						$data[$sns] = $data[$sns] + $migrated_data[$sns];
					}
				}

			} else {
				if ( isset( $publish_date ) ) {
					if ( strtotime( $publish_date ) <= strtotime( $this->scheme_migration_date ) ) {
						$target_normal_url = Common_Util::get_normal_url( $target_url );
						$target_sns_migrated = $target_sns;

						foreach ( $this->scheme_migration_exclude_keys as $sns ) {
							unset( $target_sns_migrated[$sns] );
						}
...
						$migrated_data = $this->get_data( $target_sns_migrated, $target_normal_url );
...
						foreach ( $target_sns_migrated as $sns => $active ) {
							if ( $active && isset( $migrated_data[$sns] ) && is_numeric( $migrated_data[$sns] ) && $migrated_data[$sns] > 0 ){
								$data[$sns] = $data[$sns] + $migrated_data[$sns];
							}
						}
					}
				} else {
					$target_normal_url = Common_Util::get_normal_url( $target_url );
					$target_sns_migrated = $target_sns;

					foreach ( $this->scheme_migration_exclude_keys as $sns ) {
						unset( $target_sns_migrated[$sns] );
					}
...
					$migrated_data = $this->get_data( $target_sns_migrated, $target_url );
...
					foreach ( $target_sns_migrated as $sns => $active ) {
						if ( $active && isset( $migrated_data[$sns] ) && is_numeric( $migrated_data[$sns] ) && $migrated_data[$sns] > 0 ){
							$data[$sns] = $data[$sns] + $migrated_data[$sns];
						}
					}
				}
			}
...
```

この関数において、上記でコメントアウトした
$this->scheme_migration_exclude_keys
に該当SNSの値が入っていると、そのSNSについてはhttpsでキャッシュされなくなってしまいます。
（はてなブックマークが正しく合算して表示されていたのは、この中に含まれていなかったからでした）

# 残った疑問

なぜ、以下のSNSについてはhttpとhttpsの合算処理を除外するのか？

```
// Pocket and Google+ are excluded from migration target because they are migrated automatically.
$this->scheme_migration_exclude_keys = array(
    self::REF_SHARE_POCKET,
    self::REF_SHARE_GPLUS,
    self::REF_FOLLOW_TWITTER,
    self::REF_FOLLOW_FACEBOOK,
    self::REF_FOLLOW_PUSH7,
    self::REF_FOLLOW_INSTAGRAM
);
```

Twitterはカウント数を表示しなくなったので、もはや関係ありませんが、PocketとGoogle+については自動的に合算するから必要ない旨のコメントが書いてあります。

しかしながら、例えばGoogle+では以下のURLでカウント数を取得していますが、

https://apis.google.com/_/+1/fastbutton?url=【SNSボタンを設置したURL】

http、httpsでそれぞれ取得して確認したところ、（合算された値ではなく）それぞれのカウント数が取得されたため、やはりmigration対象にしておかないと正しく動作しないと思います。