Listar los comentarios recientes de una red de sitios múltiples

2

Busco una consulta SQL personalizada que me permita extraer los últimos comentarios de una instalación de sitios múltiples de WP.

El resultado final será idéntico a un widget de comentarios recientes regulares, pero de todos los sitios dentro de la instalación.

Ideas?

Gracias

    
pregunta Pippin 15.01.2011 - 02:15

2 respuestas

4

Bien, hice una investigación basada en la solución de בניית אתרים aquí, ya que estoy interesado en esto. también.

Primero debe obtener una lista de ID de blog, y get_blog_list() está en desuso porque parece ser un " consulta de base de datos suicida " :) De todos modos, parece que habrá una alternativa en WP 3.2 llamada wp_get_sites () . Así que use esta función en su lugar. Le sugiero que pase el argumento 'sort_column => 'last_updated' , y 'limit' los resultados a 20 o algo así. Esto haría que la siguiente consulta sea mucho más rápida.

Entonces:

global $wpdb;
$number = 20; // maximum number of comments to display
$selects = array();
foreach (wp_get_sites() as $blog)
   // select only the fields you need here!
   $selects[] = "(SELECT comment_post_ID, comment_author, comment_author_email, comment_date_gmt, comment_content, post_title, {$blog['blog_id']} as blog_id FROM {$wpdb->base_prefix}{$blog['blog_id']}_comments
      LEFT JOIN {$wpdb->base_prefix}{$blog['blog_id']}_posts
      ON comment_post_id = id
      WHERE post_status = 'publish'
        AND post_password = ''
        AND comment_approved = '1'
        AND comment_type = ''
       ORDER BY comment_date_gmt DESC LIMIT {$number})"; // real number is (number * # of blogs)

  $comments = $wpdb->get_results(implode(" UNION ALL ", $selects)." ORDER BY comment_date_gmt DESC", OBJECT);

Luego renderiza la salida:

<ul>
<?php
$count = 0;
foreach((array)$comments as $comment):
  $count++;
  if($count == $number+1) break; 
  ?>
  <li>
   <?php echo get_avatar($comment->comment_author_email, 32); ?>
   <a href="<?php echo get_blog_permalink($comment->blog_id, $comment->comment_post_ID); ?>" title="commented on <?php echo strip_tags($comment->post_title); ?>">
   <?php echo $comment->comment_author; ?> wrote: 
   <?php echo convert_smilies(wp_trim_excerpt($comment->comment_content)); ?>
   (<?php echo human_time_diff(strtotime("{$comment->comment_date_gmt}")); ?>)  
   </a>
  </li>
<?php
endforeach;
?>
</ul>

También debes guardar en caché los resultados y vaciar la memoria caché como una vez cada 10 minutos aproximadamente.

    
respondido por el onetrickpony 15.01.2011 - 19:33
2

prueba esto:

$sqlstr = '';
$blog_list = get_blog_list( 0, 'all' );
$sqlstr = "SELECT 1 as blog_id, comment_date, comment_id, comment_post_id, comment_content, comment_date_gmt, comment_author, comment_author_email from ".$table_prefix ."comments where comment_approved = 1 ";
$uni = '';
foreach ($blog_list AS $blog) {
    $uni = ' union ';
    $sqlstr .= $uni . " SELECT ".$blog['blog_id']." as blog_id, comment_date, comment_id, comment_post_id, comment_content, comment_date_gmt, comment_author, comment_author_email   from ".$table_prefix .$blog['blog_id']."_comments where comment_approved = 1 ";                
}
$limit = ''; //set your limit
$limit = ' LIMIT 0, '. (int)$wgt_count;
$sqlstr .= " ORDER BY comment_date_gmt desc " . $limit; 
$comm_list = $wpdb->get_results($sqlstr, ARRAY_A);

y es posible que desee echar un vistazo al complemento de widgets multisitio de diamante witch ya implementa esto como un widget y como un código corto.

espera que esto ayude.

    
respondido por el Bainternet 15.01.2011 - 06:54

Lea otras preguntas en las etiquetas