Skip to main content

Newsfeeds in Joomla

11 June 2026

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:

ConceptWhat it isDatabase 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:

FieldPurpose
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.

Back to top

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_newsfeeds category 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:

FieldEffect
# 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 top

3. 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 typeWhat 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.

Back to top

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 top

5. 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.
Back to top

6. Plugins and Integrations

6.1 Two Core Plugins Extend the Component

The ecosystem around News Feeds is small. Two core plugins extend it:

PluginTypeWhat 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 top

7. 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:

RiskWhyMitigation
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:

ConcernWhyMitigation
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 top

8. 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_time looks 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 top

9. 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_feed instead 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.
Back to top

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 top

11. 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
Newsfeeds in Joomla
Peter Martin
Peter Martin

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