Obține numărul total de partajări pe rețelele sociale (Facebook, Twitter, Google+, Pinterest)

24 mai 2015, 21:10:11
Vizualizări: 16.3K
Voturi: 2

Extrag numărul individual de partajări pentru rețelele sociale menționate folosind următorul fragment de cod în fișierul functions.php al temei mele:

$facebook_like_share_count = function ( $url ) {

    // Obține numărul de partajări de pe Facebook prin API
    $api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );

    $count = json_decode( $api );

    return $count->shares;
};

$twitter_tweet_count = function ( $url ) {

    // Obține numărul de tweet-uri prin API-ul Twitter
    $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 ) {

    // Obține numărul de pin-uri de pe Pinterest
    $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 ) {
    // Obține numărul de +1 de pe Google+ folosind cURL
    $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'] );
};

Le apelez în single.php cu următorul cod:

<?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");?>

Acest cod funcționează corect.

Acum încerc să găsesc un fragment de cod care să adune numărul de partajări de la aceste 4 servicii și să afișeze numărul total - probabil ceva similar cu acesta.

EDIT: Am o întrebare importantă.

Este posibil ca codul de mai sus să încetinească blogul meu?

Am contactat deja serviciul de hosting și mi-au spus că probabil este vorba despre un plugin sau fișiere PHP. Nu am actualizat pluginuri recent și P3 Profiler îmi arată doar vinovații obișnuiți. Dar am observat că imediat după apelarea acelei funcții în single.php, serverul meu se încarcă uneori foarte încet - chiar primesc timeout pe site-urile de testare a vitezei. Aveți idei?

EDIT2: După multe teste, se pare că într-adevăr acest cod (când este afișat) încetinește pagina. ridică din umeri Presupun că trebuie să nu-l mai folosesc?

Încă nu am reușit să-l fac să funcționeze. Sper că mă puteți ajuta. Vă mulțumesc mult!

11
Comentarii

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

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

@ialocin Pot să copiez și să lipesc asta direct în fișierul meu function.php așa cum este și să-l afișez în single.php? Mulțumesc. :)

japanworm japanworm
27 mai 2015 00:15:24

Motivul pentru care încetinește pagina este că faci cereri de date la 4 site-uri diferite. Deci toate acestea trebuie să se încarce înainte ca scriptul tău să continue procesarea. Acest lucru este prost. Adaugă un cron care să facă asta pentru tine sau cachează pagina. Nu încărca asta la fiecare încărcare de pagină.

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

@ChristineCooper Ce este un cron? Îmi pare rău, cum am spus nu mă descurc foarte bine cu codurile. Am crezut că pagina este în cache deoarece folosesc pluginul W3 Total Cache.

japanworm japanworm
27 mai 2015 03:01:53

Caută informații despre "WP Cron", rulează la intervale prestabilite. Creezi o funcție care verifică numărul de share-uri, le stochează prin update_post_meta() și folosești această valoare pentru a afișa numărul de share-uri local, în loc să soliciți fișiere externe la fiecare încărcare de pagină. Totuși, nu sunt sigur dacă aceasta este abordarea pe care ar trebui să o alegi. Personal, aș face toate acestea prin jQuery, astfel lași toată acțiunea să se întâmple pe partea de client, unde ar trebui să fie pentru acest tip de lucruri.

Christine Cooper Christine Cooper
27 mai 2015 03:07:03

@ChristineCooper Am văzut abordări cu jQuery. Din păcate, nu am reușit să fac niciuna dintre ele să funcționeze încă, motiv pentru care am cerut sfatul aici. :)

japanworm japanworm
27 mai 2015 03:10:10

Sugerez să ceri o soluție bazată pe jQuery pe stackoverflow, deoarece acesta nu este un răspuns specific WordPress și mă îndoiesc că vei primi un răspuns aici. Totuși, aș mai încerca o dată pe Google cu această întrebare, deoarece este o funcționalitate foarte căutată, așa că ar trebui să existe multe fragmente de cod disponibile. =)

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

@ChristineCooper Am căutat peste tot pe Google și am încercat toate fragmentele de cod pe care le-am găsit. Nimic nu a funcționat. Mulțumesc, o voi face. :)

japanworm japanworm
27 mai 2015 11:00:07

Uneori lucrez cu transiente pentru numărul de partajări pe rețelele sociale, ceea ce înseamnă că valorile contorului se actualizează la un anumit interval de timp și nu la fiecare încărcare de pagină. Și, nu, nu poți doar să copiezi și să lipești codul în single.php, deoarece variabila nu ar fi în scope.

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

@ialocin Transients! Da! Va trebui să-mi actualizez propriul cod acum. OP, vezi: https://codex.wordpress.org/Transients_API

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

@ialocin Tocmai am dat peste un răspuns la asta folosind transients. Bună idee.

Christine Cooper Christine Cooper
27 mai 2015 19:18:30
Arată celelalte 6 comentarii
Toate răspunsurile la întrebare 1
16

Bine. @ialocin a menționat ceva despre Transients. Din motive ciudate, nu am dat până acum de acest concept. Anterior, afișam numărătoarea folosind:

  • jQuery (încărcare pe partea de client)
  • Cache-ul paginii (când stocam numărătoarea local)
  • Actualizare prin Cron a valorilor de numărătoare
  • Și recent, am stocat toate numărătorile în meta datele postării și am actualizat meta datele la fiecare 100 de încărcări ale paginii... destul de haotic.

Dar nu, există ceva mai bun. Mult mai bun. Transients. Transients. Transients... repetă-l ore întregi... După ce ai meditat și te-ai întors, aprofundează-te în următorul cod pe care l-am personalizat pentru tine:

// Verifică transientul. Dacă nu există, execută codul
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {

    /* acțiune */
    $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'] );
    };

    // stochează datele într-un array
    $data = array (
        $facebook_like_share_count,
        $twitter_tweet_count,
        $pinterest_pins,
        $google_plusones
    );

    // Salvează rezultatele într-un transient. Expiră după 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];

}

În primul rând, asigură-te că $post_id este deja setat înainte de a adăuga acest cod, deoarece folosește ID-ul pentru a adăuga un identificator unic transientului.

Stocăm datele în cache în baza de date temporar, dându-i un nume personalizat și un interval de timp după care vor expira și vor fi șterse.

Deci, la fiecare 6 ore, se actualizează array-ul din cache. Este atât de simplu. Consultă comentariile pentru clarificări.

EDIT:

Conform discuțiilor din firul de comentarii, am ajustat codul. În primul rând, asigură-te că ai funcțiile de partajare în fișierul tău functions.php (cred că deja ai asta în configurația ta curentă), apoi în fișierul tău single.php, adaugă următoarele acolo unde vrei să obții valorile de numărătoare.

// obține ID-ul postării
$post_id = get_the_ID();

// obține URL-ul permanent pentru a fi folosit în funcțiile de numărătoare a partajărilor
$url = get_permalink( $post_id );

// Verifică transientul. Dacă nu există, execută codul
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {

    /* acțiune */
    $facebook_like_share_count ("$url");
    $twitter_tweet_count ("$url");
    $pinterest_pins ("$url");
    $google_plusones ("$url");

    // stochează datele într-un array
    $data = array (
        $facebook_like_share_count,
        $twitter_tweet_count,
        $pinterest_pins,
        $google_plusones
    );

    // Salvează rezultatele într-un transient. Expiră după 6 ore
    set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS  );
}

if (is_array($data)) {

    // acestea sunt variabilele tale care conțin numărătoarea partajărilor
    $facebook_like_share_count = $data[0];
    $twitter_tweet_count = $data[1];
    $pinterest_pins = $data[2];
    $google_plusones = $data[3];

}

Te rog să citești comentariile pe care le-am adăugat în cod pentru clarificări.

27 mai 2015 19:18:10
Comentarii

Tocmai m-ai făcut să zâmbesc fericit văzând cât de fericit te fac transienții :)

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

Bună. Mulțumesc mult pentru munca ta depusă. Am încercat să introduc codul tău în fișierul function.php al temei mele, dar dacă fac asta, pagina mea nu se încarcă. Presupun că e o eroare de sintaxă? :(

japanworm japanworm
28 mai 2015 00:27:22

Ce? Nu, acest cod ar trebui să fie pus acolo de unde a fost luat inițial. Presupun că în single.php

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

@ChristineCooper Am avut codul pe care l-am postat inițial în întrebarea mea în fișierul function.php și apoi l-am afișat în single.php. Credeam că trebuie să fac același lucru cu fragmentul tău de cod?! ^^;

japanworm japanworm
28 mai 2015 11:52:38

Te rog să actualizezi întrebarea ta cu codul complet pe care îl folosești în fișierul functions.php și codul complet pe care îl folosești pentru a apela funcțiile în fișierul tău single.php sau loop-single.php. În acest fel, pot vedea exact ce se întâmplă și să ajustez codul pentru tine.

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

@ChristineCooper Mulțumesc. Am editat întrebarea mea. Spune-mi dacă ai nevoie și de fișierul meu function.php complet și îl voi încărca pe pastebin.

japanworm japanworm
28 mai 2015 18:51:03

file_get_contents() nu va funcționa cu URL-uri pe toate serverele. Folosește în schimb API-ul HTTP.

fuxia fuxia
30 mai 2015 06:48:14

@toscho Cum ar arăta acel cod?

japanworm japanworm
31 mai 2015 02:59:50

@japanworm Ceva de genul: $count = json_decode( wp_remote_retrieve_body( wp_safe_remote_get( 'http://graph.facebook.com/?id=' . $url ) ) );

fuxia fuxia
31 mai 2015 03:15:25

Vezi codul meu actualizat...

Christine Cooper Christine Cooper
1 iun. 2015 18:08:02

@ChristineCooper Am încercat din nou. Nu cred că ai modificat fragmentul de cod pe care ar trebui să-l introduc în functions.php. Trebuie să fie o eroare de sintaxă undeva. Cum sunt groaznic cu codul, nu reușesc să-mi dau seama singur. Poate că un fragment de cod în functions.php nu poate începe cu "if"?? Nu știu.. :(

japanworm japanworm
2 iun. 2015 19:21:51

Nu am schimbat codul din fișierul tău functions.php, acesta ar trebui să fie exact același cod pe care l-ai folosit anterior și care funcționa conform spuselor tale? Deci nu ar trebui să primești o eroare în fișierul functions.php dacă folosești exact același cod care funcționa.

Christine Cooper Christine Cooper
2 iun. 2015 19:23:18

@ChristineCooper Dacă folosesc codul postat în întrebarea mea, nu primesc această eroare. Dacă folosesc codul pe care l-ai postat în răspunsul tău, o primesc.

japanworm japanworm
2 iun. 2015 23:05:19

Ai introdus codul meu în fișierul tău single.php? De asemenea, te rog să lipescți eroarea în întregime ca un comentariu aici și să precizezi partea din cod la care se referă mesajul de eroare.

Christine Cooper Christine Cooper
3 iun. 2015 00:29:21

@ChristineCooper Nu există un mesaj de eroare. Blogul meu se oprește din încărcare imediat ce introduc codul în fișierul function.php, ceea ce de obicei indică o eroare de sintaxă.

japanworm japanworm
3 iun. 2015 01:12:22

@ChristineCooper Deci, presupun că ar trebui să renunț dacă codul nu funcționează în fișierul meu function.php din orice motiv? Mulțumesc. :)

japanworm japanworm
6 iun. 2015 15:09:41
Arată celelalte 11 comentarii