Cocoonフォーラム

サイト内検索
書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示高速化を無効にしてください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法
  7. ブラウザ環境チェックツール
  8. Cocoonカスタマイズ依頼

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

SNSシェア数を記事一覧で確認したい
 
共有:
通知
すべてクリア

SNSシェア数を記事一覧で確認したい

11 投稿
3 ユーザー
1 Reactions
33 表示
(@windorz)
Active Member Registered
結合: 7年前
投稿: 5
トピックスターター  

以前は、SNS count cacheを使用して確認していましたが、PHP8への対応がされていないので、現在は使用しておりません。

Cocoonの機能として記事ごとのSNSシェア数を一覧で確認できるようにして頂けると助かります。

もし、導入するコストが見合わないということでしたら、記事ごと、SNS種別ごとにシェア数をtransientに保存していると思いますので、transientを保存するタイミングにactionフックを追加して頂けると助かります。

そうして頂ければ、actionフックでSNSシェア数を別途保存して、自前でカスタマイズできる道も開けます。

 


   
引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3434
 

投稿者:: @windorz

SNSシェア数を一覧で確認できるようにして頂けると助かります

これは管理画面の投稿一覧のことを指しますか?


分かる範囲で、キャッシュから値を取得し、それぞれに表示。(該当のキャッシュで合っているか確認していません。)

●管理画面の投稿一覧にカラムを設け、SNSシェア数を表示

add_filter('manage_posts_columns', function($columns) {
  $columns['sns_share'] = 'SNSシェア数';
  return $columns;
});

// 投稿のカスタムカラムにSNSシェア数を表示
add_action('manage_posts_custom_column', function($column, $post_ID) {
  if ($column == 'sns_share') {
    $fb_id     = TRANSIENT_SHARE_PREFIX . 'facebook_' . $post_ID;
    $hatebu_id = TRANSIENT_SHARE_PREFIX . 'hatebu_'   . $post_ID;
    $pocket_id = TRANSIENT_SHARE_PREFIX . 'pocket_'   . $post_ID;

    $fb_count     = intval(get_transient($fb_id));
    $hatebu_count = intval(get_transient($hatebu_id));
    $pocket_count = intval(get_transient($pocket_id));

    // SNSシェア数を表示
    echo 'Facebook: ' . $fb_count . '<br>';
    echo 'はてブ: ' . $hatebu_count . '<br>';
    echo 'Pocket: ' . $pocket_count;
  }
}, 10, 2);

●エントリーカードにSNSシェア数を表示

add_action('entry_card_snippet_after', function($post_ID) {
  $fb_id     = TRANSIENT_SHARE_PREFIX . 'facebook_' . $post_ID;
  $hatebu_id = TRANSIENT_SHARE_PREFIX . 'hatebu_'   . $post_ID;
  $pocket_id = TRANSIENT_SHARE_PREFIX . 'pocket_'   . $post_ID;

  $fb_count     = intval(get_transient($fb_id));
  $hatebu_count = intval(get_transient($hatebu_id));
  $pocket_count = intval(get_transient($pocket_id));

  // HTML 出力
  echo '<ul class="sns">';
  echo '<li><span class="social-icon icon-facebook"></span>:' . $fb_count . '</li>';
  echo '<li><span class="social-icon icon-hatena"></span>:' . $hatebu_count . '</li>';
  echo '<li><span class="social-icon icon-pocket"></span>:' . $pocket_count . '</li>';
  echo '</ul>';
});

 


   
わいひら reacted
返信引用
(@windorz)
Active Member Registered
結合: 7年前
投稿: 5
トピックスターター  

@chu-ya 

はい、管理画面の投稿一覧です。


   
返信引用
(@windorz)
Active Member Registered
結合: 7年前
投稿: 5
トピックスターター  

@chu-ya

コードありがとうございます。

CocoonのSNSキャッシュは記事表示時にAPIから取得されてtransientの保存期限は1日だったかと。

常に保持されているわけではなかったと思います。

記事一覧に表示するシェア数はtransientではなく、transientを更新するタイミングで別領域に保存したデータである必要があるかと考えています。

 


   
返信引用
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17669
 

投稿者:: @windorz

transientを保存するタイミングにactionフックを追加して頂けると助かります。

このタイミングというのは、以下のFacebook、はてなブックマーク、ポケットのtransient保存タイミング直前に、

do_action('set_transient_sns_share_count', $transient_id, $res);

と言った感じのアクションフックを設置するというのでよろしいでしょうか。
https://github.com/xserver-inc/cocoon/blob/7f56755f36aa906db162843fb48ddcbba2d3c8ff/lib/sns-share.php#L158
https://github.com/xserver-inc/cocoon/blob/7f56755f36aa906db162843fb48ddcbba2d3c8ff/lib/sns-share.php#L246
https://github.com/xserver-inc/cocoon/blob/7f56755f36aa906db162843fb48ddcbba2d3c8ff/lib/sns-share.php#L374


   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3434
 

アクションフックを追加しても、どのような使われ方をするのでしょうか?
タイミングに応じ、以下には何が入るのでしょうか?意味があるのか?

 $transient_id, $res

●ご参考

管理画面ではget_share_cache_ID()が正しく動作しない。
例えばfetch_facebook_countの引数をURLではなく、投稿IDに変更し、管理画面でもSNS数を取得できるようにする。
他にも見直し必要ですが。

function fetch_facebook_count($post_id = null) {
  // URLを取得
  $url = $post_id ? get_permalink($post_id) : get_the_permalink();

  // キャッシュIDを投稿IDまたはget_share_cache_ID()で取得
  $cache_id = $post_id ? $post_id : get_share_cache_ID();
  $transient_id = TRANSIENT_SHARE_PREFIX . 'facebook_' . $cache_id;

  // キャッシュから取得
  if (is_sns_share_count_cache_enable()) {
    $count = get_transient($transient_id);
    if (is_numeric($count)) {
      return $count;
    }
  }

  $res = fetch_facebook_count_raw($url);
  //別スキームカウントの取得
  if (is_sns_share_count_cache_enable() && is_another_scheme_sns_share_count()) {
    $res += fetch_facebook_count_raw(get_another_scheme_url($url));
  }

  // キャッシュ保存
  if (is_sns_share_count_cache_enable()) {
    set_transient($transient_id, $res, HOUR_IN_SECONDS * get_sns_share_count_cache_interval());
  }

  return $res;
}

   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3434
 

>わいひらさん

そこにフック付けて意味あります?
どんな使い方を想定しています?具体例をあげ説明願います。


   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3434
 

●ご参考

以下に変更すれば、以下を用い管理画面でも各投稿のSNSカウント数が取得できるかと思います。

  • get_facebook_count()
  • get_hatebu_count()
  • get_pocket_count()

https://notepad.pw/share/sLHo8gQ2c0sDGQBJcH6W


   
返信引用
(@windorz)
Active Member Registered
結合: 7年前
投稿: 5
トピックスターター  

@yhira さん

その場所が期待するアクションフックの場所になります。

$resと$post_idがあれば理想です。

transientだと保持期間の長さによってデータが保持されていないケースがあると思い、transientが更新されるタイミングでSNSカウント数をpost_metaに保存しようと思ってフックの追加を要望しました。

投稿一覧などでSNSシェア数を取得する際には、post_metaからSNSシェア数を取得するつもりでした。

 


   
返信引用
大門未知子
(@chu-ya)
Illustrious Member Registered
結合: 3年前
投稿: 3434
 

@windorz さん

投稿者:: @windorz

transientが更新されるタイミング

はじめてフックを用いカスタマイズした際、キャッシュが更新されるまでの間、post_metaは空のままとなると思います。
また、各ページが1度でも開かれないと、更新されないのでは?

キャッシュが更新され初めてカウント値が取得でき、post_metaに値が保存されることになるかと思います。
(運用でカバー)

私個人としてはget_facebook_countで値が取得される方が望ましいと思いますが。


   
返信引用
(@windorz)
Active Member Registered
結合: 7年前
投稿: 5
トピックスターター  

@chu-ya さん

はじめてフックを用いカスタマイズした際、キャッシュが更新されるまでの間、post_metaは空のままとなると思います。
また、各ページが1度でも開かれないと、更新されないのでは?

これはその通りです。

投稿一覧を表示する時にAPIへのアクセスが大量発生しないように緩い運用を考えていました。

この投稿は59分前ずつwindorzに変更されました

   
返信引用
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

タイトルとURLをコピーしました