Contenido

getCommentsFromPingbacks(), trae los comentarios de tus pingbacks

28 abr

+ 7

La proliferación de blogs ha hecho que le contenido esté muy distribuido por Internet y de un artículo pueden llegar a salir miles de links (pingbacks) en los que puede haber debate sobre el mismo contenido inicial.

Imagina que pueda estar vinculado con todos los blogs (WordPress) que han hecho un ping a tus artículo, y que en tu blog puedas mostrar los comentarios de estos blogs (siempre y cuando estos lo permitan).

getCommentsFromPingbacks() es una función que he montado que permite mostrar de los pingbacks encontrados por cada post, un listado de comentarios sobre esa anotación en cada uno de los anteriores pingbacks.

El código

<?php
include_once(ABSPATH . WPINC . '/rss.php');
function getCommentsFromPingbacks($postID = 0, $limit = 5, $propios = false){
  global $wpdb;
  // Obtenemos la dirección de nuestro blog
  $localhost = '';
  if ($propios)
  	$localhost = "AND comment_author_url NOT LIKE '".get_option("siteurl")."%";

  // Lanzamos petición
  $urls = $wpdb->get_results("SELECT comment_author, comment_author_url FROM $wpdb->comments WHERE comment_post_ID = ".intval($postID)."  $localhost AND comment_type = 'pingback' AND comment_agent LIKE '%WordPress%' LIMIT ".intval($limit));

  // Sinó hay pingbacks, salimos
	if (!$urls) return;

	// Recorremos los pingbacks
	foreach($urls as $url) {
		// Parátro RSS de comentarios
		if (strpos($url->comment_author_url,'?') === false) $actual = $url->comment_author_url.'?feed=comments-rss2';
		else $actual = $url->comment_author_url.'&feed=comments-rss2';

   // Leemos comentarios
    $rss = fetch_rss($actual);

    // Si no hay $rss o items seguimos con el siguiente.
    if (!$rss || !$rss->items) continue; 

	$items = array_reverse($rss->items);

	echo '<h3>'.$url->comment_author.'</h3><ul class="external_comments">';
	for($id = count($items); $id>0; $id--){
        $item = false;
        // Datos basicos
        $item->comment_author = $items[$id]['dc']['creator'];
        $item->comment_author_url = $items[$id]['link'];
        $item->comment_date = $items[$id]['pubdate'];
        $item->comment_content = $items[$id]['content']['encoded'];

        // comment_ID
        $item->comment_ID = 'external-'.$id;
        $item->comment_type = 'external';

	// Pintamos el comentario
        createComments($item);
    }
    echo '</ul>';
  }
}
/*
   Pintamos el comentario
*/
function createComments($com) {
	echo '<li>
		<h4>'.$com->comment_author.'</h4>
		<small>'.$com->comment_date.'</small>
		<div class="comment_content">
			'.$com->comment_content.'
		</div>
	</li>';
}

// Solicitamos los comentarios del post
getCommentsFromPingbacks($post->ID);
?>

El código, se encarga de buscar pingbacks en el post indicado como parámetro. Además podemos indicar un límite de sitios que comprobar, por defecto le he puesto 5 (hay que tener en cuenta el tiempo de carga de la página) y despues como tercer parámetro podemos indicar si queremos que aparezcan los comentarios enlazados de nuestro propio blog.

Una vez localizadas las url’s de los pingbacks, procedemos a solicitar los comentarios, para ello usamos el parámetro de WordPress feed=comments_rss2, que nos devolverá un RSS con los comentarios del post. Esto implica una limitación de tamaño (sinó recuerdo mal, no he podido probarlo) y que el blog externo debe tenerlo activo. Mediante el uso de fetch_rss() podremos realizar la petición y además recibir el comentario como un objeto fácil de iterar y procesar.

El código está pensado para usarse en el sistema de comentarios de WordPress 2.7, creando un comentario virtual con los datos necesarios para que el callback de wp_lists_comments() pueda procesarlo como un comentario.

Por defecto, indicará el atributo class de cada comentario, como “external”, esto es debido al comment_type que lo informamos en la función.

Para el ejemplo, he montado createComments() que recibe un parémtro $com, que es el comentario con los datos necesarios.

¿Donde iría este código?

Pues este código solo necesita que se cumpla una premisa y es que el ID del comentario esté informado. Realmente puede ir cualquier parte de WordPress siempre y cuando se pase el ID de un artículo de nuestro WordPress. Si usamos el ejemplo tal cual, debería estar dentro del Loop y más concretamente en el fichero comments.php de nuestro theme, pero lo mejor es ir probando y ubicarlo en el sitio que creamos más acertado.

¿Que os parece?

Opiniones, impresiones, se agredecen.

  • Y yo, que ni siquiera se instalar bien PHP+Apache… :(
    ¡Qué grande eres, Andrés!

  • Muchas gracias, de mucha utilidad

  • Muy bueno y creo que a todos nos servira …

    Saludos y gracias

  • Es genial Andrés.

    Los comentarios son la interactividad, el feedback de un blog. Si un blogger, i.e. tu blog, logra que sus usuarios comenten con asiduidad generamos un contenido alrededor de nuestro trabajo que enriquece enormemente el artículo.

    Además del nuevo sistema de WP 2.7, muchos añaden sistemas que faciliten, mejoren y expandan la sección de comentarios. (Facebook Connect, Google Friend Conncet, Disqus o Twitter Connect).

    Cuento toda esta perorata que no es nueva para decir que tu idea es una propuesta más en la que pensar, con la diferencia y ventaja que tu sistema NO depende de un servicio externo.

    Seguro que hay artículos y blogs que lo implementan, es como poner todos los comentarios hechos en twitter, o los de meneame, es traer la discusión a tu sitio,

    Sólo dos posibles pegas, como bien dices todo esto repercutirá en la carga de tu página y por otro lado NO podrás moderar esos comentarios aunque sí confiar en que los blogs permitidos los moderan (o no) a tu gusto.

    Saludos

  • @Cristian Eslava: Gracias por comentar.
    El tema de la carga, es un problema, aunque por defecto al usar fetch_rss() tenemos 1 hora de caché, podríamos ampliar haciendo que MAGPIE_CACHE_ON sea mayor.

    La moderación… podríamos hacer que pasara por akismet, no he probado este código.

    
    function akismet_external_comment($comment){
    	global $akismet_api_host, $akismet_api_port;
    	
    	$comment['user_ip']    = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] );
    	$comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
    	$comment['referrer']   = $_SERVER['HTTP_REFERER'];
    	$comment['blog']       = get_option('home');
    
    	$ignore = array( 'HTTP_COOKIE' );
    
    	foreach ( $_SERVER as $key => $value )
    		if ( !in_array( $key, $ignore ) )
    			$comment["$key"] = $value;
    
    	$query_string = '';
    	foreach ( $comment as $key => $data )
    		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
    
    	$response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
    	return ( 'true' == $response[1] );
    }
    

    En teoría, al pasarle $comment obtendremos true en caso de ser SPAM y false cuando no lo sea.

  • escelente articulo, gracias por la info

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.