Platforms
Joomla Google reviews plugin: what the text filter deletes
You do not need a Joomla plugin to put Google reviews on a Joomla site. The whole install is a stylesheet link, one script tag, one init call and an empty container div, and Joomla has two places that accept raw HTML. What you do need is for that script tag to still exist after you press Save, and by default it does not: Joomla strips it twice, once in the editor and once on the way into the database. The div survives, the script does not, and you are left staring at a page that looks like nothing happened.
This post is the exact behaviour, not the folklore. We read the defaults in the Joomla source on 10 August 2026 (branches 5.4 and 6.1, plus the filter package Joomla vendors), and we measured the one live Joomla site running our widget.
Joomla is the rarest platform we see, and that matters here
On 10 August 2026 we took every domain that had served our widget in the previous 18 days, 737 of them, and fetched each home page to fingerprint the platform. 467 answered. Here is the whole board:
| Platform | Hosts answering | Share of answers |
|---|---|---|
| WordPress (no shop) | 114 | 24.4% |
| WooCommerce | 90 | 19.3% |
| Shopify | 37 | 7.9% |
| PrestaShop | 23 | 4.9% |
| Squarespace | 18 | 3.9% |
| Duda | 14 | 3.0% |
| Ecwid or Shopware | 14 | 3.0% |
| Magento | 13 | 2.8% |
| BigCommerce | 11 | 2.4% |
| GoDaddy | 5 | 1.1% |
| Webflow | 4 | 0.9% |
| Shoper | 3 | 0.6% |
| IdoSell | 2 | 0.4% |
| Joomla | 2 | 0.4% |
| Wix | 2 | 0.4% |
| Drupal | 1 | 0.2% |
| No signature | 137 | 29.3% |
Counts overlap slightly, because a handful of sites carry markers of two systems at once. The two Joomla hostnames are the same site behind a production domain and a hosting preview domain, so in practice: one Joomla install, one account.
That number is the honest reason this guide reads differently from the WordPress one. There is no large pile of Joomla installs to average over, so instead of vague advice we did two things that do not need a large sample: we read what Joomla’s own code does to your snippet, and we took the single Joomla site apart to see how it was wired.
What Joomla deletes, and what it keeps
Two filters stand between your clipboard and the page, and they are configured in different places.
The editor filter runs first, in your browser. Joomla ships TinyMCE with a field called
Prohibited Elements, defined in plugins/editors/tinymce/forms/setoptions.xml with the default
value script,applet,iframe. It is used whenever the set does not defer to the global filters,
which is also the default (use_config_textfilters is 0). So the script tag can disappear before
the form is even submitted, including for a Super User who believes they have filtering turned off.
The save filter runs second, on the server. Both the article body and the Custom module body are
declared with filter="\Joomla\CMS\Component\ComponentHelper::filterText", in
administrator/components/com_content/forms/article.xml and
administrator/components/com_modules/forms/module.xml. That method reads Global Configuration,
Text Filters, and applies the rule for the groups the current user belongs to. For the Default Black
List it builds an input filter whose blocked tag list is 23 entries long:
applet, body, bgsound, base, basefont, canvas, embed, frame, frameset, head, html,
id, iframe, ilayer, layer, link, meta, name, object, script, style, title, xml
Note what is on that list besides script: link and style. So a snippet that starts with a
stylesheet link loses that too, and the widget can end up unstyled even when someone has managed to
smuggle the script through. Note also what is not on the blocked attribute list, which is only
action, background, codebase, dynsrc, formaction, lowsrc: id and class are untouched. Your
empty container div always survives. That asymmetry is the whole Joomla story in one line.
The default that decides whether it works for you
Joomla does not apply one rule to everybody. The shipped configuration, in
installation/sql/mysql/base.sql, assigns a filter type per user group:
| User group | Default text filter | What happens to the snippet |
|---|---|---|
| Super Users | No Filtering | Script survives the save (but TinyMCE may still eat it) |
| Manager | Default Black List | Script, link and style removed |
| Administrator | Default Black List | Script, link and style removed |
| Publisher | Default Black List | Script, link and style removed |
| Editor | Default Black List | Script, link and style removed |
| Author | Default Black List | Script, link and style removed |
| Registered, Public, Guest | No HTML | Everything removed |
This is why the same paste behaves differently for two people on the same site, which is the single most confusing symptom in Joomla support threads. The owner is a Super User and sees the widget. The person who actually maintains the content is an Administrator or a Publisher and their save quietly returns a div with nothing behind it. Nobody is doing anything wrong, and no error is shown.
The opposite failure, measured on a live site
The one Joomla install in our base has the mirror image of that problem, and it is worth showing because it is invisible from the front end.
They did the smart thing with the script: it sits in the template, just before the closing body tag, wrapped in a comment marker, so no filter ever touches it. We crawled 24 pages of that site on 10 August 2026. All 24 carry the stylesheet link, the script and the init call. Zero of them carry the container div. We then rendered three of those pages in a headless browser to be sure the container was not being injected at runtime, and matched every element whose id or class starts with our name: nothing, on all three.
Here is what each of those page views actually costs, measured the same day:
| Resource | Over the wire | Decoded | What it is for |
|---|---|---|---|
| Widget JavaScript | 128 293 B | 488 265 B | Nothing on this page |
| Widget stylesheet | 15 285 B | 109 861 B | Nothing on this page |
| Reviews API response | 4 054 B | 12 630 B | 21 reviews, average 4.95 |
| Total per page view | 147 632 B | 610 756 B | Zero pixels |
So a paying account downloads its own 21 five star Google reviews on every page view of a 24 page site and renders none of them. There is no console error either. We checked our own widget code and the reason is boring: the init call asks for the container, our loading spinner helper returns early when the selector matches nothing, and the fetch then runs anyway. The site owner has no way to see this. That silence is on us, not on Joomla.
If you take one diagnostic away from this page, take that one: a widget that loads is not a widget that renders. The network tab showing a 200 on the reviews call is not evidence that anything is on your page.
Install it so it survives both the filter and the next update
| Where you put it | Survives text filter | Survives Joomla update | Good for |
|---|---|---|---|
Child template index.php, before </body> | Yes, templates are never filtered | Yes | The script and init call, site wide |
Template index.php directly | Yes | No, an update can overwrite it | Quick test only |
| Article or Custom module | Div yes, script no | Yes | The container div, per page |
| Global Configuration, filter set to No Filtering | Yes | Yes | Nothing, this is a site wide security decision |
The working shape on Joomla is a split, and it is not a workaround, it is the correct layout:
- Script once, in the template. Copy your active template to a child template, open its
index.php, and paste the stylesheet link, the script tag and the init call just before</body>. Nothing here goes through the text filter, and a child template means the next Joomla or template update does not undo your work. - Container where you want the reviews. In the article, or in a Custom module assigned to a
position, paste only the empty div with the widget id. The Default Black List keeps it. If your
editor reformats it into oblivion, switch the editor to None for that one save. Remember that a
Custom module also wraps your markup in its own
divwith amod-customclass, which is a handy hook if you want to add spacing around the widget. - Check the front end in the element inspector, not in view source. View source tells you what the server sent, the inspector tells you what the browser built. On Joomla those two disagree often enough to waste an afternoon.
If you would rather not touch a template file at all, the alternative is a Super User account plus the editor set to None, which lets the script through both filters. It works, and it puts your snippet in a database row that the next content editor can silently delete. We would not choose it.
What we would check first on a Joomla site that “does not work”
- Open view source and search for the widget name. Container present, script missing means the text filter took it: move the script to the template.
- Script present, container missing means the opposite: the reviews are being fetched and thrown away, which is the case we measured above. Add the div to the page that should show them.
- Both present and still nothing on screen means the container is on the page but hidden, usually inside a collapsed tab or an accordion that measures zero at load time.
- Reviews appear but look unstyled: the stylesheet link was removed, because
linkis on the same blocked list asscript.
None of these need a plugin, a developer or a support ticket. They need the script and the div to be in places where Joomla is not allowed to rewrite them.
Why we are worth the ten minutes
We support Google alongside marketplaces and booking platforms in one widget, one script and one account, which matters more on Joomla than anywhere else: every source you add is zero extra tags on the page, and tags are the fragile part here. The install is the same three lines on every platform, documented in our universal embed instructions, and the widget itself is the same file we measured above, so the numbers on this page are the numbers you get. Plans and limits are on the pricing page, and if you are comparing tools first, our rundown of review widgets in 2026 is the honest version, including where somebody else fits better.
The fair warning, since this page is otherwise about ours: we are a reviews aggregator, not a Joomla extension. There is no Joomla Extensions Directory listing to install, no admin panel inside Joomla, and the snippet is your responsibility once it is in the template. In exchange you get something a Joomla extension cannot give you: the same widget, unchanged, if you move that site to WordPress or Shopify next year.
Ready to try it on your own template? Create an account,
connect Google, and copy the snippet from the widget builder. If you want to see the finished thing
before you touch index.php, our Google reviews widget page
has it running live.
FAQ
Do I need a plugin to show Google reviews on Joomla?
No. A reviews widget is a stylesheet link, one script tag, one init call and an empty container div. Joomla has a Custom module and an editor that both accept HTML, so there is nothing to install. The reason people reach for a plugin is that the snippet often stops working after they press Save, and that is not a missing feature, it is Joomla's text filter removing the script tag from the saved content.
Why does my Joomla article delete the script tag when I save it?
Two separate filters do it. TinyMCE removes script, applet and iframe in the browser before the form is even submitted, because the plugin ships with Prohibited Elements set to script,applet,iframe. Then Joomla filters the saved value again through ComponentHelper::filterText, and for every group except Super Users the default is the Default Black List, which blocks 23 tags including script, link and style. The div survives both, because id and class are not blocked attributes. That is why so many Joomla sites end up with half a widget.
Where should the widget script go on a Joomla site?
In the template, once, before the closing body tag, and ideally in a child template so a Joomla update does not overwrite it. Article and module content go through the text filter on every save, template files do not go through it at all. Then the only thing you paste into the article or Custom module is the empty container div, which the filter leaves alone.
The widget loads but nothing appears on the page. What is wrong?
Almost always the container is missing. The init call looks for an element with the id of the widget, and if it is not on that page the script still downloads and still fetches your reviews, it just has nowhere to draw them. We measured exactly that on a live Joomla site on 10 August 2026: 24 pages carrying the script and the init call, zero pages carrying the container, about 147 KB of transfer per page view and 21 five star reviews delivered to nobody.