RSS and Atom Subscription Guide: WordPress Feed Discovery, Validation, and Migration

RSS and Atom: WordPress Feed Discovery, Validation, and Migration

A modern site does not need a separate subscription button for every reader. A more durable design publishes one stable, valid RSS or Atom URL, advertises it in the page <head>, and provides an understandable ordinary link. A reader can give that same URL to any compatible application, and the site is not tied to one vendor.

This edition was last checked on September 1, 2026. The 2011 article is preserved at the end as historical evidence; its service buttons must not be reused.

1. Status of the Old Services

2011 entry point2026 evidenceMaintained treatment
Google ReaderGoogle officially announced that Google Reader would retire on July 1, 2013Discontinued; no subscription button
XianguoThe former button domain now redirects to a domain marketplaceNot a stable subscription destination; no link
ZhuaxiaThe old host did not resolve during this audit, and no current official button documentation was foundClassified only as unsuitable now; no invented shutdown date
QQ Mail subscription entryThe old HTTP host did not connect during this audit, and no current official RSS-button documentation was foundNot used as a current entry point; no forced QQ login
Third-party image downloadThe old URL was an insecure account-like download pathNarrowly removed from the public archive

Google Reader's date is supported by the official Google announcement. For the other services, the table reports only the endpoint audit observed on September 1, 2026. It does not invent a formal shutdown date where no first-party notice was available.

2. Choose a Stable Feed URL

WordPress generates several feeds by default. With pretty permalinks enabled, common routes are shown below; the last line is the query-form RSS 2.0 fallback:

https://example.com/feed/
https://example.com/feed/atom/
https://example.com/comments/feed/
https://example.com/category/news/feed/
https://example.com/?feed=rss2

Choose one HTTPS main feed as the canonical address, usually /feed/. Use that same absolute URL in pages, discovery markup, site documentation, and configuration. Expose category, tag, and comment feeds only when readers need them, so a cluster of similar choices does not create confusion.

3. Add Standards-Based Autodiscovery

For feed autodiscovery, WHATWG specifies rel="alternate" and recognizes application/rss+xml and application/atom+xml. Add this to <head>:

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

Each title should identify the site and format, and each href should be the final absolute HTTPS address. If you maintain only one format, publish one declaration rather than advertising a broken or duplicative feed.

WordPress block themes enable automatic feed links by default. A classic theme can enable them during theme setup in functions.php:

<?php
add_action( 'after_setup_theme', function () {
    add_theme_support( 'automatic-feed-links' );
} );

Inspect the rendered HTML source afterward so a theme, SEO plugin, and handwritten markup do not emit duplicate discovery links.

4. Offer a Vendor-Neutral Subscription Entry

A page can say “Subscribe via RSS” or “Copy the feed URL into your preferred reader.” Do not restore “Add to Google/Xianguo/Zhuaxia/QQ” buttons or automatically open a third-party login page.

Reader selection criteria include RSS and Atom support, keyboard and screen-reader access, local versus synchronized storage, offline use, privacy policy, cost, maintenance status, and OPML import/export. This guide does not endorse a vendor. An open URL and exportable subscription list outlast a branded button.

5. RSS and an Email Newsletter Are Different Channels

A feed reader periodically fetches public XML; the publisher normally does not need the reader's email address. A newsletter collects an address and pushes messages. Never turn feed subscribers into email contacts automatically.

If you offer a newsletter:

  • State beside the form who sends it, what it contains, frequency, data uses, processors, and the privacy notice.
  • Obtain and record valid consent or another lawful basis as required by the relevant jurisdiction. Do not use preselected boxes, purchased lists, or addresses collected for another purpose.
  • Provide an available, easy-to-find unsubscribe that takes effect promptly, retaining only the suppression record needed to honor it.
  • Restrict access and retention, put required data-processing terms in place, and handle access, deletion, and complaint requests.
  • Rules vary with sender and recipient location. The UK ICO electronic-mail marketing guide and the US FTC CAN-SPAM guide are official starting points for two jurisdictions, not substitutes for local legal advice.

6. Diagnose HTTP, MIME, Caching, and Redirects

A usable feed should stay within these boundaries:

  • Use HTTPS and return successful XML after a bounded number of redirects, not a login page, CAPTCHA, WAF challenge, or HTML error.
  • RSS autodiscovery uses application/rss+xml; Atom uses application/atom+xml as defined by RFC 4287. Do not return every feed as text/html.
  • XML must be well formed. RSS item guid values or Atom id values, item links, and dates should be stable and parseable.
  • ETag, Last-Modified, and a reasonable Cache-Control help readers make conditional requests. Caching should neither hide new posts for a long time nor force every request to transfer the full document.
  • Redirects must not loop or form a long chain. The final URL, discovery markup, and visible links should agree after migration.

The following uses curl and the Python standard library to inspect the complete response chain, headers, XML structure, and root element without third-party packages:

FEED_URL='https://example.com/feed/'
feed_xml="$(mktemp)"
feed_headers="$(mktemp)"
trap 'rm -f -- "$feed_xml" "$feed_headers"' EXIT

curl --fail --silent --show-error 
  --location --max-redirs 5 
  --dump-header "$feed_headers" 
  --output "$feed_xml" 
  "$FEED_URL"

sed -n '1,30p' "$feed_headers"

FEED_FILE="$feed_xml" python3 - <<'PY'
from pathlib import Path
import os
import xml.etree.ElementTree as ET

path = Path(os.environ["FEED_FILE"])
data = path.read_bytes()
root = ET.fromstring(data)
name = root.tag.rsplit("}", 1)[-1]

if name not in {"rss", "feed", "RDF"}:
    raise SystemExit(f"unexpected root element: {root.tag}")

print(f"well-formed XML; root={root.tag}; bytes={len(data)}")
PY

Then inspect the final Content-Type, cache headers, and body manually. XML parsing is only the first layer. Validate a public feed interactively with the W3C Feed Validation Service. Its terms do not permit using the public service as an automated batch API; CI should run an approved local validator.

7. Accessible Entry Points, Icons, and Brands

  • Use understandable link text such as “Subscribe via RSS,” not an unnamed orange icon by itself.
  • When an icon repeats adjacent text, it can be decorative. If the icon is the only content, its image alternative or SVG accessible name must communicate “RSS feed.”
  • Keep a visible keyboard focus indicator, sufficient contrast, and adequate target size. The link must remain understandable without color or a hover tooltip.
  • A generic feed graphic can aid recognition, but do not present a discontinued service's logo as a current feature or imply vendor endorsement. Check trademark terms and current brand guidance before using branded assets.
  • Do not put subscription behind an automatic popup, compulsory sign-in, or agreement to email marketing.

8. Analytics and Privacy

Feed requests can come through shared proxies, cloud readers, caches, or several devices, so request count is not person count. Limit metrics to coarse operational data such as success rate, latency, traffic, and error type; do not advertise a fictional “subscriber count.”

Server logs can contain IP addresses, User-Agent values, and timestamps. Explain their purpose where applicable and limit access and retention. Do not put email addresses, user IDs, unique tracking parameters, or advertising redirects in feed URLs, guid values, Atom id values, or item links. Complete a privacy assessment and obtain any locally required consent before adding other tracking technology.

9. Migrate Without Losing Subscribers

  1. Select and validate the new canonical HTTPS feed, including content, IDs, dates, and MIME.
  2. Keep the old URL reachable and issue a server-side permanent redirect to the new one. Choose 301 or 308 for the deployment and client compatibility; do not use JavaScript or meta refresh.
  3. Avoid chains, and test GET plus conditional requests. Never redirect a feed to the home page.
  4. Update <link rel="alternate">, visible subscription links, documentation, and configuration.
  5. Keep item guid or Atom id values unchanged, or readers may treat old posts as new.
  6. Retain the old route for the long term and monitor errors. Consider removal only after readers have demonstrably migrated.
  7. When changing email providers, separately migrate consent evidence, suppression records, and privacy notices. Never import feed-request logs as a mailing list.

Permanent redirect semantics are defined in RFC 9110, and caching behavior in RFC 9111.

10. Complete Dependency-Free HTML Example

This page provides both autodiscovery and accessible text links without scripts, remote icons, or analytics. Replace the domain, titles, and newsletter page before publishing.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Example Site subscriptions</title>
  <link
    rel="alternate"
    type="application/rss+xml"
    title="Example Site — RSS"
    href="https://example.com/feed/"
  >
  <link
    rel="alternate"
    type="application/atom+xml"
    title="Example Site — Atom"
    href="https://example.com/feed/atom/"
  >
  <style>
    body {
      max-width: 48rem;
      margin: 2rem auto;
      padding: 0 1rem;
      font: 1rem/1.6 system-ui, sans-serif;
    }
    a:focus-visible {
      outline: 0.2rem solid currentColor;
      outline-offset: 0.2rem;
    }
  </style>
</head>
<body>
  <header>
    <h1>Example Site</h1>
  </header>
  <main>
    <section aria-labelledby="subscribe-heading">
      <h2 id="subscribe-heading">Subscribe</h2>
      <p>Copy either feed URL into any standards-compatible feed reader.</p>
      <ul>
        <li><a href="https://example.com/feed/">Subscribe via RSS</a></li>
        <li><a href="https://example.com/feed/atom/">Subscribe via Atom</a></li>
      </ul>
      <p>
        Prefer email?
        <a href="/newsletter/">Review the separate newsletter terms</a>.
      </p>
    </section>
  </main>
</body>
</html>

11. Pre-Publish Validation Checklist

  • [ ] The canonical feed uses HTTPS and needs no cookie, login, or JavaScript.
  • [ ] RSS or Atom format, MIME, and <link rel="alternate"> declaration agree.
  • [ ] XML structure, titles, item links, dates, and stable IDs are validated.
  • [ ] The page has a visible, focusable, clearly named ordinary feed link.
  • [ ] No old reader buttons, dead logos, private downloads, or vendor login entry remains.
  • [ ] Headers, bounded redirects, caching, and conditional requests have been inspected.
  • [ ] W3C Feed Validator was used interactively; private or batch material uses a local tool.
  • [ ] Feed URLs and item identifiers contain no email, personal ID, or unique tracking parameter.
  • [ ] The newsletter has separate notice, lawful basis, unsubscribe, retention, and vendor governance.
  • [ ] Migration keeps a permanent old-URL redirect and stable guid or Atom id.
  • [ ] Reader choice stays neutral, with keyboard, zoom, and assistive-technology testing.

12. Authoritative Sources

13. Original 2011 Archive

The complete visible source_export body follows except for the disclosed values. Only trailing whitespace was normalized; the historical logId tracking parameter was removed from the Zhuaxia link, and the account-like private path in the third-party download URL was replaced with a placeholder. The unmodified export remains at the repository's source_export path.

Warning: the following services, buttons, sign-in entry points, and HTTP links are historical evidence, not current subscription or download destinations.

给博客增加RSS订阅到Google、鲜果、抓虾、QQ邮箱功能


 一直想把水石居的订阅部分修改一下,直到现在才有时间处理,现在唯一提供的是QQ订阅的功能。今天终于有时间把抓虾、Google reader和鲜果都玩了一把。对水母这种平时很忙的人来说,RSS订阅还是比较有用的,可以及时查看自己关注的博客是否有更新,不用一个个的敲入网址访问了。

 我们要做的就是获取RSS订阅按钮和代码,然后放到我们的网站上即可。目前Google Reader、抓虾、鲜果和QQ邮箱都提供自动生成订阅按钮和代码的功能,我们只需要访问相应的网址,输入我们的RSS源地址以及其他一些样式配置信息等即可生成订阅代码,一般wordpress博客的RSS源地址为:http://您的域名/feed

**RSS订阅到Google Reader**

 生成订阅代码的网址是:
[http://www.google.com/intl/zh-cn/webmasters/add.html](http://www.google.com/intl/zh-cn/webmasters/add.html)
 这个网页是全英文的,不懂英语也没有关系,总共就三个选项加一个填空,选项选第一个就可以,填空的地方填写自己的RSS源地址,然后点击【Generate HTML】按钮就可以生成代码了,另外还是生成一个测试按钮,点击可以查看订阅时的效果。

**RSS订阅到鲜果**

 鲜果订阅按钮生成网址:
[http://xianguo.com/tools/sub_button](http://xianguo.com/tools/s ub_button)
 鲜果的样式也比较丰富,随便选一个,输入博客地址即可生成相关代码。

**RSS订阅到抓虾**

 抓虾订阅按钮生成网址:
[http://www.zhuaxia.com/help/help_sub_1.php](http://www.zhuaxia.com/help/help_sub_1.php)
 相比较Google,抓虾的可选按钮样式要丰富的多,有卡通、星座、性感、清爽和经典五大类,在抓虾中直接输入博客地址即可实现订阅。

**RSS订阅到QQ邮箱**

 这个要稍微麻烦一点,首先用QQ号登陆:
[http://list.qq.com](http://list.qq.com/)
 在这里可以创建栏目,接下来一步步来就可以了,每步都比较简单,相信这点小事难不倒大家的。
 我是校园网,无法显示图片,可以先下载了,再传到自己的博客空间里,附上下载地址:
[historical private download path redacted]

**使用方法**

 在wordpress博客中有个小工具叫【文本】,其中可以输入任意的文本和HTML代码,剩下的不用多说了吧!

Leave a Reply