web-dev-qa-db-ja.com

RSSフィードの複数のバージョン?全文のもの、抜粋のもの

私はどうやって私の質問に答えるのかわからないし、私は一日中検索していたが無駄だった。

私は私のRSSフィードの2つのバージョンを作成する方法を探しています。1つは完全なコンテンツで、もう1つは抜粋のみです。

主に、 "著者"フィードに対してこれを行いたいと思います。著者ごとに2つのフィードを作成します。 1つは全内容を含み、もう1つは抜粋を含みます。他に何もないなら、私は作者のRSSフィードに抜粋だけが欲しいのですが、メインウェブサイトのRSSフィードは常に完全なコンテンツフィードでなければなりません。

理由?問題のウェブサイトはスポーツウェブサイトです。私はそれを欲しい人のためにフルコンテンツでRSSを提供したいのですが、私はまた私の個人的なウェブサイトに私自身の記事を自動的に投稿します(他の少数も同様にします)。記事が私自身のウェブサイトに投稿されるとき、私は完全な元の記事へのリンクと共に抜粋だけを含めたいです。

私は、コードであろうとプラグインであろうと、使用される方法を気にしません。

UPDATE

私はMichael EcklundとIan Dunnによって記述された方法が機能するように努力しています。私はどちらもうまくいくことができませんでした。どちらの方法でも、RSSフィードに記事全体が表示され、抜粋は表示されません。

違いがあるかどうかはわかりませんが、 Advanced Excerpt プラグインを使用して自分のWebサイトの抜粋を管理していたことを覚えています。ホームページ、カテゴリページ、タグページ、作者ページなどを制御するため、このプラグインを無効にすることはしていません。

3
Travis Pflanz

私のアプローチは、

  1. [閲覧オプション]ページで、For each article in a feed, show...オプションをFull Textに設定すると、デフォルトでフィードに投稿全体が含まれます。
  2. 全文ではなく抜粋をする場合は、各フィードにカスタムURLパラメータを渡します。例えばhttp://example.com/author/username/feed?format=excerpt。パラメータ名に 予約語 を使用しないでください。
  3. フィード作成プロセスに接続し、カスタムパラメータが現在のフィードのURLに存在するかどうかに基づいてコンテンツを変更します。
  4. 存在する場合は、フルテキストではなく抜粋のみを表示するようにフィードのコンテンツを上書きします。
  5. 完全なコンテンツが欲しい場合は、通常のURLを使用してください。例えばhttp://example.com/author/username/feed

これを行うためのコードをいくつか示します。パラメータ名としてformatを使用します。それを参照するコードの各部分を更新する限り、必要なパラメータ名を使用できます。 機能プラグイン の中にコードを入れてください。

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

高度な抜粋プラグインとの競合を避けるために、機能プラグインにもこのコードを追加してください。フィードURLに対する高度な抜粋の機能を無効にしますが、他のすべてのページではそのまま残します。

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

プラグイン

これは、単純なGETパラメータを使って、Full-Text/Summaryfeedオプションを上書きできるようにする小さなプラグインです。

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

GETパラメータなしで、現在の設定を尊重します。私は起こり得る名前の衝突を避けるためにアンダースコアを使います、さもなければ私はプラグインをとてもsimpleshort;-)保つために挑戦しました必要に応じて、これをrss2またはatomに制限するための$tag引数。ブラウザでこれをテストするときは、キャッシュ無効化パラメータを忘れずに使用してください。

使用例

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

この特定のタスクを実行するための実際には非常に簡単なアプローチがあります。

方法1

WordPress WebサイトでカスタムRSSフィードを簡単に作成するには、次の手順に従います。

  1. カスタムページテンプレートを作成します。 your_custom_feed.php と名前を付けます
  2. 最初のコードブロックのコードを your_custom_feed.php に貼り付けます。
  3. your_custom_feed.php を現在アクティブなWordPressテーマディレクトリにアップロードします。
  4. 2番目のコードブロックを現在アクティブなWordPressのfunctions.phpファイルに貼り付けます。
  5. テーマを無効にしてから再度有効にすると、テーマが有効になります。

これで、カスタムフィードにアクセスできるようになりました:your-domain.com/custom-feed/user-slug/

クレジットは Joost de Valk にあります/ /優れた 記事を公開するために しかし、私は彼のコードを元の記事から少し修正しました。

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

あなたはこれをあなたの現在アクティブなWordPressテーマのfunctions.phpファイルに入れることができます:

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

今、私はこの解決策が実用的であるとは言っていません、しかしそれはうまくいきます。

代わりに、あなたはおそらく私がadd_feed();を使って作ったこのクラスからいくらかの用法を作ることができます。

方法2

あなたのテーマの中でこのクラスメソッドを使うための指示。 (注:このクラスはプラグインに簡単に統合できます。)

  1. 現在アクティブなWordPressテーマにサブディレクトリを作成します。それを名前を付けなさい: "inc"。 (ディレクトリ構造は次のようになります。/wp-content/themes/ your_theme / inc /)
  2. PHPファイルを作成し、そのファイルの下のコードブロック(この回答の3番目/最後のコードブロック)を配置します。 custom-feeds.php として保存します
  3. custom-feeds.php をあなたの "inc"ディレクトリにアップロードしてください。
  4. テーマを有効にするには、テーマを無効にしてから再度有効にする必要があります。

これで、カスタムフィードにアクセスできるようになりました:your-domain.com/feed/custom-user-slug/

注:接頭辞 "custom-"を好きなものに変更できます。クラスコンストラクタで設定を構成するだけです。

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

注:大規模Webサイトでどれほどうまく機能するかわかりません。ただし、このクラスを設定した方法では、簡単に操作できます。これと同じクラスを使用して、カスタム投稿タイプのフィード、またはカスタム分類法を生成することもできます。私のカスタムフィードクラスはWordPress 3.4.1でテストされていて正しく動作します。

私が現在設定している方法でそれを使用したい場合は、クラスコンストラクタでフィード設定を構成するだけです。


0
Michael Ecklund

あなたはアドレスの抜粋で短いバージョンにアクセスするでしょう: http://www.dicazine.com.br/author/admin/feed?version=short

少ないほど良い:

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