Obține numărul total de partajări pe rețelele sociale (Facebook, Twitter, Google+, Pinterest)
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!

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.

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

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

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

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

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.

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

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

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

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

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.

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

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.

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