Obtener el recuento total de comparticiones sociales (Facebook, Twitter, Google+, Pinterest)

24 may 2015, 21:10:11
Vistas: 16.3K
Votos: 2

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!

11
Comentarios

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

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

@ialocin ¿Puedo simplemente copiar y pegar eso en mi function.php tal cual y mostrarlo en mi single.php? Gracias. :)

japanworm japanworm
27 may 2015 00:15:24

La razón por la que está ralentizando tu página es porque estás solicitando datos de 4 sitios diferentes. Todos esos necesitan cargarse antes de que tu script continúe procesando. Esto es malo. Añade un cron que haga esto por ti, o guarda la página en caché. No cargues esto en cada visita a la página.

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

@ChristineCooper ¿Qué es un cron? Lo siento, como dije, no soy muy buena con códigos. Pensé que la página estaba en caché ya que estoy usando el plugin W3 Total Cache.

japanworm japanworm
27 may 2015 03:01:53

Mira "WP Cron", se ejecuta en intervalos establecidos. Creas una función que verifica los recuentos de compartidos, los almacena mediante update_post_meta() y usas este valor para mostrar el recuento localmente en lugar de solicitar archivos externos en cada carga de página. Aunque no estoy seguro si este es el enfoque que deberías tomar. Personalmente, haría todo esto mediante jQuery, de esta manera, dejas que toda la acción ocurra en el lado del cliente, que es donde debería estar con este tipo de cosas.

Christine Cooper Christine Cooper
27 may 2015 03:07:03

@ChristineCooper He visto enfoques con jQuery. Desafortunadamente no he logrado que ninguno funcione todavía, por eso estaba pidiendo consejos aquí. :)

japanworm japanworm
27 may 2015 03:10:10

Sugiero que pidas una solución con jQuery en Stackoverflow en lugar de aquí, ya que esto no es una respuesta específica de WordPress y dudo que recibas una respuesta acá. Aún así, te recomendaría que le des otra oportunidad buscando en Google, porque es una característica muy solicitada, así que debería haber mucho código disponible. =)

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

@ChristineCooper Busqué como loco en Google y probé todos los fragmentos de código que encontré. Nada funcionó. Gracias, lo haré. :)

japanworm japanworm
27 may 2015 11:00:07

A veces trabajo con transients para los recuentos de compartir en redes sociales, lo que significa que los valores de recuento se actualizan en un intervalo de tiempo determinado y no en cada carga de página. Y no, no puedes simplemente copiar y pegarlo y usarlo en tu single.php, porque la variable no estaría en el alcance.

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

@ialocin ¡Transients! ¡Sí! Ahora necesitaré actualizar mi propio código. OP, mira: https://codex.wordpress.org/Transients_API

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

@ialocin Acabo de publicar una respuesta a esto usando transients. Buen aporte.

Christine Cooper Christine Cooper
27 may 2015 19:18:30
Mostrar los 6 comentarios restantes
Todas las respuestas a la pregunta 1
16

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.

27 may 2015 19:18:10
Comentarios

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

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

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

japanworm japanworm
28 may 2015 00:27:22

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

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

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

japanworm japanworm
28 may 2015 11:52:38

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.

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

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

japanworm japanworm
28 may 2015 18:51:03

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

fuxia fuxia
30 may 2015 06:48:14

@toscho ¿Cómo se vería ese código?

japanworm japanworm
31 may 2015 02:59:50

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

fuxia fuxia
31 may 2015 03:15:25

Mira mi código actualizado...

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

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

japanworm japanworm
2 jun 2015 19:21:51

No cambié el código en tu archivo functions.php, ese debería ser exactamente el mismo código que usaste anteriormente que 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.

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

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

japanworm japanworm
2 jun 2015 23:05:19

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

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

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

japanworm japanworm
3 jun 2015 01:12:22

@ChristineCooper Entonces, ¿supongo que simplemente debería rendirme si el código no funciona en mi function.php por alguna razón? Gracias. :)

japanworm japanworm
6 jun 2015 15:09:41
Mostrar los 11 comentarios restantes