Entradas recientes de toda la red en WordPress multisitio

Si has creado una red con WordPress y los sitios de la misma comparten temática, o simplemente quieres dar reflejo de la actividad de la red en todos los sitios, puedes crear una lista de las entradas más recientes de todos los sitios de la red.

Eso si, no hay una función interna en WordPress para hacerlo pero puedes ayudarte de la clase $wpdb database. Con ella puedes crear una petición a la base de datos de las últimas entradas de toda tu red.

Pero hay un pero, y es que esta petición SQL es bastante grande, para controlar este comportamiento usaremos la API Transients, de manera parecida a como se usa en la función wp_list_sites().

Lo primero que tenemos que hacer es añadir la función wp_recent_across_network() al archivo functions.php de tu tema activo. Lo haremos así:

/**
 * Lista de entradas recientes en toda la red Multisitio
 *
 * @uses get_blog_list(), get_blog_permalink()
 *
 * @param int $size El número de resultados a obtener
 * @param int $expires Segundos hasta que expire la cache transient
 * @return object Contiene el blog_id, post_id, post_date y post_title
 */
function wp_recent_across_network( $size = 10, $expires = 7200 ) {
   if( !is_multisite() ) return false;

   // Se cachean los resultados con la API Transients de WordPress
   // Obtenemos una copia existente de nuestros datos transient
   if ( ( $recent_across_network = get_site_transient( 'recent_across_network' ) ) === false ) {

      // Si no hay transient regeneramos los datos y guardamos una nueva transient
      // Preparamos la query SQL con $wpdb
      global $wpdb;

      $base_prefix = $wpdb->get_blog_prefix(0);
      $base_prefix = str_replace( '1_', '' , $base_prefix );

      // A causa de que la función get_blog_list() está actualmente abandonada
      // debido al alto consumo de recursos usaremos
      // $wpdb para ejecutar nuestra query SQL. Como la query puede
      // consumir mucha memoria almacenaremos los resultados usando la API Transients
      if ( false === ( $site_list = get_site_transient( 'multisite_site_list' ) ) ) {
         global $wpdb;
         $site_list = $wpdb->get_results( $wpdb->prepare('SELECT * FROM wp_blogs ORDER BY blog_id') );
         set_site_transient( 'multisite_site_list', $site_list, $expires );
      }
      $limit = absint($size);
      // Unificamos los resultados de wp_posts en todos los sitios del Multisitio en un solo resultado con MySQL "UNION"
      foreach ( $site_list as $site ) {
         if( $site == $site_list[0] ) {
            $posts_table = $base_prefix . "posts";
         } else {
            $posts_table = $base_prefix . $site->blog_id . "_posts";
         }

         $posts_table = esc_sql( $posts_table );
         $blogs_table = esc_sql( $base_prefix . 'blogs' );

         $query .= "(SELECT $posts_table.ID, $posts_table.post_title, $posts_table.post_date, $blogs_table.blog_id FROM $posts_table, $blogs_table\n";
         $query .= "\tWHERE $posts_table.post_type = 'post'\n";
         $query .= "\tAND $posts_table.post_status = 'publish'\n";
         $query .= "\tAND $blogs_table.blog_id = {$site->blog_id})\n";

         if( $site !== end($site_list) )
            $query .= "UNION\n";
         else
            $query .= "ORDER BY post_date DESC LIMIT 0, $limit";
      }

      // Un poco de limpieza y ejecutamos la query
      $query = $wpdb->prepare($query);
      $recent_across_network = $wpdb->get_results( $query );

      // Ajustamos la cache Transients para que espire cada dos horas
      set_site_transient( 'recent_across_network', $recent_across_network, 60*60*2 );
   }
   // Damos formato a la salida HTML
   $html = '
    '; foreach ( $recent_across_network as $post ) { $html .= '
    ' . $post->post_title . '
    '; } $html .= '
';
   return $html;
}

El uso de esta función en tu tema es bien sencillo. Eso si, asegúrate de comprobar el valor return en la salida HTML para evitar conflictos con instalaciones que no sean multisitio.

Ya solo nos queda añadir el código que recupere los datos de la función en nuestro tema, algo así:

<?php
// Mostramos las entradas recientes de toda la red
$recent_network_posts = wp_recent_across_network();
if( $recent_network_posts ):
?>
<?php echo $recent_network_posts; ?>
<?php endif; ?>

Fuente: Smashing magazine

VALORA Y COMPARTE ESTE ARTÍCULO PARA MEJORAR LA CALIDAD DEL BLOG…
(5 votos, promedio: 4.4)

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

AVISO: Esta publicación es de hace 3 años o más. Si es un código o un plugin podría no funcionar en las últimas versiones de WordPress, y si es una noticia podría estar ya obsoleta. Luego no digas que no te hemos avisado.

3 comentarios en “Entradas recientes de toda la red en WordPress multisitio”

  1. Este método me da un error, y por lo que leo en @smashingmag:twitter no soy el único…

    HE leído la función a ver si mi precario conocimiento de PHP/MySQL da con algo, pero nada.

    Me da un error 500 en Chrome y blank screen en FF.

    =(

  2. Talves no habria alguna manera de TRAER los ULTIMO Post de cada BLOG Individualmente para poder organizarlos  en el BLOG PRINCIPAL.
    xD

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

Ir arriba Ir al contenido