web-dev-qa-db-fra.com

Plusieurs versions de flux RSS? Une avec le contenu complet, une avec l'extrait

Je ne sais pas comment formuler ma question et j'ai cherché toute la journée, en vain.

Je cherche une méthode pour créer deux versions de mes flux RSS, une avec le contenu complet et une avec seulement l'extrait.

Je souhaite principalement faire cela pour les flux "Auteur". Je voudrais deux flux créés pour chaque auteur. Une avec le contenu complet et une avec l'extrait. Si rien d'autre, j'aimerais que le fil RSS de l'auteur ne contienne que des extraits, mais le fil RSS du site principal doit TOUJOURS être un fil de contenu complet.

La raison? Le site Web en question est un site Web sportif. Je souhaite proposer le flux RSS complet à ceux qui le souhaitent, mais je publie également automatiquement mes propres articles sur mon site Web personnel (quelques-uns le font également). Lorsque l'article est publié sur mon propre site Web, je souhaite inclure uniquement l'extrait, avec un lien vers l'article original complet.

Je me fiche de la méthode utilisée, que ce soit du code ou du plugin.

UPDATE

Je travaille pour que les méthodes décrites par Michael Ecklund et Ian Dunn fonctionnent. Je n'ai pas été capable de travailler non plus. Les deux méthodes affichent toujours l'article complet dans le flux RSS et non l'extrait.

Je ne sais pas si cela fait une différence, mais je viens de me rappeler que j'utilise le plugin Advanced Excerpt pour gérer les extraits sur mon site Web. Je n'ai pas essayé de désactiver ce plugin, car il contrôle la page d'accueil, les pages de catégories, les pages de balises, les pages d'auteurs, etc.

3
Travis Pflanz

Mon approche serait de:

  1. Sur la page Options de lecture, définissez l'option For each article in a feed, show... sur Full Text afin que, par défaut, les flux incluent l'intégralité de la publication.
  2. Transmettez un paramètre d'URL personnalisé à chaque flux lorsque vous voulez l'extrait au lieu du texte intégral. Par exemple, http://example.com/author/username/feed?format=excerpt. Assurez-vous de ne pas utiliser un terme réservé pour le nom du paramètre.
  3. Accédez au processus de création du flux et modifiez le contenu en fonction de la présence ou non du paramètre personnalisé dans l'URL du flux en cours.
  4. S'il est présent, remplacez le contenu du flux pour afficher uniquement l'extrait au lieu du texte intégral.
  5. Lorsque vous voulez le contenu complet, utilisez simplement l'URL habituelle. Par exemple, http://example.com/author/username/feed.

Voici un code qui fait cela, en utilisant format comme nom de paramètre. Vous pouvez utiliser n'importe quel nom de paramètre, à condition de mettre à jour chaque partie du code qui la référence. Placez le code dans un plugin fonctionnalité .

function truncateFeedContent( $content )
{
    if( get_query_var( 'format' ) == 'excerpt' )
    {
        $content = get_the_excerpt();
        $content = apply_filters( 'the_excerpt_rss', $content );
    }

    return $content;
}
add_filter( 'the_content_feed', 'truncateFeedContent' );

function addFormatQueryVar( $queryVars )
{
    $queryVars[] = 'format';

    return $queryVars;
}
add_filter( 'query_vars', 'addFormatQueryVar' );

Pour éviter un conflit avec le plug-in Advanced Excerpt, ajoutez également ce code au plug-in de fonctionnalité. Il désactivera la fonctionnalité Advanced Excerpt sur les URL de flux, mais le laissera intact pour toutes les autres pages.

function stopAdvancedExcerptOnFeeds()
{
    if( is_feed() )
        remove_filter( 'get_the_excerpt', array( 'AdvancedExcerpt', 'filter' ) );
}
add_action( 'pre_get_posts', 'stopAdvancedExcerptOnFeeds' );
3
Ian Dunn

Brancher

Voici un petit plugin qui vous permet de remplacer l'option Texte intégral / Résumé feed, via un simple paramètre GET:

<?php
/**
 * Plugin Name: Feeds with Summary Or Full Text
 * Description: GET parameter _summary with values yes or no
 * Plugin URI:  http://wordpress.stackexchange.com/a/195197/26350
 */
add_action( 'rss_tag_pre', function( $tag )
{
    $summary = filter_input( INPUT_GET, '_summary', FILTER_SANITIZE_STRING );
    if( 'yes' === $summary )
        add_filter( 'option_rss_use_excerpt', '__return_true' );
    elseif( 'no' === $summary )
        add_filter( 'option_rss_use_excerpt', '__return_false' );
} );

Il respecte les paramètres actuels, sans le paramètre GET. J'utilise le trait de soulignement pour éviter d'éventuelles collisions de noms, mais sinon, j'ai relevé le défi de garder le plugin très simple & court ;-) Nous pourrions facilement utiliser l'argument $tag, pour contraindre ceci à rss2 ou atome , si nécessaire. N'oubliez pas d'utiliser des paramètres de contournement du cache lorsque vous testez cela dans votre navigateur.

Exemples d'utilisation

example.tld/feed/?_summary=yes  // Summary
example.tld/feed/?_summary=no   // Full Text
example.tld/feed/               // Uses Default settings

example.tld/author/anna/feed/?_summary=yes  // Summary
example.tld/author/anna/feed/?_summary=no   // Full Text
example.tld/author/anna/feed/               // Uses Default settings
3
birgire

Il existe en fait une approche assez facile pour accomplir cette tâche particulière.

METHODE UN

Suivez ces étapes pour créer facilement un flux RSS personnalisé sur votre site Web WordPress:

  1. Créez un modèle de page personnalisé. Nommez-le _ {your_custom_feed.php} _
  2. Collez le code dans le premier bloc de code dans your_custom_feed.php
  3. Téléchargez your_custom_feed.php dans votre répertoire de thèmes WordPress actuellement actif.
  4. Collez le deuxième bloc de code dans le fichier functions.php de WordPress actuellement actif.
  5. Désactivez et réactivez votre thème pour qu'il prenne effet.

Vous pouvez maintenant accéder à votre flux personnalisé à l'adresse suivante: votre- domaine.com/custom-feed/user-slug/

Les crédits vont à Joost de Valk pour avoir publié un excellent article . Cependant, j'ai légèrement modifié son code par rapport à l'article d'origine.

<?php
/*
Template Name: Custom Feed
*/

//----------------------------------------
//  CONFIGURE THIS
//----------------------------------------
$contentType = 'excerpt';// Enter 'excerpt' or 'content'
$numposts = 5;// Enter number of posts to display for each author


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//  NO MORE CONFIGURATION NECESSARY
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

function custom_rss_date( $timestamp = null ) {
    $timestamp = ($timestamp==null) ? time() : $timestamp;
    echo date(DATE_RSS, $timestamp);
}

function custom_rss_text_limit($string, $length, $replacer = '...') { 
    $string = strip_tags($string);
    if(strlen($string) > $length)
    return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;   
    return $string; 
}

function custom_rss_post_id() {
    global $wp_query;
    $thePostID = $wp_query->post->ID;
    return $thePostID;
}

$thePage = get_page(custom_rss_post_id());

$posts = query_posts('showposts='.$numposts.'&author_name='.$thePage->post_name);

$lastpost = $numposts - 1;

header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true);
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 bloginfo_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 foreach ($posts as $post) { ?>
        <item>
        <title><?php echo get_the_title($post->ID); ?></title>
        <link>
        <?php echo get_permalink($post->ID); ?>
        </link>
        <description>
       <?php 
            if(!empty($contentType) && $contentType == 'excerpt'){
                echo '<![CDATA['.custom_rss_text_limit($post->post_content, 500).']]>';
            } elseif(!empty($contentType) && $contentType == 'content'){
                echo '<![CDATA['.apply_filters('the_content', $post->post_content).']]>';
            }         
       ?>
       </description>
        <pubDate>
            <?php custom_rss_date( strtotime($post->post_date_gmt) ); ?>
        </pubDate>
        <guid><?php echo get_permalink($post->ID); ?></guid>
        </item>
        <?php } ?>
    </channel>
</rss>

Vous pouvez placer ceci dans votre fichier functions.php du thème WordPress actif actuel:

// Tell the hourly cronjob what operation it needs to perform.
add_action('update_custom_user_feeds', 'create_custom_user_feeds');

// Create a cronjob to update our custom feeds hourly.
function cron_custom_user_feeds(){
    if(!wp_next_scheduled('update_custom_user_feeds')){
        wp_schedule_event(current_time('timestamp'), 'hourly', 'update_custom_user_feeds');
    }
}
add_action('init', 'cron_custom_user_feeds');

// Delete our hourly cronjob when the theme is changed.
function clear_custom_user_feeds(){
    wp_clear_scheduled_hook('update_custom_user_feeds');
}
add_action('switch_theme', 'clear_custom_user_feeds');

// Generate the custom user feeds
function create_custom_user_feeds(){
    // "Custom Feed" is the main feed page.
    $feedParent = get_page_by_title('Custom Feed', 'OBJECT', 'page');
    if(!$feedParent){
        $pageData = array(
            'post_title' => 'Custom Feed',
            'post_name' => 'custom-feed',
            'post_status' => 'publish',
            'post_type' => 'page'
        );
        // Create custom user feed.
        $parentID = wp_insert_post($pageData);
    } else{
        $parentID = $feedParent->ID;    
    }
    $wpUsers = get_users();
    for($i = 0; $i < count($wpUsers); $i++){
        // Check if the custom user feed already exists.
        $userFeed = get_page_by_title($wpUsers[$i]->user_nicename, 'OBJECT', 'page');
        if(!$userFeed){
            $pageData = array(
                'post_title' => $wpUsers[$i]->user_nicename,
                'post_name' => $wpUsers[$i]->user_nicename,
                'post_status' => 'publish',
                'post_type' => 'page',
                'post_parent' => $parentID
            );
            // Create custom user feed.
            $insertPage = wp_insert_post($pageData);
            if($insertPage){
                // Assign our custom feed template.
                update_post_meta($insertPage, '_wp_page_template', 'your_custom_feed.php');
            }
        }
    }
    // Attempt to flush caches
    wp_cache_flush();
    if(function_exists('w3tc_objectcache_flush')){
        w3tc_objectcache_flush();
    }
    if(function_exists('w3tc_pgcache_flush')){
        w3tc_pgcache_flush();
    }
    if(function_exists('w3tc_minify_flush')){
        w3tc_minify_flush();
    }
    if(function_exists('w3tc_dbcache_flush')){
        w3tc_dbcache_flush();
    }
}

Maintenant, je ne dis pas que cette solution est pratique, mais cela fonctionne.

Alternativement, vous pouvez éventuellement faire un usage de cette classe que j'ai faite en utilisant add_feed();

Deuxième méthode

Instructions d'utilisation de cette méthode de classe dans votre thème. (Remarque: cette classe pourrait facilement être intégrée dans un plugin.)

  1. Créez un sous-répertoire dans votre thème WordPress actuellement actif. Nommez-le: "inc". (La structure du répertoire devrait ressembler à: ./wp-content/themes/your_theme/inc /)
  2. Créez un fichier PHP et placez le bloc de code ci-dessous (troisième/dernier bloc de code dans cette réponse) dans le fichier. Enregistrez-le sous custom-feeds.php
  3. Téléchargez custom-feeds.php dans votre répertoire "inc".
  4. Vous devrez peut-être désactiver et réactiver votre thème pour qu'il prenne effet.

Vous pouvez maintenant accéder à votre flux personnalisé à l'adresse suivante: votre- domaine.com/feed/custom-user-slug/

Remarque: vous pouvez remplacer le préfixe "personnalisé" par tout ce que vous souhaitez. Il suffit de configurer les paramètres dans le constructeur de classe.

<?php
if(!class_exists('custom_feeds')){
    class custom_feeds{

        private $feed_settings;
        private $feed_data;

        public function __construct(){

            // Configure the Feed
            $this->feed_settings['number_posts'] = -1;// # of feed items, -1 means all posts
            $this->feed_settings['content_type'] = 'excerpt';// Excerpt or Content
            $this->feed_settings['excerpt_length'] = 500;// if excerpt, display how many characters?
            $this->feed_settings['offset_posts'] = 0;// Skip # of recent posts
            $this->feed_settings['custom_prefix'] = 'custom';// domain.com/feed/{prefix}-feed-name/
            $this->feed_settings['signature_link'] = false;// add link back to your site after the content.

            // Specify what type of feed you want to create.
            $this->prepare_feed('user');// All users, Nice names
            //$this->prepare_feed('user', 'some-user');// Specific user's Nice name

            // Prepare the feed
            add_action('init', array($this, 'setup_custom_feeds')); 
        }

        public function setup_custom_feeds(){
            global $wp_rewrite;
            // Add a feed for each type.
            foreach($this->feed_data as $type => $posts){
                add_feed($this->feed_settings['custom_prefix'].'-'.$type, call_user_func_array(array($this, 'display_feed'), array($type, $posts)));
            }   
            // Flush rewrite rules.
            $wp_rewrite->flush_rules();
            // Attempt to flush caches.
            $this->flush_all_caches();          
        }

        public function prepare_feed($type, $Nice_name=NULL){ 
            if($type == 'user'){
                if(!is_null($Nice_name)){
                    // Get specified user.
                    $data[] = get_user_by('slug', $Nice_name);
                } else{
                    // Get all users.
                    $data = get_users();
                }
                // Find posts for our request.
                for($i = 0; $i < count($data); $i++){
                    $userPosts = new WP_Query(array('posts_per_page' => intval($this->feed_settings['number_posts']), 'author_name' => $data[$i]->user_nicename, 'offset' => intval($this->feed_settings['offset_posts'])));
                    wp_reset_postdata();
                    if(!empty($userPosts->posts)){
                        $theData[$data[$i]->user_nicename] = $userPosts->posts;
                    }
                }
            } 
            $this->feed_data = $theData;
        }

        public function display_feed($type, $posts){
            $current_feed = explode('/feed/', $this->self_link());
            if($this->feed_settings['custom_prefix'].'-'.$type == $current_feed[1]){
                header('Content-Type: '.feed_content_type('rss-http').'; charset='.get_option('blog_charset'), true);
                echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EOL;
                echo '<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/"';
                do_action('rss2_ns');
                echo '>'.PHP_EOL;
                echo '<channel>'.PHP_EOL;
                echo '<title>';
                bloginfo_rss('name'); 
                wp_title_rss();
                echo '</title>'.PHP_EOL;
                echo '<atom:link href="'.$this->self_link().'" rel="self" type="application/rss+xml" />'.PHP_EOL;
                echo '<link>'.get_bloginfo_rss('url').'</link>'.PHP_EOL;
                echo '<description>'.get_bloginfo_rss('description').'</description>'.PHP_EOL;
                echo '<lastBuildDate>'.mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false).'</lastBuildDate>'.PHP_EOL;
                echo '<language>'.get_bloginfo_rss('language').'</language>'.PHP_EOL;
                echo '<sy:updatePeriod>'.apply_filters('rss_update_period', 'hourly').'</sy:updatePeriod>'.PHP_EOL;
                echo '<sy:updateFrequency>'.apply_filters('rss_update_frequency', '1').'></sy:updateFrequency>'.PHP_EOL;
                // Begin displaying posts in our feed.
                foreach($posts as $post){
                    echo '<item>'.PHP_EOL;
                    echo '<title>'.$post->post_title.'</title>'.PHP_EOL;
                    echo '<link>'.get_permalink($post->ID).'</link>'.PHP_EOL;
                    echo '<description>'.PHP_EOL;
                    if($this->feed_settings['signature_link']){
                        $feed_signature = '<h3>Original Post:<br /> <a title="'.$post->post_title.'" href="'.get_permalink($post->ID).'">'.$post->post_title.'</a></h3>';
                    } else{
                        $feed_signature = '';
                    }
                    if(!empty($this->feed_settings['content_type']) && $this->feed_settings['content_type'] == 'excerpt'){
                        echo '<![CDATA['.$this->custom_rss_text_limit($post->post_content, intval($this->feed_settings['excerpt_length'])).$feed_signature.']]>'.PHP_EOL;

                    } elseif(!empty($this->feed_settings['content_type']) && $this->feed_settings['content_type'] == 'content'){
                        echo '<![CDATA['.apply_filters('the_content', $post->post_content).$feed_signature.']]>'.PHP_EOL;
                    }         
                    echo '</description>'.PHP_EOL;
                    echo '<pubDate>'.$this->custom_rss_date(strtotime($post->post_date_gmt)).'</pubDate>'.PHP_EOL;
                    echo '<guid>'.$post->guid.'</guid>'.PHP_EOL;
                    echo '</item>'.PHP_EOL;
                }
                echo '</channel>'.PHP_EOL;
                echo '</rss>'.PHP_EOL;
            }
        }

        private function custom_rss_date($timestamp = null){
            $timestamp = ($timestamp==null) ? time() : $timestamp;
            return date(DATE_RSS, $timestamp);
        }

        private function custom_rss_text_limit($string, $length, $replacer = '...'){ 
            $string = strip_tags($string);
            if(strlen($string) > $length)
                return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;   
            return $string; 
        }

        private function self_link(){
            $Host = @parse_url(home_url());
            $Host = $Host['Host'];
            $return = esc_url(
                'http'
                . ( (isset($_SERVER['https']) && $_SERVER['https'] == 'on') ? 's' : '' ) . '://'
                . $Host
                . stripslashes($_SERVER['REQUEST_URI'])
            );
            return $return;
        }

        private function flush_all_caches(){
            wp_cache_flush();
            if(function_exists('w3tc_objectcache_flush')){
               w3tc_objectcache_flush();
            }
            if(function_exists('w3tc_pgcache_flush')){
               w3tc_pgcache_flush();
            }
            if(function_exists('w3tc_minify_flush')){
               w3tc_minify_flush();
            }
            if(function_exists('w3tc_dbcache_flush')){
               w3tc_dbcache_flush();
            }
        }

    }// END custom_feeds class.

    // Instantiate the class.
    $custom_feeds = new custom_feeds();

}// END custom_feeds class exists.
?>

Remarque: Je ne sais pas si cela fonctionnerait bien sur des sites Web à grande échelle. Bien que la façon dont j'ai configuré cette classe permette une manipulation facile. Vous pouvez utiliser cette même classe pour générer des flux d'un type de publication personnalisé ou une taxonomie personnalisée. Ma classe Custom Feeds a été testée sur WordPress 3.4.1 et fonctionne correctement.

Si vous voulez l'utiliser comme je l'ai configuré actuellement, il vous suffit de configurer les paramètres de flux dans le constructeur de la classe.


0
Michael Ecklund

Vous accéderiez à une version courte avec un extrait à l'adresse: http://www.dicazine.com.br/author/admin/feed?version=short

Le moins le mieux:

add_filter('the_content','author_feed_version',10);
function author_feed_version($content) {
    if(is_feed()){
        if($_GET['version'] == 'version')
            $content = limit_words(strip_tags($content),100);
    }
    return $content;
} function limit_words($string, $Word_limit){ $words = explode(" ",$string); return implode(" ",array_splice($words,0,$Word_limit)); }
0
Dan Cortazio