Ottenere il conteggio totale delle condivisioni social (Facebook, Twitter, Google+, Pinterest)
Sto recuperando i conteggi individuali delle condivisioni per i social media menzionati utilizzando il seguente snippet di codice nel file function.php del mio tema:
$facebook_like_share_count = function ( $url ) {
// Recupera i dati delle condivisioni da Facebook Graph API
$api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );
$count = json_decode( $api );
return $count->shares;
};
$twitter_tweet_count = function ( $url ) {
// Recupera i dati dei tweet da Twitter API
$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 ) {
// Recupera i dati dei pin da Pinterest API
$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 ) {
// Recupera i dati dei +1 da Google API
$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'] );
};
Li chiamo nel mio single.php con il seguente codice:
<?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");?>
Funziona correttamente.
Ora sto cercando uno snippet di codice che possa sommare i conteggi di condivisione di questi 4 servizi e mostrare il conteggio totale delle condivisioni - probabilmente qualcosa di simile a questo qui.
MODIFICA: Ho una domanda importante.
È possibile che il codice sopra stia rallentando il mio blog?
Ho già contattato il mio servizio di hosting e mi hanno detto che deve essere qualcosa come un plugin o file php. Non ho effettivamente aggiornato alcun plugin di recente e P3 Profiler mi indica solo i soliti colpevoli. Ma ho notato che subito dopo aver chiamato quella funzione nel mio single.php il mio server a volte carica molto lentamente - addirittura riceve timeout sui siti di controllo velocità. Qualche idea?
MODIFICA2: Dopo molti test sembra proprio che sia questo codice (quando richiamato) a rallentare la pagina. alza le spalle Immagino di dover smettere di usarlo?
Non sono ancora riuscito a farlo funzionare. Spero che tu possa aiutarmi qui. Grazie mille!

Ok. @ialocin ha fatto una nota riguardo i Transients. Per qualche strana ragione, non li avevo ancora incontrati. In precedenza, usavo visualizzare i conteggi con:
- jQuery (caricamento lato client)
- Cache della pagina (quando memorizzavo i conteggi localmente)
- Aggiornamento dei valori tramite Cron
- E più recentemente, memorizzavo tutti i conteggi nei post meta e aggiornavo i meta ogni 100 caricamenti della pagina... abbastanza folle.
Ma no, c'è qualcosa di meglio. Molto meglio. I Transients. Transients. Transients... ripetilo per ore... Dopo aver meditato e tornato, immergiti nel seguente codice che ho personalizzato per te:
// Controlla se esiste il transient. Se non esiste, esegui il codice
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) {
/* azione */
$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'] );
};
// memorizza i dati in un array
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Salva i risultati in un transient. Scade dopo 6 ore
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];
}
Prima di tutto, assicurati che $post_id
sia già impostato prima di aggiungere questo codice, poiché utilizza l'ID per aggiungere un handle univoco al transient.
Stiamo memorizzando i dati nella cache del database temporaneamente assegnandogli un nome personalizzato e un periodo di tempo dopo il quale scadrà e verrà eliminato.
Quindi, ogni 6 ore, aggiorna l'array memorizzato nella cache. È semplicissimo. Vedi i commenti per chiarimenti.
MODIFICA:
Come discusso nel thread dei commenti, ho modificato il codice. Prima di tutto, assicurati di avere le funzioni di condivisione nel tuo file functions.php
(credo che tu lo abbia già nel tuo setup attuale), poi nel tuo file single.php
, aggiungi il seguente codice dove vuoi ottenere
i valori dei conteggi.
// ottieni l'ID del post
$post_id = get_the_ID();
// ottieni l'URL permanente da usare per le funzioni di conteggio condivisioni
$url = get_permalink( $post_id );
// Controlla se esiste il transient. Se non esiste, esegui il codice
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {
/* azione */
$facebook_like_share_count ("$url");
$twitter_tweet_count ("$url");
$pinterest_pins ("$url");
$google_plusones ("$url");
// memorizza i dati in un array
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Salva i risultati in un transient. Scade dopo 6 ore
set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS );
}
if (is_array($data)) {
// queste sono le tue variabili che contengono il conteggio delle condivisioni
$facebook_like_share_count = $data[0];
$twitter_tweet_count = $data[1];
$pinterest_pins = $data[2];
$google_plusones = $data[3];
}
Per favore leggi i commenti che ho inserito nel codice per chiarimenti.

Mi hai fatto sorridere felice vedendo quanto ti rendono felici i transient :)

Ciao. Grazie mille per il tuo duro lavoro. Ho provato a inserire il tuo codice nel function.php del mio tema, ma se lo faccio la pagina non si carica. Suppongo ci sia un errore di sintassi? :(

Cosa? No, questo codice dovrebbe andare dov'era originariamente. Immagino in single.php

@ChristineCooper Avevo il codice che ho originariamente postato nella mia domanda nel mio file functions.php e poi l'ho fatto echo nel single.php. Pensavo di dover fare lo stesso con il tuo snippet di codice?! ^^;

Per favore aggiorna la tua domanda con il codice completo che usi nel tuo file functions.php e il codice completo che usi per chiamare le tue funzioni nel tuo file single.php o loop-single.php. In questo modo posso vedere esattamente cosa sta succedendo e modificare il codice per te.

@ChristineCooper Grazie. Ho modificato la mia domanda. Fammi sapere se hai bisogno di vedere anche il mio file functions.php completo e lo caricherò su pastebin.

file_get_contents()
non funzionerà con gli URL su tutti i server. Usa invece l'HTTP API.

@japanworm Qualcosa come questo: $count = json_decode( wp_remote_retrieve_body( wp_safe_remote_get( 'http://graph.facebook.com/?id=' . $url ) ) );

@ChristineCooper Ho riprovato. Non credo tu abbia modificato lo snippet di codice che dovrei inserire nel mio function.php. Dev'esserci un errore di sintassi da qualche parte. Essendo pessimo con il codice, non riesco a capirlo da solo. Forse uno snippet di codice nel function.php non può iniziare con "if"?? Non so.. :(

Non ho modificato il codice nel tuo file functions.php, dovrebbe essere esattamente lo stesso codice che hai usato prima e che funzionava secondo te? Quindi non dovresti ottenere un errore nel tuo file functions.php se stai usando lo stesso codice funzionante.

@ChristineCooper Se uso il codice pubblicato nella mia domanda, non ottengo questo errore. Se invece uso il codice che hai postato nella tua risposta, lo ottengo.

Hai inserito il mio codice nel tuo file single.php? Inoltre, per favore incolla l'errore completo come commento qui e indica quale parte del codice viene referenziata dal messaggio di errore.

@ChristineCooper Non c'è un messaggio di errore. Il mio blog smette di caricarsi non appena inserisco il codice nel file function.php, il che di solito indica un errore di sintassi.
