Newsfeeds in Joomla
Almost every part of Joomla is built to publish your own content: articles, contacts, banners. News Feeds is the exception. It is the one core component that does the opposite - it consumes content from other websites and shows it on yours.
In practice, a News Feed is a subscription to an external RSS or Atom feed. You give Joomla a URL, and Joomla fetches the latest headlines from that address and renders them as a list. No copy-paste, no manual updates: when the source publishes something new, your page reflects it.
Joomla's built-in RSS and Atom reader from setup to the developer model behind it.
This article explains how the News Feeds component (com_newsfeeds) really works. It covers the basics for website owners, the practical setup for administrators, and the technical details for developers. You will learn how to create feeds, how Joomla fetches and parses them, where the data lives, and how to avoid the most common mistakes.
1. The Basics
1.1 The Two Building Blocks
News Feeds has only two concepts you need to learn:
| Concept | What it is | Database table |
|---|---|---|
| News Feed | A subscription to one external RSS or Atom URL. | #__newsfeeds |
| Category | A group of feeds, used for lists and access control. | #__categories |
A News Feed belongs to exactly one Category. This is the same nested category tree that articles use, so if you already know Joomla categories, you know most of this. There is no client, no form, and no creative material here - just "a URL we fetch and render".
1.2 The Moving Parts
It helps to see the whole chain at once:
Category ── News Feed → external URL → RSS/Atom XML → parsed items
(the record) (link field) (fetched live) (rendered list)
- The News Feed is a stored record that points at a feed URL.
- The Category is how you group feeds for list views and permissions.
- The feed itself lives on someone else's server. Joomla fetches it when the page renders.
This is the key idea to keep in mind: everything else in Joomla stores your data. News Feeds store a pointer to data you do not own.
1.3 Where to Find It
In the Joomla 6 backend you manage feeds in two places:
Components → News Feeds → Feeds (the subscriptions)
Components → News Feeds → Categories (grouping)
The front-end display is driven by menu items:
Menus → New → News Feeds → (Single News Feed / List in Category / List All Categories)
1.4 What a News Feed Actually Holds
A single feed record stores a small set of fields:
| Field | Purpose |
|---|---|
| Name | The internal and display label for the feed. |
| Link | The RSS or Atom feed URL. This is the whole point of the record. |
| Category | Which com_newsfeeds category it lives in. |
| # Articles | numarticles - how many items to show. |
| Cache Time | cache_time - an intended refresh interval in seconds (see section 7). |
| Feed Direction | rtl - render right-to-left for right-to-left languages. |
| Images | Two optional images to frame the feed block. |
Display options such as "show feed image", "show item descriptions", and "character count" live in the params column as JSON.
2. Creating News Feeds
2.1 Create a Category First
A feed must live in a category, so set one up before you add feeds:
Components → News Feeds → Categories → New
This is an ordinary Joomla category with extension = com_newsfeeds. It uses the same nested tree, the same access control, and the same Rebuild button as article categories.
2.2 Create the News Feed
Now add the feed itself:
Components → News Feeds → Feeds → New
Three fields are required:
- Name: the label for the feed.
- Link: the feed URL, for example
https://www.joomla.org/announcements?format=feed&type=rss. - Category: which
com_newsfeedscategory it belongs to.
Tip: many Joomla sites expose their own feeds. You can often append ?format=feed&type=rss to a category blog URL to get a usable feed address.
2.3 Display Fields on the Feed
Each feed has a set of display fields that control how the items appear:
| Field | Effect |
|---|---|
| # Articles | Cap the number of items rendered (numarticles). |
| Show Feed Image | Render the feed's own logo or image (show_feed_image). |
| Show Feed Description | Render the feed's channel description (show_feed_description). |
| Show Item Description | Render each item's summary (show_item_description). |
| Characters | Truncate each item description (feed_character_count). |
| Feed Display Order | Newest first (des) or oldest first (asc). |
| Feed Direction | Flip text direction for right-to-left feeds (rtl). |
Each field also has a Use Global option. The global defaults live in the component Options.
2.4 The Two Framing Images
A feed can carry two images (image_first and image_second), each with alt text, a caption, and a float setting:
[ image_first ] ← e.g. a "powered by" or partner logo
...feed items...
[ image_second ]
The float_first and float_second settings control left, right, or no placement. This is handy when you want to brand a syndicated block with a partner logo.
2.5 No Custom Fields Here
Unlike Contacts and Articles, com_newsfeeds does not support Custom Fields. There is no "Fields → News Feeds" context.
The reason is logical: the feed's content comes from the remote source, so per-record custom fields would have nowhere to render. If you need to group and label feeds, use categories instead.
Back to top3. Displaying News Feeds
3.1 A Feed Does Nothing Without a Menu Item
Like most Joomla content, a news feed is just a record until a menu item renders it. There are three menu item types:
| Menu item type | What it shows |
|---|---|
| Single News Feed | One feed, fetched and rendered as a list of items. |
| List News Feeds in a Category | A list of feeds (links) in one category. |
| List All News Feed Categories | The category tree shown as links. |
Note the important difference: the List view lists the feeds themselves, not their items. Only the Single view fetches and shows actual headlines.
3.2 The Single News Feed View
This view combines the feed's display fields with the menu item options. The result looks like this:
[ feed image ] Feed Title
Feed description
────────────────
• Item headline 1 → links to source
item description (truncated)
• Item headline 2 → links to source
• ... up to numarticles
Each headline links out to the original article on the source site, not to a page on yours.
3.3 The Three-level Display Inheritance
Whether a field shows is resolved in a fixed order. This is the same pattern that Contacts and Banners use:
News Feed (edit screen) Show / Hide / Use Global
└─ Menu item options Show / Hide / Use Global
└─ Component Options (global default)
"Use Global" is the glue. Set a value once in Options, then override it per menu item or per feed only where you need to.
3.4 Template Overrides
Every view can be overridden per template:
components/com_newsfeeds/tmpl/newsfeed/default.php
templates/<your_template>/html/com_newsfeeds/newsfeed/default.php ← override
This is where you turn a plain list of headlines into cards, a ticker, or a two-column layout. The data (the fetched feed) and the presentation (the layout) stay separate, so you override the view, never the parser.
3.5 The Shortcut: mod_feed
There is a second, much lighter way to put a feed on a page: the core Feed Display module.
Content → Site Modules → New → Feed Display (mod_feed)
The two approaches solve different problems:
com_newsfeeds (component) | mod_feed (module) | |
|---|---|---|
| Stores a feed record | Yes (#__newsfeeds) |
No - URL typed into the module |
| Categories | Yes | No |
| Manage many feeds | Yes | One per module instance |
| Needs a menu item | Yes | No - drops into any position |
| Access control / SEF routing | Yes | No |
| Best for | A managed feed directory | A single sidebar or footer headline block |
Both use the same FeedFactory under the hood. With mod_feed you paste the URL straight into the module and set the item count, description, and word limit. There is no category, no record, and no menu item.
Rule of thumb: one feed in a sidebar uses mod_feed. A browsable, categorised directory of feeds uses com_newsfeeds.
4. How the Feed Is Fetched and Parsed
4.1 Fetched Live, in the View
This component has a distinctive quirk. The model loads the newsfeed record (its name, link, and params), but the view fetches the actual remote feed:
// components/com_newsfeeds/src/View/Newsfeed/HtmlView.php
$feed = new FeedFactory();
$this->rssDoc = $feed->getFeed($item->link);
So the remote HTTP call happens at render time, inside the HTML view. It does not happen in the model, and it does not happen on a schedule. Most Joomla components keep all data access in the model, so feeds break that rule on purpose.
4.2 The FeedFactory and Its Parsers
Joomla ships its own feed library (it no longer uses SimplePie):
libraries/src/Feed/
FeedFactory.php picks a parser by root tag
Feed.php / FeedEntry.php data objects
Parser/RssParser.php <rss> parsed
Parser/AtomParser.php <feed> parsed
FeedFactory::getFeed() reads the XML, looks at the root element, and dispatches to the matching parser:
<rss> → RssParser
<feed> → AtomParser
There are two feed formats in the wild. They share the same idea but have a different shape. RSS wraps items in a channel:
<rss version="2.0">
<channel>
<title>Example Site</title>
<item><title>Headline</title><link>https://...</link></item>
</channel>
</rss>
Atom (the newer standard) uses entry elements instead:
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Example Site</title>
<entry><title>Headline</title><link href="https://..."/></entry>
</feed>
Either way, you get back the same Feed and FeedEntry objects. The parser hides the format difference from the view.
4.3 The Two-step Fetch with a Fallback
getFeed() tries the cheap path first, then falls back to a more capable one:
1. XMLReader::open($uri) native, streams the URL directly
2. if that fails:
HttpFactory()->get($uri) cURL or sockets, with a spoofed User-Agent
then XMLReader::XML($body)
The fallback sets a browser User-Agent string:
$options->set('userAgent',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0');
Many feed servers reject the default PHP or XMLReader agent. Pretending to be Firefox is how Joomla gets a 200 OK back from those servers.
4.4 Display Order
After parsing, the view applies your chosen order:
$feed_display_order = $params->get('feed_display_order', 'des');
if ($feed_display_order === 'asc') {
$this->rssDoc->reverseItems(); // oldest first
}
- des (the default): newest item first, as the source provides it.
- asc: reverse to oldest first, which is useful for sequential or chronological feeds.
4.5 When the Feed Cannot Be Loaded
If getFeed() throws an error - a bad URL, a non-200 response, or malformed XML - the view degrades gracefully:
COM_NEWSFEEDS_ERRORS_FEED_NOT_RETRIEVED
Joomla shows a message instead of the items, and the page does not crash. Common causes are: the source is down, the URL moved, there is a TLS or certificate issue, or the source is blocking your server's IP address.
Back to top5. Categories and Access Control
5.1 News Feeds Use the Shared Category System
Feed categories are ordinary Joomla categories with extension = com_newsfeeds:
#__categories WHERE extension = 'com_newsfeeds'
This means they get the same nested tree, the same Rebuild button, and the same access control machinery as article categories. If you want the deeper lft and rgt nested-set details, see my separate article Focus on Categories.
5.2 Why Categories Matter Here
- A List Categories menu item targets a category, and that becomes your feed directory.
- You can organise feeds by topic, partner, region, or language.
- Permissions inherit down the tree: Create, Edit, Edit State, and Delete.
5.3 Access and Language
- The Access level on the feed controls who can view it.
- The view double-checks both the feed's access and its category's access before rendering.
- The Language setting lets a feed appear only on its matching site language.
6. Plugins and Integrations
6.1 Two Core Plugins Extend the Component
The ecosystem around News Feeds is small. Two core plugins extend it:
| Plugin | Type | What it does |
|---|---|---|
| News Feeds | finder | Smart Search indexer - feeds appear in site search. |
| News Feeds | webservices | Enables the REST API routes. |
There is no form plugin, no creator plugin, and no privacy plugin - feeds hold no personal data about your users.
6.2 Smart Search (Finder)
The finder plugin lives at plugins/finder/newsfeeds:
protected $context = 'Newsfeeds';
protected $extension = 'com_newsfeeds';
protected $table = '#__newsfeeds';
It indexes the feed records (their name and description) when you save them. Note that it indexes your description of the feed, not the live remote items.
6.3 Web Services API (Headless)
The component ships REST routes, enabled by the webservices plugin:
api/components/com_newsfeeds/src/Controller/FeedsController.php
protected $contentType = 'newsfeeds';
The plugin registers both the feeds and their categories, so the following routes are available:
GET /api/index.php/v1/newsfeeds
GET /api/index.php/v1/newsfeeds/{id}
GET /api/index.php/v1/newsfeeds/categories
One thing to remember: the API returns the feed records (the URLs and settings). Fetching and parsing the remote feed is still the client's job.
Back to top7. Under the Hood (Developer View)
7.1 One Table
The component is small. It uses a single dedicated table:
#__newsfeeds the feed subscriptions + display params
Plus rows in the shared #__categories table where extension = com_newsfeeds.
7.2 Key Columns in #__newsfeeds
id, name, alias identity + SEF slug
catid category id (→ #__categories)
link the RSS/Atom feed URL (varchar 2048)
numarticles how many items to render
cache_time intended cache duration (seconds, default 3600)
rtl render right-to-left
description editor-entered description of the feed
images JSON: image_first / image_second + alt/caption/float
params JSON: show_feed_image, show_item_description,
feed_character_count, feed_display_order, ...
metakey/metadesc/metadata SEO + robots
published, access, language, ordering, hits, version
publish_up / publish_down scheduling window
7.3 The MVC Layout
The code is split across the three standard Joomla application areas:
administrator/components/com_newsfeeds/ ← manage feeds + categories
src/Model/NewsfeedModel.php, NewsfeedsModel.php
src/Table, src/Controller, tmpl/, forms/newsfeed.xml
components/com_newsfeeds/ ← front-end views
src/Model/NewsfeedModel.php (loads the feed RECORD)
src/Model/CategoryModel.php (list feeds in a category)
src/Model/CategoriesModel.php (category tree)
src/View/Newsfeed/HtmlView.php (FETCHES + parses the live feed)
src/Service/Router.php
api/components/com_newsfeeds/ ← REST
src/Controller/FeedsController.php
The interesting split is the one mentioned earlier: the model loads the record, but the view does the remote fetch.
7.4 cache_time - the Vestigial Field
The cache_time field (default 3600) exists on every feed and in the form. However, the current front-end path fetches the feed with FeedFactory on every uncached render. It does not honour cache_time by itself.
The real caching lever is Joomla's view and component cache:
System → Global Configuration → System → Cache
+ com_newsfeeds DisplayController is cachable
Treat cache_time as legacy - a leftover from the old SimplePie era. To avoid a remote HTTP call on every page load, rely on Joomla's component cache.
7.5 SEF URLs and the Router
Feed URLs are built and parsed by the component's router:
components/com_newsfeeds/src/Service/Router.php
index.php?option=com_newsfeeds&view=newsfeed&id=7
↔ /news-feeds/world/bbc-world
The router builds SEF links, parses incoming paths back to a view and id, and prefers an existing menu item's segment. This means feed links survive category moves.
7.6 Programmatic Access
The same nested-set Categories API applies to feeds:
use Joomla\CMS\Categories\Categories;
$categories = Categories::getInstance('Newsfeeds');
$node = $categories->get('world'); // by alias or id
$children = $node->getChildren();
And you can fetch and parse any feed yourself, anywhere in Joomla:
use Joomla\CMS\Feed\FeedFactory;
$feed = (new FeedFactory())->getFeed('https://example.com/feed');
foreach ($feed as $entry) {
echo $entry->title, ' - ', $entry->uri; // FeedEntry objects
}
7.7 Security - Fetching the Outside World
A feed reader is a server-side HTTP client. That carries risks most components do not have:
| Risk | Why | Mitigation |
|---|---|---|
| SSRF | The server fetches an admin-supplied URL, which could point at internal hosts such as http://localhost or cloud metadata endpoints. |
Only let trusted groups create or edit feeds (use ACL). |
| XML attacks (XXE) | Parsing untrusted XML can try to pull in external entities. | Joomla parses with LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_NOWARNING via XMLReader. |
| Content injection / XSS | Item titles and descriptions come from a third party. | Output is escaped and filtered in the layout - keep your overrides safe. |
| Availability | A slow or dead source blocks the page render. | Component cache plus the graceful "feed not retrieved" fallback. |
The data is untrusted by definition - it is literally another server's output. Gate who can add feeds, and never trust feed content in your custom overrides.
7.8 At Scale
The model is simple, but consuming external feeds behaves differently from serving your own data:
| Concern | Why | Mitigation |
|---|---|---|
| Render-time latency | Each Single view does a live HTTP fetch. | Enable component cache - the network call dominates page time. |
| Source reliability | A dead or slow source degrades your page. | Cache aggressively; the fallback message prevents fatal errors. |
| Many feeds on one page | Several Single views means several blocking fetches. | Cache, or load feeds via async modules instead. |
| Category / list cost | Standard catid, published, access, and language filtering. |
Indexes already ship on those columns. |
The lesson: News Feeds are network-bound, not query-bound. The bottleneck is the remote server, so caching matters far more here than SQL tuning.
Back to top8. Common Mistakes and Pitfalls
8.1 "The Feed Shows Nothing"
When you see the "could not be retrieved" message, work through this checklist:
- Is the Link a valid, reachable RSS or Atom URL? Try it in a browser.
- Does the source return HTTP 200 to a server request, not just to your browser?
- Is it HTTPS with a valid certificate your server trusts?
- Is the source blocking your server's IP address or user-agent?
- Is the XML actually a feed (a
<rss>or<feed>root), not an HTML error page?
8.2 "It Does Not Update / Shows Stale Items"
- The component cache is serving an old render. That is the real cache, not
cache_time. - Clear the cache, or shorten the cache lifetime, to refresh sooner.
- The source itself may publish infrequently. You cannot refresh faster than it updates.
8.3 Display Confusion
- The List view lists feeds, not headlines. Only the Single view shows items.
- The three-level Show / Hide / Use Global inheritance trips up everyone. Check all three layers.
- # Articles caps items after the fetch. A short feed simply shows fewer.
cache_timelooks like it controls freshness, but it effectively does not. Use the system cache.
8.4 Trust and Content
- Feed content is third-party. A compromised source could try to inject markup.
- Restrict who can add or edit feeds to reduce the SSRF surface.
- Do not assume the source's licensing allows republishing. Syndication has legal limits.
8.5 Do Not Expect SEO Value
A news feed is outbound aggregation, not content you own:
- Every item headline links out to the source site, not to a page on yours.
- The items are fetched at render time, so they are not stored as crawlable local content. Only your short feed description lives in
#__newsfeeds. - So the Single view adds reach and freshness for visitors, but little for search ranking.
Use News Feeds to curate and surface other people's content, not as a content-marketing or ranking play. For SEO, you want your own articles.
Back to top9. Best Practices
If you only remember a few things from this article, remember these:
- Create a category before you add a feed - every feed must live in one.
- Use the Single view to show headlines, and the List view to show a directory of feeds.
- For a single sidebar feed, reach for
mod_feedinstead of the full component. - Enable Joomla's component cache - it is the real freshness and performance lever, not
cache_time. - Only let trusted user groups add or edit feeds, because the server fetches whatever URL they enter.
- Never trust feed content in custom template overrides - keep output escaped.
10. Quick Reference
FEED Components → News Feeds → Feeds → New
CATEGORY Components → News Feeds → Categories (extension=com_newsfeeds)
DISPLAY Menus → New → News Feeds → Single / List / Categories
URL link (the RSS/Atom feed address, the whole point)
COUNT numarticles (items to render)
ORDER feed_display_order des=newest first, asc=oldest first
DIRECTION rtl (right-to-left feeds)
FETCH View → FeedFactory::getFeed(link) (live, at render)
PARSER <rss> RssParser, <feed> AtomParser (libraries/src/Feed)
FALLBACK XMLReader::open → HttpFactory (spoofed Firefox UA)
CACHE system/component cache (NOT cache_time - vestigial)
INHERIT Feed → Menu item → Component Options (Use Global)
PLUGINS finder/newsfeeds, webservices/newsfeeds (no fields, no privacy)
ROUTER src/Service/Router.php → SEF /news-feeds/<cat>/<alias>
OVERRIDE templates/<tpl>/html/com_newsfeeds/newsfeed/default.php
SECURITY untrusted XML + SSRF → trusted editors only
API /api/index.php/v1/newsfeeds
TABLE #__newsfeeds (+ #__categories)
Back to top11. Summary
Joomla News Feeds is the one core component that pulls the outside world in. It is a server-side RSS and Atom reader, wired into the shared category tree.
It gives you:
- Aggregation: display any external RSS or Atom feed, with no copy-paste.
- Structure: the same categories tree, access control, menus, and SEF routing as the rest of Joomla.
- Parsing: Joomla's own FeedFactory and RSS/Atom parsers, with an HTTP fallback for stubborn servers.
- Display control: item count, descriptions, truncation, order, and framing images.
- Integration: Smart Search indexing and a REST API.
- A different shape: network-bound, untrusted content, where caching matters more than SQL tuning.
Once you understand that News Feeds store a pointer to someone else's data, every quirk - the render-time fetch, the vestigial cache_time, the security concerns - falls into place. Use it to curate and surface external content, lean on the component cache, and keep a tight grip on who can add feeds.
If you are building a Joomla site that aggregates partner news, or you are troubleshooting feeds that will not load, these are exactly the details that make the difference between a page that quietly works and one that quietly fails.
Back to top

Joomla specialist and Linux admin for fast, secure and scalable websites.


