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" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns="http://www.w3.org/2005/Atom"> <xsl:param name="base_url" select="atom:feed/atom:link[@rel='self']/@href" /> <xsl:template match="/"> <xsl:apply-templates select="node()" /> </xsl:template> <xsl:template match="*"> <xsl:element name="{name(.)}"> <xsl:apply-templates select="node()" /> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy-of select="." /> </xsl:template> <xsl:template match="atom:feed"> <feed> <xsl:apply-templates select="@*|node()" /> <xsl:call-template name="process_feed_page"> <xsl:with-param name="page" select="number('2')" /> </xsl:call-template> </feed> </xsl:template> <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" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:transform>
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="http://blog.bigsmoke.us/author/halfgaar/feed/atom" />
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
Invocation is simple. I use libxslt‘s xsltproc:
xsltproc wordpress-full-atom-feed.xsl http://blog.bigsmoke.us/author/halfgaar/feed/atom
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.
Recent Comments