it-swarm.com.de

Mehrere Versionen von RSS-Feeds? Eine mit vollem Inhalt, eine mit dem Auszug

Ich bin nicht sicher, wie ich meine Frage formulieren soll und habe den ganzen Tag vergeblich gesucht.

Ich suche nach einer Methode, um zwei Versionen meiner RSS-Feeds zu erstellen, eine mit dem vollständigen Inhalt und eine mit nur dem Auszug.

Hauptsächlich möchte ich dies für die "Author" -Feeds tun. Ich möchte, dass für jeden Autor zwei Feeds erstellt werden. Eins mit dem vollen Inhalt und eins mit dem Auszug. Ich möchte, dass der RSS-Feed des Autors nur Auszüge enthält, aber der RSS-Feed der Hauptwebsite muss IMMER ein vollständiger Inhalts-Feed sein.

Der Grund? Bei der fraglichen Website handelt es sich um eine Sportwebsite. Ich möchte das RSS in vollem Umfang für diejenigen anbieten, die es möchten, aber ich poste auch automatisch meine eigenen Artikel auf meiner persönlichen Website (einige andere tun es auch). Wenn der Artikel auf meiner eigenen Website veröffentlicht wird, möchte ich nur den Auszug mit einem Link zum vollständigen Originalartikel einfügen.

Mir ist die verwendete Methode egal, ob Code oder Plugin.

UPDATE

Ich habe versucht, die von Michael Ecklund und Ian Dunn beschriebenen Methoden zum Laufen zu bringen. Ich konnte auch nicht zur Arbeit kommen. Beide Methoden zeigen weiterhin den vollständigen Artikel im RSS-Feed und nicht den Auszug.

Ich bin mir nicht sicher, ob es einen Unterschied macht, aber ich habe mich nur daran erinnert, dass ich das Advanced Excerpt Plugin verwende, um die Auszüge auf meiner Website zu verwalten. Ich habe nicht versucht, dieses Plugin zu deaktivieren, da es die Startseite, Kategorieseiten, Tagseiten, Autorenseiten und mehr steuert.

3
Travis Pflanz

Mein Ansatz wäre:

  1. Setzen Sie auf der Seite "Leseoptionen" die Option "For each article in a feed, show..." auf "Full Text", damit Feeds standardmäßig den gesamten Beitrag enthalten.
  2. Übergeben Sie einen benutzerdefinierten URL-Parameter an jeden einzelnen Feed, wenn der Auszug anstelle des Volltexts angezeigt werden soll. z. B. http://example.com/author/username/feed?format=excerpt. Stellen Sie sicher, dass Sie keinen reservierten Begriff für den Parameternamen verwenden.
  3. Schließen Sie sich dem Erstellungsprozess des Feeds an und ändern Sie den Inhalt basierend darauf, ob der benutzerdefinierte Parameter in der URL des aktuellen Feeds vorhanden ist oder nicht.
  4. Wenn es vorhanden ist, überschreiben Sie den Inhalt des Feeds, um nur den Auszug anstelle des Volltexts anzuzeigen.
  5. Wenn Sie den vollständigen Inhalt wünschen, verwenden Sie einfach die reguläre URL. z. B. http://example.com/author/username/feed.

Hier ist ein Code, der dies tut und format als Parameternamen verwendet. Sie können einen beliebigen Parameternamen verwenden, solange Sie jeden Teil des Codes aktualisieren, der darauf verweist. Fügen Sie den Code in ein Funktions-Plugin ein .

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' );

Um einen Konflikt mit dem Advanced Excerpt-Plugin zu vermeiden, fügen Sie diesen Code auch dem Funktions-Plugin hinzu. Dadurch wird die Funktionalität von Advanced Excerpt für Feed-URLs deaktiviert, aber für alle anderen Seiten beibehalten.

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

Plugin

Hier ist ein kleines Plugin, mit dem Sie die Feed-Option Volltext/Zusammenfassung durch einen einfachen GET-Parameter überschreiben können:

<?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' );
} );

Dabei werden die aktuellen Einstellungen ohne den Parameter GET berücksichtigt. Ich benutze den Unterstrich, um mögliche Namenskollisionen zu vermeiden, aber ansonsten habe ich die Herausforderung angenommen, das Plugin sehr einfach & kurz zu halten ;-) Wir könnten das Argument $tag verwenden, um dies auf zu beschränken. rss2 oder Atom, falls erforderlich. Denken Sie daran, Cache-Busting-Parameter zu verwenden, wenn Sie dies in Ihrem Browser testen.

Anwendungsbeispiele

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

Es gibt tatsächlich einen recht einfachen Ansatz, um diese bestimmte Aufgabe zu erfüllen.

Methode eins

Befolgen Sie diese Schritte, um auf einfache Weise einen benutzerdefinierten RSS-Feed in Ihrer WordPress-Website zu erstellen:

  1. Erstellen Sie eine benutzerdefinierte Seitenvorlage. Nennen Sie es your_custom_feed.php
  2. Fügen Sie den Code im ersten Codeblock in your_custom_feed.php ein.
  3. Laden Sie your_custom_feed.php in Ihr aktuell aktives WordPress-Theme-Verzeichnis hoch.
  4. Fügen Sie den zweiten Codeblock in Ihre derzeit aktive WordPress-Datei functions.php ein.
  5. Deaktivieren und reaktivieren Sie Ihr Thema, damit es wirksam wird.

Sie können jetzt auf Ihren benutzerdefinierten Feed zugreifen: your-domain.com/custom-feed/user-slug/

Credits gehen an Joost de Valk für die Veröffentlichung eines exzellenten Artikels . Allerdings habe ich seinen Code vom Originalartikel leicht verändert.

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

Sie könnten dies in Ihre aktuell aktive WordPress-Theme-Datei functions.php einfügen:

// 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();
    }
}

Nun, ich sage nicht, dass diese Lösung praktisch ist, aber sie funktioniert.

Alternativ können Sie möglicherweise etwas von dieser Klasse verwenden, die ich erstellt habe und die add_feed(); verwendet.

Methode zwei

Anweisungen zur Verwendung dieser Klassenmethode in Ihrem Thema. (Hinweis: Diese Klasse kann leicht in ein Plugin integriert werden.)

  1. Erstellen Sie ein Unterverzeichnis in Ihrem derzeit aktiven WordPress-Theme. Nennen Sie es "inc". (Die Verzeichnisstruktur sollte folgendermaßen aussehen: ./wp-content/themes/your_theme/inc /)
  2. Erstellen Sie eine PHP -Datei und platzieren Sie den folgenden Codeblock (dritter/letzter Codeblock in dieser Antwort) in der Datei. Speichere es als custom-feeds.php
  3. Laden Sie custom-feeds.php in Ihr "inc" -Verzeichnis hoch.
  4. Möglicherweise müssen Sie Ihr Design deaktivieren und erneut aktivieren, damit es wirksam wird.

Sie können jetzt auf Ihren benutzerdefinierten Feed zugreifen: your-domain.com/feed/custom-user-slug/

Hinweis: Sie können das Präfix "custom-" nach Belieben ändern. Konfigurieren Sie einfach die Einstellungen im Klassenkonstruktor.

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

Hinweis: Ich weiß nicht, wie gut es auf großen Websites abschneiden würde. Obwohl die Art und Weise, wie ich diese Klasse eingerichtet habe, eine einfache Manipulation ermöglicht. Sie können dieselbe Klasse auch zum Generieren von Feeds eines benutzerdefinierten Beitragstyps oder einer benutzerdefinierten Taxonomie verwenden. Meine Klasse "Benutzerdefinierte Feeds" wurde unter WordPress 3.4.1 getestet und funktioniert ordnungsgemäß.

Wenn Sie es so verwenden möchten, wie ich es gerade eingerichtet habe, müssen Sie lediglich die Feed-Einstellungen im Klassenkonstruktor konfigurieren.


0
Michael Ecklund

Sie würden auf eine Kurzversion mit einem Auszug aus der Adresse zugreifen: http://www.dicazine.com.br/author/admin/feed?version=short

Je weniger desto besser:

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