Previously, I tried obtaining a full Atom feed without pagination from WordPress. I didn’t succeed, so I ended up writing an XSL transformation which merges all the pages of this Atom feed into one valid Atom XML stream.

The transformation: wordpress-full-atom-feed.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
<xsl:param name="base_url" select="atom:feed/atom:link[@rel='self']/@href" />
<xsl:template match="/">
  <xsl:apply-templates select="node()" />
<xsl:template match="*">
  <xsl:element name="{name(.)}">
    <xsl:apply-templates select="node()" />
<xsl:template match="@*|node()">
  <xsl:copy-of select="." />
<xsl:template match="atom:feed">
    <xsl:apply-templates select="@*|node()" />
    <xsl:call-template name="process_feed_page">
      <xsl:with-param name="page" select="number('2')" />
<xsl:template name="process_feed_page">
  <xsl:param name="page" />
  <xsl:variable name="page_doc" select="document(concat($base_url, '?paged=', $page))" />
  <xsl:if test="$page_doc/atom:feed/atom:entry">
    <xsl:apply-templates select="$page_doc/atom:feed/atom:entry" />
    <xsl:call-template name="process_feed_page">
      <xsl:with-param name="page" select="$page + 1" />

The transformation works by processing the atom:feed element. Before closing that, the process_feed_page template is called. This template tries to open the next page and process all atom:entry elements in there. Then it tries to recurse to the next page.

The next page’s URL can be guessed because this is the normal feed URL with ?paged=[pagenum] appended to it. The feed URL can be found because WordPress adds it to the feed:

<link rel="self" type="application/atom+xml" href="" />

For very old WordPress versions this doesn’t work, because the paged parameter isn’t supported there. Also, older versions might require you to supply the $base_url param to the XSLT processor, because the rel='self' link is incorrectly set to the URL of the default feed within all other feeds (such as the author feed or the tag feed).


Invocation is simple. I use libxslt‘s xsltproc:

xsltproc wordpress-full-atom-feed.xsl

That’s it. You end up with a full feed as if there never was any pagination to begin with; it almost looks as if WordPress does support the nopaging option for feeds.