Obtener el recuento total de comparticiones sociales (Facebook, Twitter, Google+, Pinterest)
Estoy obteniendo los recuentos individuales de comparticiones para las redes sociales mencionadas usando el siguiente fragmento de código en el functions.php de mi tema:
$facebook_like_share_count = function ( $url ) {
// Obtener recuento de compartir de Facebook
$api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );
$count = json_decode( $api );
return $count->shares;
};
$twitter_tweet_count = function ( $url ) {
// Obtener recuento de tweets
$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 ) {
// Obtener recuento de pins
$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 ) {
// Obtener recuento de +1s de Google
$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'] );
};
Los llamo en mi single.php con el siguiente código:
<?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");?>
Esto funciona bien.
Ahora, estoy tratando de encontrar un fragmento de código que sume los recuentos de compartición de esos 4 servicios y muestre el total - probablemente algo similar a esto.
EDITAR: Tengo una pregunta importante.
¿Es posible que el código anterior esté ralentizando mi blog?
Ya contacté con mi servicio de hosting y me dijeron que debe ser algo como un plugin o archivos php. No he actualizado ningún plugin recientemente y P3 Profiler solo me muestra los sospechosos habituales. Pero noté que justo después de llamar a esa función en mi single.php, mi servidor a veces carga muy lento - incluso obtiene tiempos de espera en sitios de prueba de velocidad. ¿Alguna idea?
EDIT2: Después de muchas pruebas parece que realmente es este código (cuando se muestra) lo que ralentiza la página. encogerse de hombros ¿Supongo que tendré que dejar de usarlo?
No he podido hacer que funcione todavía. Espero que puedan ayudarme aquí. ¡Muchas gracias!

Vale. @ialocin hizo una nota sobre Transients. Por alguna extraña razón, aún no me había topado con esto. Anteriormente, solía mostrar los conteos mediante:
- jQuery (carga del lado del cliente)
- Caché de página (cuando almacenaba los conteos localmente)
- Actualización de valores de conteo con Cron
- Y más recientemente, almacenaba todos los conteos en post meta y actualizaba el meta cada 100 cargas de la página... bastante salvaje.
Pero no, hay algo mejor. Mucho mejor. Transients. Transients. Transients... repítelo por horas... Una vez que hayas meditado y regresado, sumérgete en el siguiente código que personalicé para ti:
// Verificar si existe el transient. Si no, ejecutar el código
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {
/* acción */
$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'] );
};
// almacenar datos en un array
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Guardar los resultados en un transient. Expira después de 6 horas
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];
}
Primero, asegúrate de que $post_id
ya esté definido antes de agregar este código, ya que usa el ID para agregar un identificador único al transient.
Estamos almacenando datos en caché en la base de datos temporalmente asignándole un nombre personalizado y un período de tiempo después del cual expirará y será eliminado.
Así que, cada 6 horas, actualiza el array en caché. Es tan simple como eso. Mira los comentarios para aclaraciones.
EDITAR:
Según las discusiones en el hilo de comentarios, he ajustado el código. Primero, asegúrate de tener las funciones de compartir dentro de tu archivo functions.php
(creo que ya tienes esto en tu configuración actual), luego en tu archivo single.php
, agrega lo siguiente donde quieras obtener
los valores de conteo.
// obtener el ID del post
$post_id = get_the_ID();
// obtener la URL permanente para usar en las funciones de conteo de compartidos
$url = get_permalink( $post_id );
// Verificar si existe el transient. Si no, ejecutar el código
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {
/* acción */
$facebook_like_share_count ("$url");
$twitter_tweet_count ("$url");
$pinterest_pins ("$url");
$google_plusones ("$url");
// almacenar datos en un array
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Guardar los resultados en un transient. Expira después de 6 horas
set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS );
}
if (is_array($data)) {
// estas son tus variables que contienen el conteo de compartidos
$facebook_like_share_count = $data[0];
$twitter_tweet_count = $data[1];
$pinterest_pins = $data[2];
$google_plusones = $data[3];
}
Por favor, lee los comentarios que puse dentro del código para aclaraciones.

Me hiciste sonreír felizmente con lo feliz que te ponen los transients :)

Hola. Muchas gracias por tu arduo trabajo. Intenté colocar tu código en el function.php de mi tema, pero si lo hago mi página no carga. ¿Supongo que hay un error de sintaxis? :(

¿Qué? No, este código debería ir en el lugar de donde fue tomado originalmente. Supongo que en single.php

@ChristineCooper Yo tenía el código que publiqué originalmente en mi pregunta en mi function.php y luego lo mostré en single.php. ¡¿Pensé que se suponía que debía hacer lo mismo con tu fragmento de código?! ^^;

Por favor, actualiza tu pregunta con el código completo que usas en tu archivo functions.php y el código completo que usas para llamar a tus funciones en tu archivo single.php o loop-single.php. De esta manera, podré ver realmente lo que está pasando y ajustar el código para ti.

@ChristineCooper Gracias. Edité mi pregunta. Avísame si también necesitas ver mi function.php completo y lo subiré a pastebin.

file_get_contents()
no funcionará con URLs en todos los servidores. Utiliza la API HTTP en su lugar.

@japanworm Algo así: $count = json_decode( wp_remote_retrieve_body( wp_safe_remote_get( 'http://graph.facebook.com/?id=' . $url ) ) );

@ChristineCooper Lo intenté de nuevo. No creo que hayas cambiado el fragmento de código que se supone que debo poner en mi function.php. Debe haber un error de sintaxis en algún lugar. Como soy horrible con el código, no puedo averiguarlo por mí mismo. ¿Tal vez un fragmento de código en el function.php no puede comenzar con "if"?? No lo sé.. :(

No cambié el código en tu archivo functions.php, ese debería ser exactamente el mismo código que usaste anteriormente que sí estaba funcionando según tú? Entonces no deberías obtener un error en tu archivo functions.php si estás usando exactamente el mismo código que funcionaba.

@ChristineCooper Si uso el código publicado en mi pregunta, no obtengo este error. Si uso el código que publicaste en tu respuesta, sí lo obtengo.

¿Colocaste mi código en tu archivo single.php? Además, por favor pega el error completo como un comentario aquí y señala la parte del código a la que hace referencia el mensaje de error.

@ChristineCooper No hay un mensaje de error. Mi blog deja de cargar tan pronto como coloco el código en el archivo functions.php, lo que usualmente indica un error de sintaxis.
