Cómo obtener los artículos recientes de una red de blogs en WordPress

Email this to someoneShare on FacebookShare on Google+Share on LinkedInTweet about this on Twitter

Si hemos creado toda una red de blogs con WordPress nos puede ser de utilidad el siguiente manual para crear un nuevo sitio donde se reúnan todos los artículos más recientes que se publican en dicha red de blogs. Por desgracia aún no existe una función interna en WordPress con la que poder llevarlo a cabo. Para solucionar esto existe la clase $wpdb database con la que podemos crear una petición a nuestra base de datos de las últimas entradas de toda la red de blogs.

Al ser una petición SQL bastante grande, debemos utilizar la API Transients, de forma similar a como la utilizamos en la función wp_list_sites().

Estos son los pasos para obtener los artículos recientes de nuestra red de blogs:

Añadir la función wp_recent_across_network() al archivo functions.php de nuestro theme.

    /**
     * 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 .
    '<a target="_blank" title="blogs"
    href="%20http://semanticae.es">blogs</a>' );
    
             $query .= "(SELECT $posts_table.ID,
    $posts_table.post_title, $posts_table.post_date, $blogs_table.blog_id FROM
    $posts_table, $blogs_tablen";
             $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 .= "UNIONn";
             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;
    }

    Nos aseguramos de comprobar el valor return en la salida HTML para evitar conflictos con instalaciones que no sean multisitio.

    Por último, añadimos el siguiente código con el que recuperar los datos de la función en nuestro site:

    <?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; ?>
    

    Sé la primera persona en comentar

    Deja un comentario

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

    De conformidad con lo establecido en la LOPD, Adpv Advertising Provider S.L. garantiza la adopción de las medidas necesarias para asegurar el tratamiento confidencial de los datos de carácter personal. Así mismo le informamos de la inclusión de sus datos en un fichero con la finalidad de mantener su relación negocial o contractual con Adpv Advertising Provider S.L. y de la posibilidad de ejercer los derechos de acceso, rectificación, cancelación y oposición en la siguiente dirección: Ercilla, 26, 1Dcha., 48011, Bilbao, Bizkaia. Privacidad.