#author("2018-01-24T16:14:52+09:00","default:wikiwriter","wikiwriter") #author("2018-01-24T16:19:20+09:00","default:wikiwriter","wikiwriter") &tag(WordPress/SNSCountCache); *目次 [#qbaa3fcc] #contents *関連ページ [#n44b1c2d] *参考情報 [#ad061686] -[[SNS Count Cache — WordPress プラグイン:https://ja.wordpress.org/plugins/sns-count-cache/]] *概要 [#jaafa3d6] -はてなブックマークやTwitter、Facebookなどによる共有数を表示するためのプラグイン。 -日本人作者なのではてなブックマークに対応しているのが特徴。 *Tips [#vf6dfb8d] **デバッグ方法 [#c9a41448] -WordPressの設定で「WP_DEBUG」をtrueに設定すると、プラグイン内部のSCC_Common_Util::logによるログが書き出されるようになる。 -メソッドの呼び出し順がわかるので、どこで時間がかかっているのかdebug.logをtailしながら確認すると良い。 *トラブルシューティング [#y2dba47e] **重すぎて有効化できない [#hff84551] -WP_DEBUGをtrueにして確認してみたところclass-scc-share-second-cache-engine.phpのinitialize_cache()で時間がかかっていた。 -さらにその内部の以下の部分で時間がかかっているので、そこをコメントアウトすると良い。 #pre{{ if ( $posts_query->have_posts() ) { while ( $posts_query->have_posts() ) { $posts_query->the_post(); $post_id = get_the_ID(); foreach ( $this->target_sns as $sns => $active ) { $meta_key = $this->get_cache_key( $sns ); if ( $active ) { update_post_meta( $post_id, $meta_key, (int) -1 ); } } } } }} -update_post_metaで記事ごとに値を保存しているのでそこで時間がかかっている模様。 -とくに初期化しなくても実用上の問題はなさそう。 **設定が保存できない。設定を保存するとカウントがリセットされる。 [#b91eb3ef] -設定の保存はadmin-setting.phpのupdate_optionで実行される。そのあとに以下のような記述がある。 #pre{{ update_option( self::DB_SETTINGS, $settings ); $this->reactivate_plugin(); }} -reactivate_plugin()でキャッシュのクリアが行われているので、カウント値が消えるのは仕様といえる。 -キャッシュを消す処理が時間がかかるので(重すぎて有効化できないを参考)、update_post_metaの処理を消しておかないとメモリを消費しすぎたり、時間がかかりすぎたりということになる。 **Facebookのカウントが取得できない [#i816db70] -[[「SNS Count Cache 0.11.1」でFacebookのシェア数をカウントする方法【WordPress】:https://www.islog.jp/entry/sns-count-cache-facebook/]]にあるような修正でうまくいく。ただしうまくコピペできない(シングルクォートが違う文字になる)ので以下に再掲。 -class-scc-share-facebook-strategy.phpを修正する。 --build_query_urlの修正 $url = self::DEF_BASE_URL . '?id='. rawurlencode($this->query_parameters['id']) . '&fields=og_object{engagement},engagement&access_token=' . $this->query_parameters['access_token']; --extract_countの修正。 #pre{{ 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; // } $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; } }} *考察 [#p16624e0] **キャッシュの削除処理は? [#e2443aa5] -WordPressのTransient APIを利用してキャッシュを削除している。set_transientで設定時に期間を指定する。 -ソースコード中でset_transientしている箇所を探せばよい。 -例えばclass-sc-share-base-cache-engine.phpなどで、get_cache_expiration()で取得できる有効期間が設定されている。 #pre{{ /** * Get cache expiration based on current number of total post and page * * @since 0.1.1 */ protected function get_cache_expiration() { SCC_Common_Util::log( '[' . __METHOD__ . '] (line='. __LINE__ . ')' ); $posts_total = $this->get_posts_total(); SCC_Common_Util::log( '[' . __METHOD__ . '] posts_total: ' . $posts_total ); return ceil( $posts_total / $this->posts_per_check ) * $this->check_interval * 3; } }}