私はどうやって私の質問に答えるのかわからないし、私は一日中検索していたが無駄だった。
私は私のRSSフィードの2つのバージョンを作成する方法を探しています。1つは完全なコンテンツで、もう1つは抜粋のみです。
主に、 "著者"フィードに対してこれを行いたいと思います。著者ごとに2つのフィードを作成します。 1つは全内容を含み、もう1つは抜粋を含みます。他に何もないなら、私は作者のRSSフィードに抜粋だけが欲しいのですが、メインウェブサイトのRSSフィードは常に完全なコンテンツフィードでなければなりません。
理由?問題のウェブサイトはスポーツウェブサイトです。私はそれを欲しい人のためにフルコンテンツでRSSを提供したいのですが、私はまた私の個人的なウェブサイトに私自身の記事を自動的に投稿します(他の少数も同様にします)。記事が私自身のウェブサイトに投稿されるとき、私は完全な元の記事へのリンクと共に抜粋だけを含めたいです。
私は、コードであろうとプラグインであろうと、使用される方法を気にしません。
UPDATE
私はMichael EcklundとIan Dunnによって記述された方法が機能するように努力しています。私はどちらもうまくいくことができませんでした。どちらの方法でも、RSSフィードに記事全体が表示され、抜粋は表示されません。
違いがあるかどうかはわかりませんが、 Advanced Excerpt プラグインを使用して自分のWebサイトの抜粋を管理していたことを覚えています。ホームページ、カテゴリページ、タグページ、作者ページなどを制御するため、このプラグインを無効にすることはしていません。
私のアプローチは、
For each article in a feed, show...
オプションをFull Text
に設定すると、デフォルトでフィードに投稿全体が含まれます。http://example.com/author/username/feed?format=excerpt
。パラメータ名に 予約語 を使用しないでください。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' );
これは、単純な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パラメータなしで、現在の設定を尊重します。私は起こり得る名前の衝突を避けるためにアンダースコアを使います、さもなければ私はプラグインをとてもsimple&short;-)保つために挑戦しました必要に応じて、これを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
この特定のタスクを実行するための実際には非常に簡単なアプローチがあります。
WordPress WebサイトでカスタムRSSフィードを簡単に作成するには、次の手順に従います。
これで、カスタムフィードにアクセスできるようになりました: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();
を使って作ったこのクラスからいくらかの用法を作ることができます。
あなたのテーマの中でこのクラスメソッドを使うための指示。 (注:このクラスはプラグインに簡単に統合できます。)
これで、カスタムフィードにアクセスできるようになりました: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でテストされていて正しく動作します。
私が現在設定している方法でそれを使用したい場合は、クラスコンストラクタでフィード設定を構成するだけです。
あなたはアドレスの抜粋で短いバージョンにアクセスするでしょう: 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));
}