últimas entradas de otro wordpress¿necesitas mostrar las últimas entradas de otro WordPress en un blog concreto?

¿Escribes en varios blog y necesitas reunir en un sólo archivo las últimas noticias de cada uno de ellos?

 

La librería RSS de WordPress

En el codex de WordPress nos encontramos la librería RSS que es la encargada de crear un archivo de texto enriquecido llamado feed y que contiene todo el contenido actualizado de tu blog.

Normalmente los feed son archivos de texto xml que tienen algunos blog y sitios de noticias, su ventaja es que permiten transportar contenidos de un sitio a otro sitio web, para entendernos puedes leer las últimas noticias de todos los blog, periódicos online… que te interesen desde una sola web. Estas web se llaman agregadores o lectores de feeds.

Nosotros vamos a aprovechar esta característica de WordPress para mostrar todas las últimas entradas de nuestro blog en otro blog.

¿Cómo crea los feeds WordPress?

WordPress utiliza un conjunto de plantillas para mostrar los feeds similares a las plantillas que utiliza dentro de tu tema para mostrar los contenidos de tu blog. Las distintas plantillas de feed están alojadas en la carpeta wp-includes puedes localizarlas y revisar su contenido si sientes curiosidad.

Te encontrarás con varios archivos con el siguiente nombre feed-{type}.php, por ejemplo: feed-rss.php,feed-rdf.php … cada uno dedicado a un formato rdf, rss, rss2 y atom. Cada uno dedicado a los distintos estándares.

Estos archivos se pueden modificar o customizar según tus necesidades, te dejo un enlace donde te explican como hacerlo. Pulsar para Customizar Feeds.

En qué archivo copiar el código

OPCIÓN A – Crear una nueva plantilla

 Si necesitas crear una nueva plantilla en tu tema, por ejemplo noticias.php para insertar el código que encontrarás a continuación puedes hacerlo de la siguiente forma:

Paso 1: localiza en wp-content/theme una plantilla de tu tema, puede servir page.php u otra similar, así podrás mantener la estructura del tema de tu blog. La abres y la renombras guardándola como noticias.php.

Paso 2: dentro de tu plantilla localiza el cuerpo de la página que es dónde copiarás y pegarás el siguiente código.

Paso 3: guarda la nueva plantilla, asigna un enlace o un menú.

Este artículo del blog te lo explica paso por paso.

OPCIÓN B – editar index.php o similar

Sobreescribir el index.php u otra plantilla del tema de tu wordpress:

Paso 1: abre el archivo que necesitas modificar y pega el código en el lugar donde quieras que aparezca.

Paso 2: guarda el archivo.

Código para mostrar las últimas entradas de otro WordPress

<main id="main" class="site-main" role="main">
<?php if(function_exists('fetch_feed')) {
	/**Creo una función*/
    include_once(ABSPATH . WPINC . '/feed.php');
    /**llamo al archivo feed que quiero utilizar*/               
    $feed = fetch_feed('http://blog.tuotroblog.com/feed/');
    /**Indicamos la url del blog donde están los contenidos que queremos traer*/
    $limit = $feed  ->get_item_quantity(4); 
    /**número de últimas entradas que queremos insertar*/
    $items = $feed  ->get_items(0, $limit);
    /**Array donde se guardan las últimas 4 noticias*/
}
    /**Fin de la función*/
 
?>

   <ul class="lasnoticias">
      <?php if ($limit != 0) foreach ($items as $item) : ?>
      /**Comprobamos que existen últimas noticias y recorremos el array*/
               <li class="li-noticias">
               <div class="fecha_info">
               <h3><?php echo $item -> get_date('d/m/Y'); ?></h3>
               /**Muestro la fecha en formato español*/
               <div class="masinfo">
              /**botón más info que enlaza a la noticia completa*/
<a href="<?php echo $item ->get_permalink(); ?>" title="<?php echo $item -> get_title(); ?>" >+info</a></div>
 </div>
 <div class="feed_de_noticias" >
 
 <?php $content = $item->get_content();

/**guardo el contenido de la noticia en una variable*/
 $postOutput = strip_tags($content, '<p>');?>

/**limpio la variable de etiquetas p*/
<p><?php echo substr($postOutput,0,strrpos(substr($postOutput,0,460)," ")); ?> ...</p>

/**Muestro un resumen de 460 caracteres, OJO más adelante explico esto*/
 <div class="masinfo">
<a href="<?php echo $item ->get_permalink(); ?>" title="<?php echo $item -> get_title(); ?>"> >> Leer noticia</a></div>

/**añado botón de leer noticia con enlace*/
</div>
 <div class="imagen_noticias">
 <?php $postOutput = preg_match_all('/<img[^>]+./i', $content,$matches);
 $postOutput =preg_replace("/img class\=\".+?\"/", 'img class=" "', $matches[0][0]);
 $matches="";
 echo $postOutput;
 ?>
 /**adjunto la imagen a la noticia*/
 </div>
 </li>
 <div class="limpiar"></div>
 <?php endforeach; ?>
 </ul>

OJO más adelante te explico esto

He utilizado la función de php strip_tags para eliminar las etiquetas <p>. Por otro lado el blog no admite la función the_excerpt() o resúmenes, lo lógico es que la mayoría de blogs la tienen implementada y no necesitas montar este jaleo con la función substring. Este código es para que te oriente y veas el partido que le puedes sacar.

Una función más sencilla la encuentras en la página oficial de wordpress, aquí te dejo el código.

<h2><?php _e( 'últimos post de otro blog:', 'my-text-domain' ); ?></h2>

<?php // Get RSS Feed(s)
include_once( ABSPATH . WPINC . '/feed.php' );

// llamo al feed de la url a importar
$rss = fetch_feed( 'http://example.com/rss/feed/goes/here' );

$maxitems = 0;

if ( ! is_wp_error( $rss ) ) : // Comprueba si el objeto se ha creado correctamente

    // Cantidad de items a mostrar 5. 
    $maxitems = $rss->get_item_quantity( 5 ); 

    // Array con los items donde 0 es el primer elemento.
    $rss_items = $rss->get_items( 0, $maxitems );

endif;
?>

<ul>
    <?php if ( $maxitems == 0 ) : ?>
        <li><?php _e( 'No hay items', 'my-text-domain' ); ?></li>
    <?php else : ?>
        <?php //recorro el bucle y muestro por cada entrada el título con link ?>
        <?php foreach ( $rss_items as $item ) : ?>
            <li>
                <a href="<?php echo esc_url( $item->get_permalink() ); ?>"
                    title="<?php printf( __( 'Posted %s', 'my-text-domain' ), $item->get_date('j F Y | g:i a') ); ?>">
                    <?php echo esc_html( $item->get_title() ); ?>
                </a>
            </li>
        <?php endforeach; ?>
    <?php endif; ?>
</ul>

Por último puedes trabajar con el archivo css para dar estilo a las noticias, este es el resultado:

ultimasentradas

y el enlace al codex de wordpress donde encontrarás toda la información. 

Mostrar sólo noticias de una categoría concreta

si lo que necesitas es agrupar o mostrar las últimas entradas de una categoría concreta, entonces modifica la línea:

$feed = fetch_feed('http://blog.tuotroblog.com/feed/');

por la siguiente:

$feed = fetch_feed('http://blog.tuotroblog.com/fcategory/la-categoria-que-quieres/feed/);

Mostrar imágenes en el fedd RSS

Para mostrar la imagen destacada debes añadir dentro del foreach, por ejemplo debajo de la fecha o título lo siguiente:
$item->get_thumbnail();
Recuerda que para poder mostrar la imagen destacada de cada entrada ésta debe estar disponible en el feed RSS. Si no es así primero tendrás que añadir la imagen al feed RSS. 

Para lograrlo necesitas tener acceso a los archivos del WordPress origen. 

Vamos a ver dos ejemplos, el primero es muy sencillo, añadimos una función dentro del archivo functions.php que modificará el feed para añadir la imagen destacada del post:

function rss_post_thumbnail($content) {
global $post;
if(has_post_thumbnail($post->ID)) {
$content = '<p>' . get_the_post_thumbnail($post->ID) .
'</p>' . get_the_content();
}
return $content;
}
add_filter('the_excerpt_rss', 'rss_post_thumbnail');
add_filter('the_content_feed', 'rss_post_thumbnail');

Para que está función resulte el tema que utilizas en WordPress tiene que tener activada la función: “post_thumbnails” y además cada artículo debe tener la imagen destacada insertada. En caso contrario el feed RSS dejará de funcionar.

La siguiente solución es añadir una función al archivo functions.php que será la encargada de buscar para cada entrada la imagen destacada, si el artículo no tiene imagen destacada entonces nos mostrará la primera imagen que encuentre dentro del contenido.

function add_excerpt_rss_thumbs($content) {
    global $post;
    $args = array(
        'post_type'      => 'attachment', //trabajamos con los adjuntos
        'post_mime_type' => 'image', // Del tipo "imagen"
        'order'          => 'ASC', // Los ordenamos ascendentemente
        'orderby'        => 'menu_order', // Que respete el orden asignado
        'post_parent'    => $post->ID // De la entrada actual
    );
    $images = get_posts($args);
    // primero buscamos la imagen destacada
    if ( has_post_thumbnail($post->ID) ) {
        $content = '<div class="derecha">' . get_the_post_thumbnail($post->ID, 'thumbnail') . '</div>' . $content;
 
    // si la entrada no tiene imagen destacada que muestre
    // la primera que encuentre dentro del post.
    } elseif ( $images ) {
        $post_link = get_permalink();
        $content = '<a href="' . $post_link . '">' . wp_get_attachment_image($images[0]->ID, 'thumbnail') . '</a>' . $content;
    }
 
    return $content;
}
 
add_filter('the_excerpt_rss', 'add_excerpt_rss_thumbs');
//utilizamos el filtro the_excerpt_rss para añadir funcionalidad al resumen del feed