Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I want to remove the feeds for specific custom post types. Most recommended methods are not clean. There seems to be a option called $args->feeds but this does not work within the register_post_type() function.

 register_post_type(
  ...
   'rewrite' => array('slug' => 'slug/%term&', 
                      'with_front' => false,
                      'feeds' => false), // Remove feed rewrite-rules?
  ...
 );

Source: Line 1324 - /wp-includes/post.php (Wordpress 3.5)

I'm looking for a solution, to disable the rule generation inside $wp_rewrite->rules.

share|improve this question
    
hmm KISS is to leave the feeds. just remove them from the header and probably no one will subscribe to them. –  Mark Kaplun Mar 1 '13 at 5:40
add comment

1 Answer

Taking a look at the register_post_type() function in WordPress source, it appears that WordPress uses isset() to check the feeds arg instead of empty(), meaning that a false value will return true. To fix this, you might try setting 'feeds' => null and then flush your rewrite rules from Settings > Permalinks (remember to do it TWICE, to get past a weird quirk).

Alternatively, you can shut down any other page (including feeds) before it has a chance to load...

do_action('wp','kill_feeds',-1);
function kill_feeds(){
    if ( is_feed( array('post','my-custom-type') ) ) {
        exit;
    }
}

What this should do is detect if the current request is a feed (of the specific post types you specify) and, if it is, stops any further output.

If you wanted to get really crazy, you could redirect to your sites 404 page instead. :-)

Finally, failing all that, you could modify your rewrite rules manually. The rewrite_rules_array filter exposes the entire rewrite rules array and you can work a little regex magic to remove any applicable feed rules. Assuming your post was 'foo', this might look like...

add_filter('rewrite_rules_array', 'kill_feed_rewrites');
function kill_feed_rewrites($rules){
    foreach ($rules as $rule => $rewrite) {
        if ( preg_match('/^foo.*(feed)/',$rule) ) {
            unset($rules[$rule]);
        }
    }
    return $rules;
}

Feed reference, the rules themselves look something like this...

'foo/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => string 'index.php?attachment=$matches[1]&feed=$matches[2]'
share|improve this answer
    
returning 404 is not crazy but a must, otherwise you might have people subscribing to your feed and wasting your CPU time. –  Mark Kaplun Mar 1 '13 at 5:39
    
That's a fairly cheap answer (first result from Google...) and does not prevent rewrite rule generation ! –  cept0 Mar 1 '13 at 8:27
    
I added some additional approaches. Also, telling volunteers that their freely offered help is "cheap" might not be the best way to get help in the future. –  Matt Van Andel Mar 2 '13 at 17:13
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.