How to use has_archive but disable feed per post type?

What is the best way to disable feeds per post type but keep has_archive enabled?

Related posts

Leave a Reply

3 comments

  1. I ran into this issue today. I don’t know if it’s the best way, but here’s how I solved it (with has_archive still set to true, of course):

    // First we remove WP default feed actions
    // If we stop here, feeds would be disabled altogether
    remove_action('do_feed_rdf', 'do_feed_rdf', 10, 1);
    remove_action('do_feed_rss', 'do_feed_rss', 10, 1);
    remove_action('do_feed_rss2', 'do_feed_rss2', 10, 1);
    remove_action('do_feed_atom', 'do_feed_atom', 10, 1);
    
    // Now we add our own actions, which point to our own feed function
    add_action('do_feed_rdf', 'my_do_feed', 10, 1);
    add_action('do_feed_rss', 'my_do_feed', 10, 1);
    add_action('do_feed_rss2', 'my_do_feed', 10, 1);
    add_action('do_feed_atom', 'my_do_feed', 10, 1);
    
    // Finally, we do the post type check, and generate feeds conditionally
    function my_do_feed() {
        global $wp_query;
        $no_feed = array('cpt_1', 'cpt_2');
        if(in_array($wp_query->query_vars['post_type'], $no_feed)) {
            wp_die(__('This is not a valid feed address.', 'textdomain'));
        }
        else {
            do_feed_rss2($wp_query->is_comment_feed);
        }
    }
    

    Please note that this will cause all feeds to generate as RSS 2.0, when they do generate, but you get general idea.

  2. I just got this working in a theme by checking if we’re on the archive page for an array of custom post types and then removing the feed link actions:

    function themename_remove_feed_links() {
        if ( is_post_type_archive( array( 'gallery', 'client', 'testimonial', 'slideshow' ) ) ) {
            remove_action('wp_head', 'feed_links_extra', 3 );
            remove_action('wp_head', 'feed_links', 2 );
        }
    }
    
    add_action( 'template_redirect', 'themename_remove_feed_links' );
    
  3. I haven’t tested, but it should be as simple as:

    register_post_type( 'slug', array(
        'has_archive' => true,
    
        'rewrite' => array(
            'slug' => 'slug',
            'feeds' => false,
        ),
    );