Cómo crear feeds RSS adicionales de texto completo en WordPress

13 jul 2011, 16:19:13
Vistas: 5.26K
Votos: 4

Corriendo el riesgo de sonar completamente ridículo, publico esta pregunta aquí ya que la naturaleza de mi consulta no parece ayudarme mucho en Google.

Los feeds RSS por defecto de WordPress utilizan el extracto del post. Este feed se accede mediante www.midominio.com/feed

Tengo el requisito de crear otro feed RSS que muestre el texto completo. ¿Cómo puedo crear un feed RSS adicional (que sea privado/entregado solo a partes confiables)? Preferiblemente usando una función, pero un plugin como último recurso.

0
Todas las respuestas a la pregunta 2
3

Aquí te mostramos cómo crear un feed personalizado:

Primero crea un nuevo archivo en el directorio de tu tema, nómbralo your-custom-feed.php y coloca este código dentro:

<?php

     /**
      * Feed RSS personalizado.
      *
      * @package WordPress
      */

     header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true);
     $more = 1;

    echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>

    <rss version="2.0"
        xmlns:content="http://purl.org/rss/1.0/modules/content/"
        xmlns:wfw="http://wellformedweb.org/CommentAPI/"
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:atom="http://www.w3.org/2005/Atom"
        xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
        xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
        <?php do_action('rss2_ns'); ?>
    >

        <channel>
            <title><?php bloginfo_rss('name'); wp_title_rss(); ?></title>
            <atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
            <link><?php bloginfo_rss('url') ?></link>
            <description><?php bloginfo_rss("description") ?></description>
            <lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate>
            <language><?php echo get_option('rss_language'); ?></language>
            <sy:updatePeriod><?php echo apply_filters( 'rss_update_period', 'hourly' ); ?></sy:updatePeriod>
            <sy:updateFrequency><?php echo apply_filters( 'rss_update_frequency', '1' ); ?></sy:updateFrequency>
            <?php do_action('rss2_head'); ?>
            <?php while( have_posts()) : the_post(); ?>
            <item>
                <title><?php the_title_rss() ?></title>
                <link><?php the_permalink_rss() ?></link>
                <comments><?php comments_link_feed(); ?></comments>
                <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
                <dc:creator><?php the_author() ?></dc:creator>
                <?php the_category_rss('rss2') ?>

                <guid isPermaLink="false"><?php the_guid(); ?></guid>
                <description><![CDATA[<?php the_excerpt_rss() ?>]]></description>
            <?php if ( strlen( $post->post_content ) > 0 ) : ?>
                <content:encoded><![CDATA[<?php the_content_feed('rss2') ?>]]></content:encoded>
            <?php else : ?>
                <content:encoded><![CDATA[<?php the_excerpt_rss() ?>]]></content:encoded>
            <?php endif; ?>

                <wfw:commentRss><?php echo esc_url( get_post_comments_feed_link(null, 'rss2') ); ?></wfw:commentRss>
                <slash:comments><?php echo get_comments_number(); ?></slash:comments>
        <?php rss_enclosure(); ?>
            <?php do_action('rss2_item'); ?>
            </item>
            <?php endwhile; ?>
        </channel>
    </rss>

Luego añade una función simple para llamar ese archivo de plantilla usando do_feed_$hook

//cargar plantilla de feed
function create_my_customfeed() {
    load_template( TEMPLATEPATH . 'your-custom-feed.php'); 
}
add_action('do_feed_mycustomfeed', 'create_my_customfeed', 10, 1);

Ahora cuando accedas a http://yoursite.com/?feed=mycustomfeed obtendrás un feed de texto completo, sin importar lo que hayas definido en el administrador de WordPress.

Extra

Si deseas crear una regla de reescritura para tu feed personalizado para que tu URL pueda ser:

http://yoursite.com/mycustomfeed.xml así como http://yoursite.com/feed/mycustomfeed/

Añade este código a tu archivo functions.php:

//crear regla de reescritura para el feed

function custom_feed_rewrite($wp_rewrite) {
    $feed_rules = array('feed/(.+)' => 'index.php?feed=' . $wp_rewrite->preg_index(1),'(.+).xml' => 'index.php?feed='. $wp_rewrite->preg_index(1));
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
13 jul 2011 18:34:15
Comentarios

Gracias por este brillante tutorial. Cuando creo el archivo (full-feed.php) y lo llamo mysite.com/?feed=full-feed obtengo el siguiente error

ERROR: full-feed is not a valid feed template.

swordfish81 swordfish81
14 jul 2011 06:42:08

necesitas cambiar el hook y el nombre del archivo en el código

Bainternet Bainternet
14 jul 2011 06:55:42

ahh mi error. Arreglado. Pero revisé el feed y todavía solo muestra un par de líneas de cada publicación??

swordfish81 swordfish81
14 jul 2011 07:21:57
2

Prueba algo como esto (no probado, simplificado de un código más complejo):

add_feed('full', 'full_feed');

function full_feed() {

    add_filter('pre_option_rss_use_excerpt', '__return_zero');
    load_template( ABSPATH . WPINC . '/feed-rss2.php' );
}
13 jul 2011 18:35:54
Comentarios

Seguro, asumo que este código va en functions.php pero ¿qué archivo llamar? Ya existe un /feed que va por defecto con el extracto regular. Entonces, ¿se necesita otro archivo o nombre que se deba llamar?

swordfish81 swordfish81
14 jul 2011 07:28:50

@Sledge81 el primer argumento de add_feed() es el slug del feed que se está creando. Así que este feed adicional estará en /feed/full o ?feed=full (el primero depende si tienes los pretty permalinks activados).

Rarst Rarst
14 jul 2011 08:49:01