Ottenere il conteggio totale delle condivisioni social (Facebook, Twitter, Google+, Pinterest)

24 mag 2015, 21:10:11
Visualizzazioni: 16.3K
Voti: 2

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!

11
Commenti

$total_count = $facebook_like_share_count + $twitter_tweet_count + $pinterest_pins + $google_plusones;

Nicolai Grossherr Nicolai Grossherr
26 mag 2015 17:02:20

@ialocin Posso semplicemente copiare e incollare questo nel mio function.php così com'è e stamparlo nel mio single.php? Grazie. :)

japanworm japanworm
27 mag 2015 00:15:24

Il motivo per cui rallenta la tua pagina è perché stai richiedendo dati da 4 siti diversi. Quindi tutti questi devono essere caricati prima che il tuo script possa continuare l'elaborazione. Questo è negativo. Aggiungi un cron che lo faccia per te, o metti in cache la pagina. Non caricarlo ad ogni apertura di pagina.

Christine Cooper Christine Cooper
27 mag 2015 02:47:31

@ChristineCooper Cos'è un cron? Scusa, come ho detto non sono molto brava con i codici. Pensavo che la pagina fosse in cache visto che uso il plugin W3 Total Cache.

japanworm japanworm
27 mag 2015 03:01:53

Dai un'occhiata a "WP Cron", funziona a intervalli prestabiliti. Crei una funzione che controlla i conteggi di condivisione, li memorizza tramite update_post_meta() e usi questo valore per visualizzare il conteggio delle condivisioni localmente invece di richiedere file esterni a ogni caricamento della pagina. Anche se non sono sicuro che questo sia l'approccio giusto. Personalmente, farei tutto via jQuery, in questo modo lasci che tutta l'azione avvenga lato client, come dovrebbe essere per questo tipo di cosa.

Christine Cooper Christine Cooper
27 mag 2015 03:07:03

@ChristineCooper Ho visto approcci con jQuery. Purtroppo non sono ancora riuscito a farne funzionare nessuno, ecco perché ho chiesto consiglio qui. :)

japanworm japanworm
27 mag 2015 03:10:10

Suggerisco di chiedere una soluzione jQuery su stackoverflow invece, perché questa non è una risposta specifica per WordPress e dubito che riceverai una risposta qui. Darei comunque un'altra possibilità su Google perché è una funzionalità molto richiesta, quindi dovrebbe esserci molto codice disponibile. =)

Christine Cooper Christine Cooper
27 mag 2015 03:12:23

@ChristineCooper Ho cercato ovunque su Google e ho provato tutti i frammenti di codice che ho trovato. Niente ha funzionato. Grazie, lo farò. :)

japanworm japanworm
27 mag 2015 11:00:07

A volte lavoro con i transient per i conteggi di condivisione social, il che significa che i valori dei conteggi vengono aggiornati a determinati intervalli di tempo e non ad ogni caricamento della pagina. E no, non puoi semplicemente copiare e incollarlo e usarlo nel tuo single.php, perché la variabile non sarebbe nello scope.

Nicolai Grossherr Nicolai Grossherr
27 mag 2015 11:48:32

@ialocin Transients! Sì! Ora dovrò aggiornare il mio codice. OP, guarda qui: https://codex.wordpress.org/Transients_API

Christine Cooper Christine Cooper
27 mag 2015 18:38:16

@ialocin Ho appena pubblicato una risposta a questo usando i transients. Ottimo suggerimento.

Christine Cooper Christine Cooper
27 mag 2015 19:18:30
Mostra i restanti 6 commenti
Tutte le risposte alla domanda 1
16

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.

27 mag 2015 19:18:10
Commenti

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

Nicolai Grossherr Nicolai Grossherr
27 mag 2015 23:08:14

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? :(

japanworm japanworm
28 mag 2015 00:27:22

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

Christine Cooper Christine Cooper
28 mag 2015 00:29:20

@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?! ^^;

japanworm japanworm
28 mag 2015 11:52:38

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.

Christine Cooper Christine Cooper
28 mag 2015 17:44:25

@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.

japanworm japanworm
28 mag 2015 18:51:03

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

fuxia fuxia
30 mag 2015 06:48:14

@toscho Come sarebbe quel codice?

japanworm japanworm
31 mag 2015 02:59:50

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

fuxia fuxia
31 mag 2015 03:15:25

Vedi il mio codice aggiornato...

Christine Cooper Christine Cooper
1 giu 2015 18:08:02

@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.. :(

japanworm japanworm
2 giu 2015 19:21:51

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.

Christine Cooper Christine Cooper
2 giu 2015 19:23:18

@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.

japanworm japanworm
2 giu 2015 23:05:19

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.

Christine Cooper Christine Cooper
3 giu 2015 00:29:21

@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.

japanworm japanworm
3 giu 2015 01:12:22

@ChristineCooper Quindi, suppongo che dovrei semplicemente arrendermi se il codice non funziona nel mio file function.php per qualsiasi motivo? Grazie. :)

japanworm japanworm
6 giu 2015 15:09:41
Mostra i restanti 11 commenti