Creación de fuentes RSS personalizadas en WordPress – La manera correcta

Hay un montón de tutoriales flotando por Internet que describen cómo crear un feed RSS personalizado en WordPress. La mayoría de ellos te hacen crear una nueva plantilla de página, copiando el código que WordPress utiliza para generar fuentes en la plantilla de página, y añadiendo y modificando el código allí.

Además de todo el código RSS duplicado en la plantilla, y la carga de mantenimiento que crea, la mayoría de estos tutoriales muestran prácticas de codificación pobres, vulnerabilidades de seguridad, y no hacen uso de la funcionalidad básica de WordPress. Habiendo estado frustrado con todos los malos tutoriales que hay, decidí hacer algo al respecto y escribir mi propio tutorial mostrando cómo crear un feed RSS personalizado en WordPress de la manera correcta.

Si sólo quieres ver el código, dirígete al repositorio de ejemplo de este post en GitHub. De lo contrario, sigue leyendo.

Inicio

Voy a construir esta funcionalidad como un plugin. La mayoría de los tutoriales te hacen construir esto directamente en tu tema, pero casi siempre deberías estar construyendo cosas como esta en un plugin personalizado para que puedas cambiar de tema en cualquier momento sin perder toda tu funcionalidad personalizada.

Crea un nuevo archivo custom-rss-feed-example.php en el directorio de plugins y añade la cabecera del plugin.

<?php
/**
 * Plugin Name: Ejemplo Feed RSS personalizado
 * Plugin URI:  https://philipnewcomer.net/2016/08/creating-custom-feeds-wordpress-right-way/
 * Description: un plugin de ejemplo para demostrar la forma correcta de implementar fuentes RSS personalizadas o feeds personalizados en WordPress.
 * Version:     1.0
 * Author:      Philip Newcomer
 * Author URI:  https://philipnewcomer.net
 * License:     GPL-2.0+
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 */

namespace PhilipNewcomer\CustomRSSFeedExample;Lenguaje del código: HTML, XML (xml)

Usted notará en este tutorial que estoy usando namespaces de PHP, los cuales pueden ser desconocidos para usted. Los namespaces reemplazan la necesidad de prefijos en los nombres de sus funciones, y son mejores que los prefijos por varias razones. Sin embargo, pocos desarrolladores de WordPress están familiarizados con los namespaces, a pesar de que han estado disponibles desde PHP 5.3. Parte de la razón puede ser que el núcleo de WordPress todavía soporta PHP 5.2, por lo que no puede usar namespaces hasta que supere su versión mínima soportada por PHP a por lo menos 5.3. Sin embargo, la mayoría de la gente (y los hospedajes web) están usando ahora una versión de PHP que soporta namespaces, por lo que debería estar bien usarlos en su propio código.

Registrar el Nuevo Feed de WordPress

Mi plugin de ejemplo creará un nuevo feed idéntico al feed por defecto, sin embargo con la imagen destacada del post incluida. Sin embargo, este ejemplo bastante trivial puede ser reutilizado para hacer casi cualquier cosa para la que necesites un feed personalizado.

Ahora, vamos a registrar un nuevo feed, llamando a add_feed() en el gancho de acción init.

/**
 * Registra nuestro feed personalizado
 */
function register() {
   add_feed( 'rss2-with-featured-images', __NAMESPACE__ . '\generate_content' );
}
add_action( 'init', __NAMESPACE__ . '\register' );Lenguaje del código: PHP (php)

La funcion add_feed() registrará un nuevo feed.

El primer parámetro es el nombre del feed, que es también el punto final de la URL en la que el feed será accesible. Como he utilizado rss2-with-featured-images como nombre del feed, nuestro nuevo feed será accesible en http://domain.com/feed/rss2-with-featured-images/.

El segundo parámetro es el nombre de una función que generará el marcado para el nuevo avance. Veremos esa función en la siguiente sección.

Generar el Contenido del Feed Personalizado

Ahora que nuestro nuevo feed está registrado, sólo tenemos que escribir una función para generar el contenido del feed. En lugar de construir un feed completo desde cero, utilizaremos el código RSS2 de WordPress existente para hacer el trabajo pesado por nosotros.

El código que WordPress utiliza para generar un feed RSS2 se encuentra en feed-rss2.php en el directorio de inclusión de WordPress (normalmente /wp-includes). Aunque podríamos simplemente copiar el contenido de ese archivo en nuestro plugin y modificarlo para adaptarlo, eso requeriría que mantuviéramos todo ese código en el futuro. En su lugar, simplemente incluiremos el archivo en nuestra función desde el directorio de inclusión de WordPress.

/**
 * Genera el contenido del feed personalizado
 */
function generate_content() {
   if ( file_exists( ABSPATH . WPINC . '/feed-rss2.php' ) ) {
      require( ABSPATH . WPINC . '/feed-rss2.php' );
   }
}Lenguaje del código: PHP (php)

Si incluye un archivo de fuera de su plugin o tema, ¡siempre compruebe primero que existe!

Aunque todavía no hemos añadido imágenes destacadas al feed, lo creas o no, ahora tenemos un completo y completamente funcional feed RSS personalizado además de nuestro feed regular. Eso fue mucho más limpio que copiar todo el archivo feed-rss2.php en su plugin o tema sólo para crear un nuevo feed, ¿no?

Adelante, activa el plugin y pruébalo. (Añadiremos las imágenes destacadas en la siguiente sección.) Ten en cuenta que después de activar el plugin, tendrás que eliminar las reglas de reescritura de tu sitio (visitando la página Configuración > Enlaces permanentes en el admin) para «activar» la nueva URL del feed. Sólo tendrás que hacer esto una vez después de añadir un nuevo feed, o cambiar el nombre de un feed registrado previamente.

Añadir Imágenes Destacadas a la Fuente RSS Personalizada

Ahora que tenemos una fuente RSS separada y completamente funcional, sigamos adelante y agreguemos las imágenes destacadas, teniendo cuidado de que sólo afecten a nuestra fuente personalizada. Podemos hacerlo añadiendo un filtro en los ganchos the_content_feed y the_excerpt_rss inmediatamente antes de incluir el archivo feed-rss2.php, añadiendo la imagen destacada con una función de filtro y eliminando los ganchos después de la inclusión. Esto hará que los filtros se apliquen al código de feed-rss2.php sólo cuando se incluya en nuestro feed personalizado.

Modifique la función generate_content() para añadir y eliminar los filtros:

/**
 * Genera el contenido de nuestro feed personalizado
 */
function generate_content() {

   add_filter( 'the_content_feed', __NAMESPACE__ . '\prepend_thumbnail' );
   add_filter( 'the_excerpt_rss',  __NAMESPACE__ . '\prepend_thumbnail' );

   if ( file_exists( ABSPATH . WPINC . '/feed-rss2.php' ) ) {
      require( ABSPATH . WPINC . '/feed-rss2.php' );
   }

   remove_filter( 'the_content_feed', __NAMESPACE__ . '\prepend_thumbnail' );
   remove_filter( 'the_excerpt_rss',  __NAMESPACE__ . '\prepend_thumbnail' );
}Lenguaje del código: PHP (php)

Añadir el filtro inmediatamente antes del include (y quitarlo después) permitirá que el filtro se aplique sólo al código entre las llamadas add_filter() y remove_filter().

Quitar el filtro después de la inclusión probablemente no es estrictamente necesario en este ejemplo, pero siempre es bueno tener el hábito de limpiar después de hacer algo. En otros contextos, no quitar un filtro cuando se ha terminado puede introducir errores difíciles de encontrar.

Estamos usando los ganchos the_content_feed y the_excerpt_rss para que no importe si hemos elegido (en Configuración > Lectura) mostrar el contenido completo, o sólo el extracto en el feed, la imagen destacada será incluida. Hay un filtro diferente para el extracto y el contenido completo, y al usar ambos, habremos cubierto ambos escenarios.

Por último, tenemos que crear la función a la que se hace referencia en nuestras llamadas add_filter() y remove_filter() anteriores, que en realidad añadirá la imagen destacada al contenido:

/**
 * Agrega la imagen destacada al contenido del feed.
 *
 * @param string $content The feed content.
 *
 * @return string The filtered content.
 */
function prepend_thumbnail( $content ) {

   if ( ! has_post_thumbnail() ) {
      return $content;
   }

   $thumbnail_html = sprintf( "<p>%s</p>\n",
      get_the_post_thumbnail()
   );

   return $thumbnail_html . $content;
}Lenguaje del código: PHP (php)

Regresamos antes de tiempo si la publicación actual no tiene una imagen destacada. Si hay una imagen destacada, tomamos la etiqueta de la imagen usando la función get_the_post_thumbnail(), la envolvemos en un conjunto de etiquetas de párrafo, añadimos un carácter de nueva línea para mantener el marcado limpio, y la añadimos al contenido.

Para Finalizar

¡Eso es! Carga tu URL de feeds personalizados de nuevo (asegurándote de que el plugin está activado, y de que has actualizado tus permalinks si todavía no lo has hecho), y mira tu feed personalizado en acción.

Es posible que quieras hacer algo más que añadir la imagen destacada a un feed. En ese caso, intenta encontrar un filtro que te permita hacer lo que quieras y úsalo en lugar de los filtros de este ejemplo.

El código completo del artículo está disponible en GitHub. En realidad es un plugin completamente funcional. Siéntete libre de usarlo y construir algo por tu cuenta.

Código Completo Feed RSS Personalizado en WordPress

<?php
/**
 * Plugin Name: Custom RSS Feed Example
 * Plugin URI:  https://philipnewcomer.net/2016/08/creating-custom-rss-feeds-wordpress-right-way/
 * Description: An example plugin to demonstrate the right way to implement a custom RSS feed in WordPress.
 * Version:     1.0
 * Author:      Philip Newcomer
 * Author URI:  https://philipnewcomer.net
 * License:     GPL-2.0+
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 *
 * Copyright (C) 2016 Philip Newcomer
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

namespace PhilipNewcomer\CustomRSSFeedExample;

/**
 * Registers our custom feed
 */
function register() {
	add_feed( 'rss2-with-featured-images', __NAMESPACE__ . '\generate_content' );
}
add_action( 'init', __NAMESPACE__ . '\register' );

/**
 * Generates the content of our custom feed
 */
function generate_content() {

	add_filter( 'the_content_feed', __NAMESPACE__ . '\prepend_thumbnail' );
	add_filter( 'the_excerpt_rss',  __NAMESPACE__ . '\prepend_thumbnail' );

	if ( file_exists( ABSPATH . WPINC . '/feed-rss2.php' ) ) {
		require( ABSPATH . WPINC . '/feed-rss2.php' );
	}

	remove_filter( 'the_content_feed', __NAMESPACE__ . '\prepend_thumbnail' );
	remove_filter( 'the_excerpt_rss',  __NAMESPACE__ . '\prepend_thumbnail' );
}

/**
 * Prepends the post's featured image to the feed content
 *
 * @param string $content The feed content.
 *
 * @return string The filtered content.
 */
function prepend_thumbnail( $content ) {

	if ( ! has_post_thumbnail() ) {
		return $content;
	}

	$thumbnail_html = sprintf( "<p>%s</p>\n",
		get_the_post_thumbnail()
	);

	return $thumbnail_html . $content;
}Lenguaje del código: HTML, XML (xml)

Preguntas Frecuentes

¿Cual será la url del feed personalizado?

En el ejemplo del plugin la url sería http://domain.com/feed/rss2-with-featured-images/ puedes personalizarla utilizando algo diferente en la funcion register() al inicio del código.

¿Porque no funciona me feed personalizado?

Tienes que regenerar las reglas del .htaccess para que funcione, vas a Configuración > Enlaces permanentes y guardas tu configuración de enlaces, no es necesario cambiarla, simplemente da click en el boton guardar y debería funcionar.

Fuente

Este articulo es una traducción del post «Creating Custom RSS Feeds in WordPress – The Right Way» de » Philip Newcomer «.