Opens in a new tab
  1. Home
  2. Guides
  3. Disable
Disable guide

How to disable RSS feeds in WordPress

Learn how to disable WordPress RSS and Atom feeds using native feed actions, return appropriate HTTP responses, remove RSS autodiscovery links, test category, tag, author and comment feeds, audit integrations and handle custom plugin-defined feed endpoints safely.

  • Updated September 23, 2026
  • 25 min read
  • WordPress guide

Disabling RSS feeds in WordPress means preventing WordPress feed endpoints from returning normal RSS, Atom or RDF content, not merely removing RSS discovery links from the HTML document head.

A standard WordPress installation can expose feeds for much more than the main posts archive.

Depending on the site configuration, feed URLs can include:

https://example.com/feed/

https://example.com/comments/feed/

https://example.com/category/news/feed/

https://example.com/tag/wordpress/feed/

https://example.com/author/jane/feed/

https://example.com/post-slug/feed/

https://example.com/search/security/feed/rss2/

https://example.com/books/feed/

If your objective is to stop WordPress syndication completely, disabling only:

/feed/

is therefore incomplete.

You need to address the WordPress feed handlers themselves and, ideally, remove the standard RSS discovery links that would otherwise continue advertising endpoints you have intentionally disabled.

This guide explains how WordPress feeds work, how to disable native RSS and Atom feeds with WordPress hooks, why an HTTP 404 response is usually cleaner than blindly redirecting every feed to the homepage, how to remove feed discovery links, how to test category, author, comment and custom post type feeds, what integrations to check before disabling RSS and how TheOneWP Disable RSS Feeds handles the complete shutdown.

Quick answer

A straightforward WordPress-level approach is to intercept the native feed actions before Core renders the corresponding feed templates:

function project_disable_rss_feeds() {

    wp_die(
        esc_html__(
            'RSS feeds are disabled on this site.',
            'project'
        ),
        '',
        array(
            'response' => 404,
        )
    );
}

add_action(
    'do_feed_rdf',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_rss',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_rss2',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_atom',
    'project_disable_rss_feeds',
    1
);

Then remove the normal feed-discovery links:

add_filter(
    'feed_links_show_posts_feed',
    '__return_false'
);

add_filter(
    'feed_links_show_comments_feed',
    '__return_false'
);

For a complete site-wide implementation, also verify contextual discovery links, plugin-defined custom feeds and any external integrations that depend on RSS before deploying the change.

What does disabling RSS feeds actually mean?

An enabled WordPress feed normally behaves approximately like this:

GET /feed/

↓
WordPress identifies a feed request

↓
RSS2 feed handler runs

↓
feed template renders

↓
HTTP 200

↓
XML feed content returned

After disabling feeds, the same request should no longer produce the normal syndication document.

For example:

GET /feed/

↓
feed request intercepted

↓
HTTP 404

↓
normal feed template does not render

Disabling a feed is different from hiding it

This distinction is fundamental.

WordPress can advertise feeds through HTML such as:

<link
    rel="alternate"
    type="application/rss+xml"
    title="Example Site Feed"
    href="https://example.com/feed/"
/>

If you remove that element, software inspecting the page may no longer discover the feed automatically.

But:

https://example.com/feed/

can still return RSS when requested directly.

Discovery and delivery are separate layers

Feed discovery
→ HTML metadata
→ feed_links()
→ feed_links_extra()

Feed delivery
→ actual endpoint
→ do_feed()
→ do_feed_* handlers

If your objective is merely to clean up the document head while preserving RSS functionality, see Disable RSS Feeds vs. Remove Feed Links.

For the broader conceptual distinction, see Hiding vs. Disabling WordPress Feeds.

What RSS feeds does WordPress expose?

The most obvious URL is:

/feed/

but WordPress supports contextual feeds for several query types.

Main posts feed

https://example.com/feed/

Site-wide comments feed

https://example.com/comments/feed/

Category feed

https://example.com/category/security/feed/

Tag feed

https://example.com/tag/wordpress/feed/

Author feed

https://example.com/author/jane/feed/

Individual post comments feed

https://example.com/post-slug/feed/

Custom taxonomy feed

https://example.com/topic/development/feed/

Custom post type archive feed

https://example.com/books/feed/

Search feed

https://example.com/search/security/feed/rss2/

The exact structure depends on permalink settings, rewrite configuration and the registered object.

See WordPress RSS Feed URLs Explained for a complete URL map.

WordPress supports multiple feed formats

WordPress Core includes handlers for formats including:

RSS 0.92
RSS 2.0
RDF / RSS 1.0
Atom

The normal default is:

RSS2

which is why:

/feed/

normally returns an RSS 2.0 document.

Alternative format URLs can still exist

For example:

/feed/atom/

/feed/rdf/

/feed/rss/

may represent other supported formats.

Therefore, a configuration that only blocks the literal:

/feed/

path may fail to disable WordPress feed functionality comprehensively.

How WordPress processes a feed request

WordPress Core uses:

do_feed()

to determine which feed type has been requested.

The official do_feed() documentation shows that Core eventually fires a dynamic action:

do_feed_{$feed}

Possible native feed actions include

do_feed_atom
do_feed_rdf
do_feed_rss
do_feed_rss2

The feed handler receives information about whether the current request is a:

post feed
or
comment feed

so the same underlying feed format can serve different query contexts.

RSS2 is used for both posts and comments

The official WordPress:

do_feed_rss2()

handler loads either:

  • the RSS2 posts feed template;
  • the RSS2 comments feed template.

depending on the current feed query.

This is why hooking the feed handler is powerful

If WordPress has already recognized:

/category/news/feed/

as an RSS2 feed query, you do not need a separate hardcoded condition for every possible category URL.

The flow is:

category feed URL
↓
WordPress query
↓
feed = rss2
↓
do_feed_rss2
↓
your blocking callback

Method 1: disable native WordPress feeds with PHP

A focused implementation can intercept the standard native feed formats:

function project_disable_rss_feeds() {

    wp_die(
        esc_html__(
            'RSS feeds are disabled on this site.',
            'project'
        ),
        '',
        array(
            'response' => 404,
        )
    );
}

add_action(
    'do_feed_rdf',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_rss',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_rss2',
    'project_disable_rss_feeds',
    1
);

add_action(
    'do_feed_atom',
    'project_disable_rss_feeds',
    1
);

Why use priority 1?

The normal WordPress feed callbacks need to be prevented from rendering the feed template.

Running the blocking callback at an early priority gives it an opportunity to terminate the request first.

Conceptually:

priority 1
→ custom feed block

later
→ normal Core handler

but execution has already stopped

Why use wp_die()?

WordPress provides:

wp_die()

as its standard mechanism for terminating execution with an error response.

The official wp_die() documentation supports supplying response arguments including an HTTP status code.

Return an actual error status

This is better than producing:

HTTP 200

RSS feeds are disabled.

because a successful HTTP status communicates that the requested resource was served successfully, which is not what happened.

A 404 is a straightforward choice

If the feed no longer exists as a public resource, returning:

404 Not Found

clearly communicates that the requested feed is unavailable.

Do not redirect every feed to the homepage automatically

A common snippet uses:

wp_redirect(
    home_url( '/' )
);

for every feed request.

This produces something conceptually like:

/category/security/feed/
↓
homepage

but those resources are not equivalent.

Homepage redirects can hide the actual configuration

If a feed was intentionally removed, a direct:

404

is often easier to understand, test and monitor than:

feed
→ redirect
→ unrelated HTML page

Use redirects only when there is a genuine replacement

If a specific feed has moved to an equivalent resource, a redirect may be appropriate.

For example:

old syndication endpoint
→ new syndication endpoint

is different from:

every feed
→ homepage

Method 2: remove standard feed discovery links

Disabling endpoints alone can leave WordPress advertising those endpoints inside normal HTML pages.

A complete shutdown should therefore address discovery too.

Hide the main posts feed link

add_filter(
    'feed_links_show_posts_feed',
    '__return_false'
);

Hide the global comments feed link

add_filter(
    'feed_links_show_comments_feed',
    '__return_false'
);

These filters control the standard feed links generated through WordPress’s:

feed_links()

function.

The official feed_links() documentation shows that WordPress checks these filters before outputting the posts and comments discovery links.

What does the discovery markup look like?

Before removal:

<link
    rel="alternate"
    type="application/rss+xml"
    title="Example Site Feed"
    href="https://example.com/feed/"
/>

After removal:

no standard posts-feed discovery link

Contextual feed discovery needs separate consideration

WordPress can advertise feeds specific to the current page through:

feed_links_extra()

The official feed_links_extra() documentation covers contextual discovery.

Contextual links can include

  • single-post comment feeds;
  • category feeds;
  • tag feeds;
  • custom taxonomy feeds;
  • author feeds;
  • search feeds;
  • public custom post type archive feeds.

Modern WordPress provides granular discovery filters

Examples include:

feed_links_extra_show_post_comments_feed

feed_links_extra_show_post_type_archive_feed

feed_links_extra_show_category_feed

feed_links_extra_show_tag_feed

feed_links_extra_show_tax_feed

feed_links_extra_show_author_feed

feed_links_extra_show_search_feed

Example: hide category feed discovery

add_filter(
    'feed_links_extra_show_category_feed',
    '__return_false'
);

Example: hide tag feed discovery

add_filter(
    'feed_links_extra_show_tag_feed',
    '__return_false'
);

Example: hide search feed discovery

add_filter(
    'feed_links_extra_show_search_feed',
    '__return_false'
);

You can also remove the entire Core discovery callbacks

A broader approach is:

add_action(
    'after_setup_theme',
    function () {

        remove_action(
            'wp_head',
            'feed_links',
            2
        );

        remove_action(
            'wp_head',
            'feed_links_extra',
            3
        );
    }
);

Which discovery-removal approach is better?

Granular filters are useful when you want selective control.

For example:

Main feed
→ advertise

Category feeds
→ do not advertise

Search feed
→ do not advertise

Removing:

feed_links
feed_links_extra

is simpler when the objective is:

remove the normal WordPress
RSS discovery layer completely

Do not confuse either technique with feed blocking

These:

remove_action(
    'wp_head',
    'feed_links',
    2
);

remove_action(
    'wp_head',
    'feed_links_extra',
    3
);

do not disable:

/feed/

or any other feed endpoint.

Method 3: disable RSS feeds with TheOneWP

TheOneWP Disable RSS Feeds provides a dedicated module for websites that do not need WordPress’s native feed delivery.

The verified implementation applies blocking callbacks to WordPress feed actions at an early priority.

When a native feed is requested, the module:

intercepts feed request
↓
stops execution
↓
returns HTTP 404
↓
does not render normal feed

The module blocks native RSS and Atom formats

The implementation covers the normal WordPress feed system including:

RSS
RSS2
RDF
Atom

and therefore prevents the corresponding native feed queries from returning their normal syndication content.

Category, tag and author feeds are also affected

WordPress routes these through the same feed architecture.

For example:

/category/security/feed/
↓
RSS2 query
↓
native feed action
↓
blocked

The same principle applies to normal:

  • tag feeds;
  • author feeds;
  • search feeds;
  • native comments feeds.

The module returns 404 rather than redirecting

The verified TheOneWP implementation does not send feed visitors to the homepage.

It terminates the request with:

HTTP 404

and the message:

RSS feeds are disabled on this site.

The module also hides standard feed discovery

The module disables the standard WordPress visibility controls for:

posts feed link
comments feed link

so normal HTML pages do not continue advertising those standard feed endpoints.

It does not delete any content

Disabling the module does not delete:

  • posts;
  • comments;
  • categories;
  • tags;
  • authors;
  • taxonomy terms.

It changes runtime feed behavior.

RSS data is generated from normal WordPress content

There is not a separate database full of duplicate RSS articles that needs to be deleted.

A feed request queries normal WordPress content and renders a syndication representation of it.

Disabling feeds therefore does not remove posts

The architecture is:

WordPress posts
→ remain

HTML pages
→ remain

REST API
→ separate

XML-RPC
→ separate

RSS feed output
→ disabled

The module does not disable the REST API

RSS and REST are separate interfaces.

These are different:

/feed/
→ WordPress feed system

/wp-json/
→ WordPress REST API

Disabling RSS does not inherently disable REST endpoints.

The module does not disable XML-RPC

Likewise:

/xmlrpc.php

is controlled separately.

You can have:

RSS disabled
+
REST enabled
+
XML-RPC enabled

or any other deliberate combination.

Method 4: server-level feed blocking

Feed requests can also theoretically be blocked before WordPress runs.

Possible layers include:

  • CDN;
  • reverse proxy;
  • Nginx;
  • Apache;
  • hosting firewall.

Server-level blocking can reduce PHP work

If a request is rejected before reaching WordPress:

request
↓
web server
↓
404 / 410 / deny
↓
PHP never runs

this can reduce application work for large volumes of unwanted feed traffic.

But URL matching becomes your responsibility

This is the difficult part.

WordPress feed URLs can include:

/feed/

/comments/feed/

/category/.../feed/

/tag/.../feed/

/author/.../feed/

/post-slug/feed/

/custom-taxonomy/.../feed/

/custom-post-type/feed/

A simplistic server rule can easily miss valid WordPress feed routes.

A broad /feed/ regex can also block unrelated URLs

Suppose the site has a real page at:

/customer-feed/

or:

/feedback/

An overly broad pattern matching:

feed

can affect content unrelated to RSS.

Application-level disabling understands WordPress queries

When you hook the native feed actions, WordPress has already determined:

this request is a feed

which makes the implementation easier to reason about.

Use edge or server blocking when you have a real infrastructure reason

Examples include:

  • very high unwanted feed traffic;
  • strict infrastructure policy;
  • sites where PHP should never handle feed requests;
  • platform-wide feed disabling across many installations.

Do not add duplicate blocking everywhere automatically

This stack:

CDN block
+
Nginx block
+
WordPress plugin block
+
theme snippet block

can make troubleshooting unnecessarily confusing.

Use one authoritative layer unless defense-in-depth serves a specific operational purpose.

Where should custom PHP code live?

Suitable locations include:

  • a site-specific plugin;
  • a must-use plugin;
  • a maintained snippets system;
  • a child theme when the behavior is intentionally theme-dependent.

A site-level plugin is usually clearer

Ask:

Should changing the visual theme
re-enable RSS feeds?

If the answer is no, feed policy probably belongs outside the theme.

Do not edit WordPress Core

Never modify:

wp-includes/functions.php

wp-includes/feed.php

wp-includes/feed-rss2.php

wp-includes/feed-atom.php

to disable feeds.

Core updates can overwrite those modifications.

WordPress already exposes the relevant feed actions.

Do not remove feed template files

Deleting:

feed-rss2.php

or similar Core files is not a valid feed-disabling strategy.

It turns an intentional configuration into a broken installation.

Should you disable RSS feeds?

Not every site should.

RSS is still useful because it provides a simple standardized stream of recent content without requiring a proprietary API client.

Keep RSS enabled when it has a real consumer

Examples include:

  • people subscribing through feed readers;
  • RSS-to-email newsletters;
  • content aggregators;
  • automation workflows;
  • syndication partners;
  • monitoring systems;
  • internal applications;
  • publishing pipelines.

Disable RSS when the site genuinely does not use it

Examples can include:

  • small corporate websites with no syndication;
  • private editorial systems;
  • controlled applications where content is distributed through another API;
  • sites intentionally minimizing unused public interfaces.

Do not disable RSS merely because you personally do not use it

A site administrator may never open an RSS reader while an external system requests:

/feed/

every fifteen minutes.

Audit dependencies first

Before disabling feeds on an established website, review:

  • newsletter services;
  • automation platforms;
  • social publishing tools;
  • content syndication services;
  • feed aggregators;
  • monitoring systems;
  • custom applications;
  • partner integrations.

Search the codebase too

Look for references to:

get_feed_link(

get_category_feed_link(

get_author_feed_link(

get_term_feed_link(

/feed/

feed=rss2

in:

  • custom plugins;
  • themes;
  • integration code;
  • deployment configuration.

Check server logs

Access logs can reveal whether feed URLs receive legitimate traffic.

Useful fields include:

request path
timestamp
status
user agent
source IP
response size

A recurring feed request may represent a legitimate system

For example:

GET /feed/
every 30 minutes
from same service user agent

deserves investigation before you remove the endpoint.

Traffic alone does not prove the feed should remain

Bots also request feed URLs.

The purpose of the audit is to separate:

known dependency
from
incidental automated traffic

Check newsletter systems carefully

RSS-to-email services can use:

/feed/

to detect newly published posts.

Disabling the feed can stop newsletter automation without changing anything visible inside WordPress.

Check automation platforms

Workflows can resemble:

new RSS item
↓
create social post
↓
send Slack notification
↓
update CRM

If the first step stops receiving feed data, the entire workflow can stop.

Check feed aggregators

Industry sites, internal dashboards and partner platforms may syndicate WordPress content through RSS because it is easy to consume.

Check podcasting or specialist publishing plugins

Some systems build important product functionality around feeds.

Do not apply a generic WordPress feed shutdown to a podcasting or syndication workflow without understanding what that plugin expects.

Plugins can register custom feeds

WordPress provides:

add_feed()

for custom feed endpoints.

The official add_feed() documentation allows plugins and custom code to introduce feed types beyond the native:

rss
rss2
rdf
atom

A Core-feed blocker may not represent every custom feed

If a plugin registers:

/feed/partners/

or another custom type, determine whether your blocking implementation intercepts that custom action too.

Audit custom feed names

Search for:

add_feed(

inside custom and third-party code where appropriate.

Do not blindly block every custom feed

A custom feed often exists because an application needs it.

Identify the owner and purpose first.

What happens to old content after feeds are disabled?

Nothing is deleted.

Your existing:

  • posts;
  • pages;
  • comments;
  • categories;
  • authors;
  • taxonomies;

remain in WordPress.

Only the feed representation changes

Before:

Post
→ HTML page
→ RSS representation

After:

Post
→ HTML page remains
→ RSS request blocked

Feed settings under Settings → Reading do not disable RSS

WordPress includes options for syndication such as:

Syndication feeds show
the most recent X items

and:

For each post in a feed,
include:
Full text
or
Excerpt

These settings configure feed output.

They do not provide a:

Disable all RSS feeds

switch.

Reducing the number of feed items does not disable feeds

Setting a smaller syndication count only changes the feed query limit.

Using excerpts does not hide the feed

An excerpt feed is still publicly available RSS unless the endpoint itself is blocked.

robots.txt does not disable feeds

You could add a rule such as:

User-agent: *
Disallow: /feed/

but robots.txt is a crawler instruction.

It does not prevent:

curl https://example.com/feed/

from retrieving the resource.

Do not use robots.txt as access control

The distinction is:

robots.txt
→ please do not crawl

HTTP 404 / access control
→ resource unavailable

Removing RSS links does not disable feeds either

This:

remove_action(
    'wp_head',
    'feed_links',
    2
);

changes the document head.

It does not change the response to:

/feed/

Do not use CSS to hide feed links

Feed discovery tags live in:

<head>

They are not visible elements that CSS should hide.

Do not remove feed links with JavaScript

This approach:

render RSS discovery
↓
browser loads JavaScript
↓
JavaScript removes metadata

is the wrong layer.

Software can inspect the original response without running your JavaScript.

Prevent the markup from being generated

Use WordPress hooks and filters at the server level.

Does disabling RSS improve security?

Disabling an unused interface reduces the number of public behaviors the site exposes.

That is a legitimate simplification.

But RSS shutdown is not a replacement for:

  • updates;
  • strong authentication;
  • permissions;
  • security monitoring;
  • backups;
  • application hardening.

RSS feeds are normally public by design

They expose content that is generally already public through normal webpages.

Disabling them does not suddenly protect confidential data that should never have been publicly accessible in the first place.

Does disabling RSS stop scraping?

No.

A scraper can still request:

https://example.com/article/

and parse the HTML.

RSS removal removes one convenient structured source

It may make one form of automated ingestion less convenient.

It does not make public articles non-scrapable.

Do not present RSS blocking as complete anti-scraping protection

If scraping is the actual problem, investigate:

  • rate limiting;
  • bot controls;
  • CDN protections;
  • content-access architecture;
  • legal and licensing measures where relevant.

Does disabling RSS improve performance?

Removing two feed links from ordinary HTML has essentially negligible impact on page weight.

Blocking actual feed requests can reduce feed processing

If the site receives many unnecessary requests to:

/feed/
category feeds
author feeds
search feeds

terminating them early can reduce the work needed to build those feed responses.

But do not disable RSS as a generic performance optimization

If nobody requests the feed, WordPress is not rendering a complete feed on every normal page load just because:

<link rel="alternate">

exists in the page head.

RSS feeds and SEO

RSS is primarily a syndication feature.

Disabling it does not replace ordinary SEO infrastructure such as:

  • canonical URLs;
  • XML sitemaps;
  • robots directives;
  • internal linking;
  • structured data.

Do not confuse feeds with XML sitemaps

RSS
→ recent content syndication

XML sitemap
→ URL discovery for search engines

You can disable RSS while retaining your sitemap.

TheOneWP XML Sitemap handles the separate sitemap layer.

Feed URLs can still be crawled

Because WordPress can expose many feed contexts, a large site can potentially have substantial feed URL surface area.

For example:

500 categories
+
2,000 tags
+
100 authors
+
several taxonomies
+
search feed URLs
+
post comment feeds

can result in many possible feed endpoints.

This does not automatically make them an SEO problem

The decision should still depend on:

  • whether syndication is useful;
  • whether crawlers are spending meaningful resources there;
  • whether feeds are intentionally part of the publishing architecture.

Do not disable functionality solely because another URL exists

WordPress provides different representations of content for different purposes.

Audit actual behavior rather than treating every additional machine-readable URL as inherently harmful.

How to test whether RSS feeds are disabled

Start with the main feed:

https://example.com/feed/

Use curl to inspect the HTTP response

curl -i \
    https://example.com/feed/

An enabled feed normally returns a successful response

You might see:

HTTP/2 200

followed by XML feed output.

A disabled implementation may return

HTTP/2 404

followed by the configured error response.

Do not test only /feed/

A proper audit should include several feed contexts.

Main feed

https://example.com/feed/

Comments feed

https://example.com/comments/feed/

Category feed

https://example.com/category/news/feed/

Tag feed

https://example.com/tag/wordpress/feed/

Author feed

https://example.com/author/jane/feed/

Single post comments feed

https://example.com/example-post/feed/

Custom taxonomy feed

https://example.com/topic/development/feed/

Custom post type feed

https://example.com/books/feed/

Test alternative formats where relevant

For example:

https://example.com/feed/atom/

https://example.com/feed/rdf/

https://example.com/feed/rss/

Inspect the page source too

After disabling feeds, open the HTML source of the homepage and other representative pages.

Search for:

application/rss+xml

A complete shutdown should not advertise disabled native feeds

You do not want:

HTML
→ advertises /feed/

request
→ /feed/ returns 404

unless you deliberately chose that transitional state.

Inspect contextual pages

Check:

  • single post;
  • category archive;
  • tag archive;
  • author archive;
  • search page;
  • custom taxonomy archive;
  • custom post type archive.

Why?

Because WordPress can advertise different feed links according to the current query.

See How WordPress Advertises RSS Feeds by Default for the full discovery architecture.

Check cached responses

A CDN or page cache can make testing misleading.

The sequence may be:

feeds disabled in WordPress
↓
origin returns 404
↓
CDN still holds old RSS
↓
public request returns cached 200

Purge the relevant feed URLs

After changing feed policy, invalidate:

/feed/
/comments/feed/
relevant archive feeds

where your caching layer supports targeted purging.

Do not trust logged-in testing alone

Caching systems often bypass cache for logged-in administrators.

You might see:

404
while logged in

while anonymous clients still receive:

cached RSS 200

Test from an anonymous request

curl is useful because it does not carry your normal WordPress login cookies:

curl -i \
    https://example.com/feed/

Check response body as well as status

A broken implementation could return:

HTTP 200

Feeds disabled

which does not communicate the endpoint state correctly.

Check redirects

Use:

curl -L -i \
    https://example.com/feed/

to discover whether the feed request is actually:

301
↓
homepage
↓
200 HTML

Browser appearance can hide redirects

A browser follows redirects automatically, so simply seeing the homepage after opening:

/feed/

does not tell you whether the endpoint returned:

  • 301;
  • 302;
  • 404;
  • 200.

Inspect HTTP behavior directly

The actual response chain matters.

Testing custom feeds

If plugins register custom feeds, include those in your test matrix.

For example:

/feed/partners/

/feed/products/

/feed/internal-export/

Do not assume a native-feed module blocks plugin-defined feed names

The custom feed may fire:

do_feed_partners

rather than one of the native:

do_feed_rss2
do_feed_atom
do_feed_rdf
do_feed_rss

Review the specific integration.

Should disabled feeds return 404 or 410?

Both statuses communicate that normal content is unavailable, but they have different semantics.

404 Not Found

Communicates that the requested resource is not available.

410 Gone

Communicates that the resource is intentionally and permanently gone.

404 is the simpler general-purpose choice

It works well for a WordPress feature that can later be re-enabled.

If the module is disabled tomorrow:

/feed/
→ can work again

so presenting feed removal as permanently irreversible may not match the site’s actual configuration lifecycle.

Do not obsess over 404 vs 410 while leaving feeds accidentally enabled

The larger requirement is that the endpoint behavior accurately reflects the policy.

Should disabled feeds redirect to the corresponding archive?

You could theoretically map:

/category/security/feed/
↓
/category/security/

but this changes a machine-readable syndication endpoint into an HTML archive.

Only do this when the redirect serves a deliberate migration purpose.

Feed readers expect feed data

Redirecting a feed reader to an HTML page may simply cause parsing failure after another HTTP request.

A direct error is usually clearer

feed requested
↓
feed unavailable
↓
404

is easier to interpret than:

feed requested
↓
redirected
↓
HTML received
↓
feed parser fails

Disabling feeds does not remove feed URLs from external systems immediately

Existing subscribers may continue requesting old feed URLs.

You may therefore see:

404 requests to /feed/

for a long time after disabling RSS.

This does not mean the configuration failed

It means external clients still know the old URL.

Monitor the transition if necessary

For high-value sites, review:

  • request volume;
  • user agents;
  • known integrations;
  • support issues.

after deployment.

Staged feed shutdown

If you are uncertain whether RSS is still used, a staged approach can reduce risk.

Phase 1: inventory feeds

identify main feed
identify comment feeds
identify archive feeds
identify custom feeds

Phase 2: remove discovery

stop advertising feeds
while endpoints still work

Phase 3: monitor

review access logs
identify legitimate consumers

Phase 4: disable endpoints

return 404
for feeds confirmed unnecessary

This staged model is not mandatory

For a new site with no feed integrations, immediate disabling can be perfectly reasonable.

The staged approach is useful mainly when the consequences are uncertain.

How to restore RSS feeds

If you used a custom snippet, remove or disable the callbacks that intercept:

do_feed_rdf
do_feed_rss
do_feed_rss2
do_feed_atom

and restore whichever discovery configuration you previously changed.

With TheOneWP

Disable the:

Disable RSS Feeds

module.

The blocking hooks are no longer registered, allowing normal WordPress feed handling to resume.

Clear caches after restoring feeds

A cached 404 can survive temporarily even after WordPress feeds have been re-enabled.

Purge:

  • WordPress cache;
  • server cache;
  • reverse proxy cache;
  • CDN cache.

where relevant.

Then test the main feed again

curl -i \
    https://example.com/feed/

Confirm that the expected feed content is returned.

Common mistake: disabling only /feed/

WordPress exposes many contextual feed routes.

Common mistake: forgetting comment feeds

Test both:

/comments/feed/

and post-specific comment feeds.

Common mistake: forgetting Atom

Disabling only RSS2 does not necessarily disable:

/feed/atom/

Common mistake: forgetting RDF and legacy RSS

A full native-feed shutdown should consider all supported Core formats.

Common mistake: removing feed links instead of disabling feeds

HTML discovery and endpoint functionality are separate.

Common mistake: disabling endpoints while still advertising them

A complete shutdown should clean up the corresponding discovery metadata too.

Common mistake: redirecting every feed to the homepage

The homepage is not an equivalent feed resource.

Common mistake: returning 200 for an error message

Use an appropriate HTTP error status.

Common mistake: using robots.txt

robots.txt is not endpoint control.

Common mistake: changing Reading Settings

Feed length and excerpt mode do not disable feed delivery.

Common mistake: deleting Core feed templates

Use hooks instead of damaging the WordPress installation.

Common mistake: editing Core files

Updates will eventually erase your modification and leave future maintainers wondering who thought this was a sensible deployment strategy.

Common mistake: placing permanent site policy in a parent theme

Use a maintained site-level implementation when feed policy should survive theme changes.

Common mistake: not auditing newsletter integrations

RSS-to-email is still a legitimate workflow.

Common mistake: assuming nobody uses RSS because there is no visible RSS button

Machine clients do not require a visible subscription button.

Common mistake: ignoring access logs

Established sites can have hidden dependencies.

Common mistake: disabling RSS to stop all scraping

Public HTML remains retrievable.

Common mistake: calling RSS disabling a major security feature

It removes an unused public interface. It does not replace a security architecture.

Common mistake: calling RSS disabling a major frontend performance optimization

Normal page requests do not render complete feed documents unless a feed is requested.

Common mistake: confusing RSS with REST

Disabling one does not disable the other.

Common mistake: confusing RSS with XML-RPC

They are different systems.

Common mistake: confusing RSS with XML sitemaps

Syndication and search-engine URL discovery solve different problems.

Common mistake: forgetting custom feeds

Plugins can use:

add_feed()

to register their own feed names.

Common mistake: blocking every URL containing the word feed

A server regex should not accidentally block unrelated routes such as:

/feedback/

/product-feed-settings/

/customer-feedback/

Common mistake: testing while logged in only

Anonymous caches can behave differently.

Common mistake: forgetting the CDN

A CDN can continue serving cached XML after the WordPress configuration changed.

Common mistake: forgetting rollback

Document how RSS can be restored if an integration turns out to depend on it.

Complete RSS disabling checklist

  • Determine whether the site actually needs RSS.
  • Identify the main posts feed.
  • Identify the site comments feed.
  • Identify individual post comment feeds.
  • Identify category feeds.
  • Identify tag feeds.
  • Identify author feeds.
  • Identify search feeds.
  • Identify custom taxonomy feeds.
  • Identify custom post type archive feeds.
  • Search for plugin-defined custom feeds.
  • Review calls to add_feed().
  • Check newsletter integrations.
  • Check automation workflows.
  • Check content aggregators.
  • Check monitoring systems.
  • Check partner syndication.
  • Review access logs where useful.
  • Understand that feed discovery and feed delivery are separate.
  • Block native feed handlers when endpoint shutdown is required.
  • Cover RSS.
  • Cover RSS2.
  • Cover RDF.
  • Cover Atom.
  • Return an intentional HTTP status.
  • Prefer a direct error over an unrelated homepage redirect unless a real replacement exists.
  • Remove standard feed discovery links.
  • Review contextual feed discovery.
  • Do not rely on robots.txt.
  • Do not rely on Reading Settings.
  • Do not rely on CSS.
  • Do not rely on JavaScript.
  • Do not modify WordPress Core.
  • Do not delete feed templates.
  • Do not confuse RSS with REST.
  • Do not confuse RSS with XML-RPC.
  • Do not confuse RSS with XML sitemaps.
  • Do not describe feed removal as complete anti-scraping protection.
  • Do not describe it as a substitute for security hardening.
  • Test the main feed directly.
  • Test the comments feed.
  • Test a category feed.
  • Test a tag feed.
  • Test an author feed.
  • Test a post comments feed.
  • Test a custom taxonomy feed where applicable.
  • Test a custom post type feed where applicable.
  • Test Atom where applicable.
  • Inspect page-source discovery links.
  • Inspect HTTP status codes.
  • Inspect redirect chains.
  • Clear WordPress caches.
  • Clear server caches.
  • Clear CDN caches.
  • Test anonymously.
  • Document the feed policy.
  • Document how to restore RSS.

Related guides

Final recommendation

Disabling RSS feeds in WordPress should be treated as the removal of a real publishing interface rather than as a cosmetic head-cleanup tweak.

The architecture is:

WordPress query
↓
feed request recognized
↓
do_feed()
↓
do_feed_{$feed}
↓
feed template
↓
RSS / Atom response

If the objective is to stop that output, intercept the feed handlers rather than blocking only one literal URL.

A practical native implementation can target:

do_feed_rdf
do_feed_rss
do_feed_rss2
do_feed_atom

at an early priority and terminate the request with an HTTP error response.

Then remove the corresponding RSS discovery metadata so ordinary HTML pages do not continue advertising endpoints that no longer work.

Before deploying the change on an established site, audit the systems that may consume feeds:

newsletter services
automation
aggregators
partner syndication
monitoring
custom applications

Also verify plugin-defined feeds separately because WordPress allows custom feed types to be registered beyond the standard RSS, RSS2, RDF and Atom formats.

After deployment, test more than:

/feed/

Check:

main feed
comments feed
category feed
tag feed
author feed
post comments feed
custom taxonomy feeds
custom post type feeds
alternative formats

and inspect the actual HTTP response rather than relying only on what a browser appears to display.

TheOneWP Disable RSS Feeds provides this behavior as a dedicated module. The verified implementation intercepts the native WordPress feed system at an early priority, returns HTTP 404 when those feed endpoints are requested and suppresses the standard post and comment feed discovery links without deleting the site’s content or altering the REST API or XML-RPC.

If your requirement is less aggressive and RSS should remain available to known consumers, do not disable the endpoints. Use Disable RSS Feed Links instead to remove standard discovery while keeping feed delivery intact.

The useful decision is therefore:

Need RSS?
→ keep it

Need RSS but not autodiscovery?
→ remove feed links only

Do not need RSS at all?
→ disable feed handlers
+
remove discovery

That keeps the implementation aligned with the actual requirement rather than disabling functionality simply because WordPress happens to expose it by default.

Simplify your WordPress stack

A modular WordPress toolkit. 104 focused tools.

Ultimately, you can build cleaner workflows, maintain fewer plugins and enable only the features each website actually needs.