web-dev-qa-db-ja.com

ソーシャルシェアの合計を取得する(Facebook、Twitter、Google +、Pinterest)

私は私のテーマのfunction.phpで次のコードスニペットを使用して私が述べたソーシャルメディアのための個々の分け前の数を引いています:

$facebook_like_share_count = function ( $url ) {

    $api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );

    $count = json_decode( $api );

    return $count->shares;
};

$Twitter_Tweet_count = function ( $url ) {

    $api = file_get_contents( 'https://cdn.api.Twitter.com/1/urls/count.json?url=' . $url );

    $count = json_decode( $api );

    return $count->count;
};

$pinterest_pins = function ( $url ) {

    $api = file_get_contents( 'http://api.pinterest.com/v1/urls/count.json?callback%20&url=' . $url );

    $body = preg_replace( '/^receiveCount\((.*)\)$/', '\\1', $api );

    $count = json_decode( $body );

    return $count->count;

};

$google_plusones = function ( $url ) {
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, "https://clients6.google.com/rpc" );
    curl_setopt( $curl, CURLOPT_POST, 1 );
    curl_setopt( $curl, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
    $curl_results = curl_exec( $curl );
    curl_close( $curl );
    $json = json_decode( $curl_results, true );

    return intval( $json[0]['result']['metadata']['globalCounts']['count'] );
};

次のコードを使ってそれらを私のsingle.phpに呼び出します。

<?php $url = get_permalink( $post_id ); echo $facebook_like_share_count ("$url");?>
<?php $url = get_permalink( $post_id ); echo $Twitter_Tweet_count ("$url");?>
<?php $url = get_permalink( $post_id ); echo $pinterest_pins ("$url");?>
<?php $url = get_permalink( $post_id ); echo $google_plusones ("$url");?>

これはうまくいきます。

今、私はこれら4つのサービスのシェア数を追加し、シェア数を表示するコードスニペットを見つけようとしています - おそらく this here のようなものです。

編集: 重要な質問があります。

上のコードが私のブログを遅くしている可能性はありますか?

私はすでに私のホスティングサービスに連絡しました、そして、彼らはそれがプラグインかphpファイルのようなものでなければならないと私に言いました。私は最近プラグインを実際には更新していません。P3Profilierは、いつもの犯人が誰であるかを教えてくれます。しかし、私のsingle.phpでその関数を呼び出した直後に私のサーバーは時々超低速でロードします - スピードチェックサイトではタイムアウトになることさえあります。何か案は?

EDIT2: 多くのテストの後、ページを遅くするのは実際には(エコーされたときに)このコードのようです。 shrugs私はそれを使うのをやめなければならないと思いますか?

私はそれをうまく動かすことができませんでした。あなたが私をここで助けてくれることを願っています。どうもありがとうございます!

2
japanworm

はい。 @ialocinは Transients についてメモしました。何らかの奇妙な理由で、私はまだこれに遭遇していません。以前は、カウントを次の方法で表示していました。

  • jQuery(クライアント側の読み込み)
  • ページキャッシュ(カウントをローカルに保存する場合)
  • Cron更新カウント値
  • そして最近では、すべてのカウントをポストメタに保存し、ページが100回読み込まれるたびにメタを更新しました。

しかし、いや、もっと良いものがあります。私はずっと良い。過渡現象。過渡現象。一時的な...何時間も唱えます...瞑想して戻ったら、私があなたのためにカスタマイズした以下のコードを掘り下げてください:

// Check for transient. If none, then execute code
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {

    /* action */
    $facebook_like_share_count = function ( $url ) {

        $api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );

        $count = json_decode( $api );

        return $count->shares;
    };

    $Twitter_Tweet_count = function ( $url ) {

        $api = file_get_contents( 'https://cdn.api.Twitter.com/1/urls/count.json?url=' . $url );

        $count = json_decode( $api );

        return $count->count;
    };

    $pinterest_pins = function ( $url ) {

        $api = file_get_contents( 'http://api.pinterest.com/v1/urls/count.json?callback%20&url=' . $url );

        $body = preg_replace( '/^receiveCount\((.*)\)$/', '\\1', $api );

        $count = json_decode( $body );

        return $count->count;

    };

    $google_plusones = function ( $url ) {
        $curl = curl_init();
        curl_setopt( $curl, CURLOPT_URL, "https://clients6.google.com/rpc" );
        curl_setopt( $curl, CURLOPT_POST, 1 );
        curl_setopt( $curl, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
        $curl_results = curl_exec( $curl );
        curl_close( $curl );
        $json = json_decode( $curl_results, true );

        return intval( $json[0]['result']['metadata']['globalCounts']['count'] );
    };

    // store data in array
    $data = array (
        $facebook_like_share_count,
        $Twitter_Tweet_count,
        $pinterest_pins,
        $google_plusones
    );

    // Put the results in a transient. Expire after 6 hours
    set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS  );
}

if (is_array($data)) {

    $facebook_like_share_count = $data[0];
    $Twitter_Tweet_count = $data[1];
    $pinterest_pins = $data[2];
    $google_plusones = $data[3];

}

最初に、$post_idが既にこのコードを追加するように設定されていることを確認します。このコードはIDを使用して固有のハンドルをトランジェントに追加するためです。

キャッシュされたデータにカスタム名と時間枠を付けて一時的にデータベースに保存します。その後、期限が切れて削除されます。

したがって、6時間ごとに、キャッシュされたアレイを更新します。それはそれと同じくらい簡単です。明確化のためにコメントを参照してください。

編集:

コメントスレッドでの議論に従って、コードを調整しました。まず、functions.phpファイル内に共有関数があることを確認し(現在の設定で既にこれを持っていると思います)、次にsingle.phpファイルで、getカウント値。

// get post id
$post_id = get_the_ID();

// get perm url to be used for share count functions
$url = get_permalink( $post_id );

// Check for transient. If none, then execute code
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {

    /* action */
    $facebook_like_share_count ("$url");
    $Twitter_Tweet_count ("$url");
    $pinterest_pins ("$url");
    $google_plusones ("$url");

    // store data in array
    $data = array (
        $facebook_like_share_count,
        $Twitter_Tweet_count,
        $pinterest_pins,
        $google_plusones
    );

    // Put the results in a transient. Expire after 6 hours
    set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS  );
}

if (is_array($data)) {

    // these are your variables containing the share count
    $facebook_like_share_count = $data[0];
    $Twitter_Tweet_count = $data[1];
    $pinterest_pins = $data[2];
    $google_plusones = $data[3];

}

明確にするためにコード内に入れたコメントを読んでください。

3