WordPress:在CPT的RSS源中排除子页面

时间:2014-05-21 18:58:14

标签: wordpress rss

我有一个带有页面功能的自定义帖子类型,可以通过WordPress创建HTML简报。我正在使用带有子帖的层次结构来创建杂志类型的新闻稿:父帖是主要帖子,孩子是下面的媒体对象。

参见示例:http://blog.utc.edu/today/newsletters/whats-the-latest-for-summer-semester-2014/

我需要此CPT的RSS Feed,但我想排除子帖子。是一个简单的URL参数来实现这个? (我知道我可以创建一个自定义的RSS模板。)

参见示例:http://blog.utc.edu/today/feed/?post_type=utcblogs_newsletter&include_children=false

以上网址是"乐观",我知道参数不正确。您可以看到包含子帖子。

我还通过以下方式将CPT添加到常规RSS源:

// Add newsletters to general RSS feed
function add_cpt_to_feed( $query ) {
  if ( isset($query['feed']) && !isset($query['post_type']) )
    $query['post_type'] = array('post', 'utcblogs_newsletter');
  return $query;
}
add_filter( 'request', 'add_cpt_to_feed' );

那么,有没有办法修改$ query来排除子帖子?或者我需要一个不同的查询或WP函数来实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

我通过为自定义帖子类型创建自定义RSS模板解决了这个问题。

要删除子帖子(是的,帖子可以在CPT中具有层次结构),请使用post_parent

$args = array( 
            'post_type' => 'utcblogs_newsletter',
            'post_parent' => 0
        );  
query_posts( $args );

因此,完整的自定义RSS模板(主题文件夹中的newsletter-customfeed.php)是:

<?php
/*
Template Name: Custom Newsletter Feed

*/

$numposts = 5;

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

function custom_rss_text_limit($string, $length, $replacer = '&hellip;') { 
  $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; 
}

$args = array( 
                'post_type' => 'utcblogs_newsletter',
                'post_parent' => 0
            );  
query_posts( $args );

$lastpost = $numposts - 1;



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 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 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>
<?php if (get_option('rss_use_excerpt')) : ?>
        <description><![CDATA[<?php get_the_excerpt(); ?>]]></description>
<?php else : ?>
        <description><?php echo '<![CDATA['.custom_rss_text_limit($post->post_content, 256).']]>';  ?></description>
<?php $content = get_the_content_feed('rss2'); ?>
    <?php if ( strlen( $content ) > 0 ) : ?>
        <content:encoded><![CDATA[<?php echo $content; ?>]]></content:encoded>
    <?php else : ?>
        <content:encoded><![CDATA[<?php the_excerpt(); ?>]]></content:encoded>
    <?php endif; ?>
<?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>

...并且Feed网址在functions.php中设置并调用为http://my.site.com/newsletter.xml

/* Custom RSS Feed for Newsletter CPT */

function create_my_customfeed_newsletter() {
load_template( get_stylesheet_directory() . '/newsletter-customfeed.php');
}
add_action('do_feed_newsletter', 'create_my_customfeed_newsletter', 10, 1);

// creates /feed/feedname and /feedname.xml for each custom CPT RSS
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;
}
add_filter('generate_rewrite_rules', 'custom_feed_rewrite');

...并包括一般RSS简报:

// Add newsletters to general RSS feed
function add_cpt_to_feed( $query ) {
  if ( isset($query['feed']) && !isset($query['post_type']) )
    $query['post_type'] = array(
                                'post', 
                                'utcblogs_newsletter',
                                'post_parent' => 0
                                );
  return $query;
}
add_filter( 'request', 'add_cpt_to_feed' );