Blog

  • WebP Converter for Joomla: WebP, AVIF, and Faster Pages

    WebP Converter for Joomla: WebP, AVIF, and Faster Pages

    WebP Converter for Joomla: WebP, AVIF, and Faster Pages

    A WebP converter for Joomla is a system plugin that turns JPG, PNG, and GIF files into smaller WebP and AVIF copies, then serves the modern format in the browser with a fallback to the original. On Joomla 4, 5, and 6 the practical choice is WebP Converter by JoomlaX (Infyways): install once, convert on page load or in bulk, keep originals on disk, and cut image weight by up to 80% without re-uploading every article image by hand.

    Heavy images are still the number one reason a Joomla site fails Core Web Vitals. Google uses Largest Contentful Paint (LCP) as a ranking signal. A hero JPEG at 400 KB can become 80 KB as WebP, or smaller still as AVIF, while the page looks the same to visitors. That is not a cosmetic tweak. It is measurable speed, lower bandwidth, and better PageSpeed scores on real Joomla templates, not only on a lab test.

    This guide explains what a Joomla WebP converter should do, how WebP and AVIF differ, and why WebP Converter 2.6 is built for production sites: batch folder conversion, <picture> fallbacks, global HTML URL replacement, exclusions for checkout pages, and AVIF when your host supports it.

    WebP and AVIF conversion flow in Joomla: original images, converted files, picture element in the browser

    Originals stay in images/. Converted WebP and AVIF files are served when the browser supports them.

    What you will learn

    • Why a dedicated WebP converter for Joomla beats manual conversion
    • How WebP and AVIF compare for Joomla sites in 2026
    • Every major feature in WebP Converter 2.6 (on-the-fly, batch, exclusions, SEO)
    • Step-by-step install and first-time setup on Joomla 4, 5, and 6
    • Pricing plans and which license fits your project
    • Server requirements for AVIF, CDN use, and troubleshooting

    For broader speed work after images are lean, see Joomla website optimization and Joomla on-page optimization.

    Why Joomla sites need a WebP converter

    Joomla stores images under images/ and prints them in articles, modules, and template overrides. Every upload adds weight. Templates and page builders do not automatically modernize formats. You end up with:

    • Large JPEG heroes that drag LCP above 2.5 seconds
    • PNG screenshots that should have been compressed
    • Gallery folders with thousands of untouched files from 2018
    • PageSpeed reports listing "serve images in next-gen formats"

    You can export, convert in desktop tools, re-upload, and fix broken paths. On a 500-article news site that is a project, not a workflow. A WebP converter for Joomla should:

    1. Keep originals (rollback and editor preview stay safe)
    2. Convert on first page view or in bulk before traffic arrives
    3. Output WebP, AVIF, or both with automatic browser fallback
    4. Respect exclusions (logos, GIF animations, checkout)
    5. Work on shared hosting without shell access

    That is exactly what WebP Converter is built for. It is a System plugin (not a one-off article hack), compatible with Joomla 4, 5, and 6, with 4,100+ downloads and a 30-day money-back guarantee.

    WebP vs AVIF: which format should Joomla serve?

    Format Compression Browser support Best for
    WebP Roughly 25 to 35% smaller than JPEG at similar quality All modern browsers (Chrome, Firefox, Safari, Edge) Default choice. Safe on every Joomla 4+ site with PHP GD WebP support
    AVIF Up to ~50% smaller than WebP at similar visual quality Chrome, Firefox, Opera (Safari added AVIF in recent versions) Maximum savings when PHP 8.1+ and imageavif() (GD) or ImageMagick AVIF is available
    Original JPG/PNG Largest Universal Fallback inside <picture> for old browsers

    WebP Converter lets you pick WebP Only, AVIF Only, or Both. With Both, the plugin builds a <picture> chain: AVIF first, WebP second, original last. Visitors get the best file their browser accepts. You do not hand-write picture markup in every article.

    Official setup guidance for format choice: WebP Converter documentation (start with WebP Only, add AVIF after you confirm hosting support).

    How WebP Converter works on a live Joomla site

    Two modes cover every workflow:

    1. On-the-fly (automatic)
    When someone opens a page, the plugin scans image tags in the HTML. If a WebP or AVIF copy already exists, the page points at it. If not, the plugin can create the copy during that request (with lightweight processing and memory guards), cache the result, and serve it on the next hit. No cron job required for basic sites.

    2. Batch (Image Management tab)
    In System → Plugins → System – WebP Converter → Image Management, tick one or more folders under images/, choose WebP Only, AVIF Only, or Both, and click Generate Images. Progress runs in the administrator with a time limit (default 90 seconds, configurable). Use this before launch, after a migration, or for a folder with hundreds of photos.

    Where files go: by default, images/stories/photo.jpg becomes images/webp/stories/photo.webp (and a matching AVIF path when enabled). Originals are never deleted. Delete Converted Images removes only the modern copies.

    On-the-fly conversion vs batch Generate Images in the Joomla administrator

    Visit a page to convert lazily, or pre-warm a folder before you send traffic.

    Install WebP Converter on Joomla 4, 5, or 6

    Follow the installation guide. Summary:

    Step 1: Download and unzip correctly

    1. Purchase from joomlax.com/webp-converter.html.
    2. Unzip WebPConverter_UNZIP.zip on your computer.
    3. You should see plg_system_webpconverter_2.6.0.zip and ReadMe.txt.
    4. Upload only the inner plg_system_...zip to Joomla. Do not upload the outer UNZIP wrapper.

    Step 2: Install in Joomla

    1. System → Install → Extensions → Upload Package File
    2. Select plg_system_webpconverter_2.6.0.zip
    3. Wait for the success message
    4. System → Maintenance → Clear Cache

    Step 3: Enable and first-time setup

    1. System → Plugins → search WebP Converter → enable System – WebP Converter
    2. Open the plugin → General Settings
    3. Set Image Format to WebP Only (safest first run)
    4. Set WebP Quality around 70 to 80
    5. Leave Use Lightweight Processing on Yes
    6. Leave Debug Mode off unless troubleshooting
    7. Save
    8. Open the public site homepage (with photos) and hard-refresh

    Proof it worked: view page source and search for .webp, or right-click an image → open in new tab and check the extension.

    Full walkthrough: First-time setup in the JoomlaX docs.

    Every feature in WebP Converter 2.6

    The plugin is more than a format swap. Below is the full capability set from the product page and documentation, grouped for quick scanning.

    Conversion and formats

    Feature What it does
    Automatic WebP and AVIF conversion JPG, JPEG, PNG, GIF → modern formats with intelligent caching (up to 90% less repeat work)
    Image Format: WebP / AVIF / Both One setting controls output; Both enables <picture> fallback chain
    WebP quality 5 to 100% Separate slider from AVIF quality
    AVIF quality 5 to 100% Scaled to AVIF’s 0 to 63 range automatically
    Smart file size filters Min/max limits skip tiny icons or huge files that would timeout
    Preserve original timestamps Helps backup tools and sync jobs
    Custom filename suffixes Optional suffix on converted filenames
    SVG ignored Vector logos stay as SVG

    Performance and hosting

    Feature What it does
    Lightweight processing mode Regex-based parsing, lower memory on shared hosting
    JSON performance cache Configurable 1 to 168 hour lifetime; skips re-conversion when unchanged
    Memory threshold 60 to 90% Pauses batch work when RAM is tight, resumes when free
    85% faster admin UI Lazy-loaded folder tree, optimized queries
    Media URL auto-detection Works across different Joomla Media path configs and CDNs
    Windows and Linux paths Normalized paths on either OS

    Folder tree and batch jobs

    Feature What it does
    Interactive folder tree Select one, many, or all folders; lazy load for thousands of entries
    Generate Images Batch convert selected folders with progress bar
    Stop / resume Stop a long batch; completed files remain
    Flat output structure Optional single directory for all WebP/AVIF (large news archives)
    MD5 hashed filenames Avoid collisions on busy multi-author sites
    Orphan cleanup Remove converted files when originals are deleted
    Page processing time limit Default 90s; raise for huge homepages

    SEO, Core Web Vitals, and HTML output

    Feature What it does
    Native lazy loading Defers off-screen images; optional above-the-fold exception
    CSS background images Converts background URLs referenced in inline CSS
    Replace Image URLs Globally Final HTML pass rewrites JPG/PNG links sitewide when a WebP/AVIF exists
    Alt text and attributes preserved class, id, style, loading stay intact
    Schema.org ImageObject Rewrites JSON-LD image URLs when global replace is on
    Open Graph and Twitter Card images Meta image URLs updated for social previews
    Third-party SEO extensions Compatible with structured data tools (e.g. Tassos.gr Google Structured Data)
    Picture element smart fallback Keeps existing fallback images inside <picture>

    Exclusions (when not to convert)

    Control Example use
    Exclude image formats Skip GIF animations
    CSS class no-webp Per-image opt-out in HTML
    Disable on home page Hero handled manually
    Disable for menu items Checkout or landing page untouched
    Disable for components Skip VirtueMart cart, etc.
    URL patterns */checkout one per line
    Exclude folders headers, logos under images/
    Exclude filenames logo.png

    Details: Exclusion Settings in the docs.

    Security and operations

    Feature What it does
    CSRF tokens on AJAX Blocks forged admin requests
    Input validation Prevents directory traversal
    Rate limiting 5 batch ops, 50 single conversions, 10 deletes per hour (super users bypass)
    Multi-level logging Info, Warning, Error, Debug with user ID, IP, memory, timing
    Conversion statistics Success rate, bytes saved, cache hits
    Debug mode On-screen clues on staging only; turn off in production

    Pricing: choose a WebP Converter plan

    All plans include a 30-day money-back guarantee. Joomla 4, 5, and 6 supported. Prices from the official store:

    Plan Price Access Sites Support Updates
    Tester $19 30 days 1 30 days email No updates after 30 days (testing only)
    6 Months $29 (was $114) 6 months 2 Priority email + bug fixes 6 months
    1 Year (recommended) $49 (was $228) 1 year 3 VIP channel + fastest response 1 year
    Lifetime $99 (was $1,980) Forever Unlimited Dedicated agent + custom dev support Lifetime

    Which plan fits?

    • Tester ($19): Staging proof on one site before you commit
    • 6 Months ($29): Client project with a defined end date
    • 1 Year ($49): Best value for agencies and active Joomla shops (three sites, VIP support)
    • Lifetime ($99): Unlimited client sites; pays for itself after two year renewals

    Need the full JoomlaX catalog? 100+ extensions from $99 on all-access plans.

    Download WebP Converter · Documentation · Live demo

    Server requirements for WebP and AVIF

    Capability Requirement
    WebP conversion PHP 7.4+ with GD WebP support (most Joomla hosts)
    AVIF conversion PHP 8.1+ with GD imageavif() or ImageMagick with AVIF
    Joomla 4.x, 5.x, or 6.x
    Disk space Room for parallel WebP/AVIF copies (originals remain)

    If AVIF is unavailable, set Image Format to WebP Only. The plugin detects capability and avoids fatal errors.

    After bulk conversion, purge Joomla cache and your CDN so edge nodes fetch the new filenames.

    WebP Converter vs manual or generic tools

    Approach Pros Cons
    Desktop batch convert + re-upload No plugin cost Breaks paths, no on-the-fly for new uploads, hours on large sites
    Free online converters Fine for one image No Joomla integration, no exclusions, no <picture>
    Server-only mod_pagespeed / CDN polish Hands-off at edge Less control per folder, harder exclusions on Joomla admin
    WebP Converter plugin Joomla-native, originals kept, batch + live, AVIF + WebP, SEO HTML pass Paid (from $19 tester)

    For AVIF-specific deep dive and optimizer pairing, see our companion post Joomla AVIF converter and WebP optimizer.

    Troubleshooting quick fixes

    From the troubleshooting docs:

    • Plugin not found: Filter plugins by type system, search WebP Converter
    • No change on front end: Enable plugin, Save, clear cache, hard-refresh
    • Generate does nothing: Tick at least one folder; click Load more folders if needed
    • GD warning on install: Ask host to enable PHP GD with WebP (and AVIF if required)
    • PageSpeed still shows old URLs: Turn on Replace Image URLs Globally, regenerate, purge CDN

    Support: support.joomlax.com

    Key takeaways

    1. A WebP converter for Joomla should keep originals, support WebP and AVIF, and serve <picture> fallbacks automatically.
    2. WebP Converter 2.6 runs on Joomla 4, 5, and 6 with on-the-fly and batch Generate Images modes.
    3. Start with WebP Only at quality 70 to 80; add AVIF when PHP 8.1+ and host libraries allow it.
    4. Use exclusions for GIFs, logos, and checkout. Use global URL replace when PageSpeed still sees JPG in meta tags.
    5. Plans start at $19 (30-day tester); $49/year is the recommended production license for three sites.
    6. After conversion, clear Joomla cache and CDN, then re-test LCP in PageSpeed Insights.

    Agency rollout across many client sites: Joomla SEO services and outsource Joomla services.

    Frequently asked questions

    What is the best WebP converter for Joomla?

    For Joomla 4, 5, and 6, WebP Converter by JoomlaX is the most complete option: WebP and AVIF, batch folder conversion, exclusions, lazy loading, global HTML URL replacement, and Core Web Vitals-focused output. See plans and download.

    Does WebP Converter work with Joomla 5 and Joomla 6?

    Yes. Version 2.6 is built for Joomla 4.x, 5.x, and 6.x with namespaced PHP and forward compatibility.

    Will it delete my original JPG and PNG files?

    No. Originals stay in place. Delete Converted Images removes only WebP and/or AVIF copies.

    Do I need to click Generate Images?

    No for small sites. Page visits convert images over time. Use Generate Images before launch or for large images/stories archives.

    WebP or AVIF first?

    Start WebP Only. Switch to Both when your host supports AVIF and you want maximum compression.

    Does it work with CDNs?

    Yes. Converted files use predictable paths under images/webp/ (or your custom output folder). Purge the CDN after bulk runs.

    Can I exclude my logo or animated GIF?

    Yes. Exclude GIF format globally, add class no-webp on a specific image, or exclude folders and menu items in Exclusion Settings.

    What PHP do I need for AVIF?

    PHP 8.1+ with GD imageavif() or ImageMagick with AVIF. Otherwise use WebP Only.

    Is there a money-back guarantee?

    Yes. 30 days on all WebP Converter plans.

    Where is the official documentation?

    WebP Converter documentation covers install, general settings, exclusions, image management, and troubleshooting. JoomlaX is Infyways’ extension store.


    SEO Metadata

    Field Value
    Meta Title WebP Converter for Joomla: WebP & AVIF Guide (2026)
    Meta Description Best WebP converter for Joomla 4, 5, and 6. WebP Converter does on-the-fly and batch AVIF/WebP, picture fallbacks, SEO URL replace. Plans from $19.
    URL Slug image-to-webp-joomla
    Focus Keyword webp converter for joomla
  • Joomla Redirect Guide: 301, com_redirect, and .htaccess

    Joomla Redirect Guide: 301, com_redirect, and .htaccess

    Joomla Redirect Guide: 301, com_redirect, .htaccess, and nginx

    A Joomla redirect sends visitors and crawlers from an old URL to a new one with an HTTP status code (usually 301). Joomla gives you three practical layers: server rules (.htaccess, nginx, or IIS) that run before PHP, the com_redirect component that runs after a 404, and Global Configuration switches that control how Joomla builds links. Pick the layer that matches whether the old URL still returns 200 or already 404s.

    Redirects are not a cosmetic tweak. They are how you keep rankings when you rename an article, retire K2, force one hostname, or move HTTP to HTTPS without splitting authority across two URLs. Google treats a proper 301 as a strong signal to consolidate to the destination: Consolidate duplicate URLs.

    This guide is the full map for Joomla 4, 5, and 6. For the "I saved a 301 and nothing happened" checklist, see Joomla 301 redirects not working.

    Three redirect layers in Joomla: server, com_redirect on 404, and Global Configuration link building

    Server rules run first. com_redirect only fires when Joomla has already decided the path is a 404.

    What you will learn

    • What 301, 302, and 307 mean in Joomla
    • When to use .htaccess, nginx, com_redirect, or neither
    • How to enable System – Redirect and publish rows in System → Redirects
    • Exact .htaccess rules for www, non-www, and HTTP to HTTPS
    • nginx and IIS equivalents when there is no .htaccess
    • How to test headers, avoid redirect chains, and protect SEO after a migration

    301, 302, and what Joomla actually sends

    Code Name Use in Joomla
    301 Moved permanently Default for SEO migrations, retired aliases, www/HTTPS canonicalization
    302 Found (temporary) Short campaigns, A/B tests, maintenance you will reverse
    307 Temporary redirect Rare in Joomla admin; some server modules use it instead of 302

    com_redirect defaults to 301 unless your Joomla version exposes per-row status codes under Redirects → Options. Server rules use [R=301] in Apache or return 301 in nginx.

    A Menu Item Alias is not a redirect. It shows the same article at a second menu path while both URLs can still 200. Aliases are navigation. Redirects are HTTP responses. If two real menu items point at one article, you have duplicate URLs until you unpublish one or 301 the loser: Joomla duplicate URLs.

    Pick the right layer

    Layer When it runs Use it for
    .htaccess (Apache / LiteSpeed) Before PHP boots www ↔ bare host, HTTP → HTTPS, /index.php/alias/alias, folder moves, anything that still 200s
    nginx server / location Before PHP Same jobs on nginx hosts (no .htaccess)
    IIS web.config Before PHP Windows hosts
    com_redirect + System – Redirect plugin After Joomla returns 404 Old article aliases, retired menu paths, K2 URLs after uninstall
    Global Configuration → Server → Force HTTPS Link generation in Joomla Makes Joomla emit https:// links. Pair with a server 301 for typed http:// visits
    System – SEF Rewrites URLs in HTML Cleaner paths. Not a substitute for 301 when an old URL still resolves

    Official component help: Redirects: Links (Joomla 5) and Redirects: New or Edit. Stock Apache snippets live in preconfigured htaccess.

    Decision flow: still 200 use server rules, already 404 use com_redirect

    If the old URL still loads a page, com_redirect never runs. Fix that at the server or unpublish the route.

    Step 1: Set up com_redirect (Joomla 4, 5, and 6)

    Use the component when the expired path is already a 404 and you want to manage dozens of mappings in the administrator.

    Enable the plugin (not optional)

    1. System → Plugins → search System – RedirectEnable.
    2. On fresh installs this plugin is often disabled. Rows in System → Redirects do nothing until it is on.

    Do not confuse it with System – SEF. SEF builds pretty links. It does not send 301s for dead paths.

    Create a redirect row

    1. System → RedirectsNew.
    2. Expired URL: the full old address as you would type it (https://www.example.com/old-alias).
    3. New URL: the full destination.
    4. Status: Enabled (published). Collected 404s stay disabled until you add a New URL and publish.
    5. Save.

    Optional: turn on Collect URLs in the plugin so 404s appear in the list for you to map. Collection is logging, not redirecting.

    Regex and bulk work

    • Enable Regular expressions on a row when you need a pattern (example: all /blog/2019/ paths). Test one URL before importing hundreds.
    • After a K2 removal, map /component/k2/... to new com_content URLs as part of Migrate K2 to Joomla articles. Do not leave public 404s while you "collect later."
    • Joomla expects Use URL Rewriting on and a working rewrite file, or matching is unreliable. See Joomla index.php still in URLs.

    If a row is published and the old URL still shows the old page, a menu item or alias is still serving it. com_redirect cannot help until that route 404s or you move the job to .htaccess.

    Step 2: Redirect www and non-www in .htaccess

    Pick one canonical host (www or bare) and 301 everything else. This belongs in server config, not in com_redirect.

    Joomla ships a commented block in .htaccess labeled custom redirects. Place rules after RewriteEngine On and before the Joomla core rules, or inside the documented custom section from preconfigured htaccess.

    Bare → www (replace example.com):

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
    

    www → bare:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
    RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
    

    Notes:

    • Use your real domain. Escape dots in the host (example\.com).
    • If you also need HTTP → HTTPS, chain both conditions or use one rule that targets the final https:// host.
    • [NC] makes the host match case-insensitive. [L] stops processing. [R=301] sends the permanent redirect.

    After editing, purge CDN cache and test in a private window. The address bar should show your chosen host on the first hop.

    Step 3: Force HTTPS at the server and in Joomla

    Server (Apache / LiteSpeed)

    Below RewriteEngine On, when SSL is working:

    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
    

    Better: combine host canonicalization and HTTPS in one rule set so you do not create a chain (http://example.comhttps://example.comhttps://www.example.com).

    Joomla Global Configuration

    System → Global Configuration → Server → Force HTTPS: set to Entire Site once the certificate is valid. That makes Joomla generate https:// links in HTML. It does not always redirect a visitor who manually types http://. Keep the server rule for that.

    Step 4: Single-path and migration redirects in .htaccess

    When one old path still 200s but must point elsewhere:

    Redirect 301 /old-folder/page https://www.example.com/new-alias
    

    Or with mod_rewrite:

    RewriteRule ^old-alias/?$ https://www.example.com/new-alias [L,R=301]
    

    Use this for:

    • Renamed menu aliases while the old menu item still exists
    • /index.php/seo-tips/seo-tips after SEF is fixed
    • Retired microsite folders

    For large content moves, pair server rules for structural changes with com_redirect rows for long-tail aliases that already 404.

    Step 5: nginx and IIS when Joomla has no .htaccess

    nginx (inside the server block for the site):

    # bare to www + HTTPS (adjust host names)
    if ($host = example.com) {
        return 301 https://www.example.com$request_uri;
    }
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }
    

    Official Joomla nginx notes: Nginx. You still need try_files so SEF works: details in Joomla index.php URLs.

    IIS: rename web.config.txt to web.config, install URL Rewrite, and add equivalent rules. Joomla documents IIS rewriting alongside Apache in Enabling SEF URLs.

    Step 6: Test headers, chains, and loops

    1. Browser Network tab → first document request → Status should be 301 (or 302 if intentional) with a Location header pointing at the final URL.
    2. Command line: curl -I https://www.example.com/old-path and read HTTP/1.1 301 plus Location:.
    3. Avoid chains longer than one hop (/a/b/c). Google will follow them but dilutes signals. Point /a straight to /c.
    4. Loops (/old/new/old) crash the browser. Usually a com_redirect New URL points back at the expired path.
    5. Clear Joomla cache and any CDN. Cached 404 HTML can hide a redirect you just published.

    Canonical tags complement redirects but do not replace them when both URLs still 200: Joomla canonical URL problems.

    Redirect mistakes that still waste SEO

    Mistake Why it hurts Fix
    302 instead of 301 for a permanent move Search engines may not consolidate equity Use 301 in server rules or Redirect options
    Old URL still 200 com_redirect never runs Unpublish menu item or use .htaccess
    Plugin off, rows published Looks configured Enable System – Redirect
    Slash / www / HTTP mismatch Row does not match request Add rows for each variant or force one host at server
    Only fixing canonical, not 301 Two indexable URLs remain 301 losers after duplicate audit
    Leaving K2 404s public Crawl budget on dead paths 301 map during K2 migration

    Key takeaways

    1. 301 is the default for permanent Joomla URL changes that should pass ranking signals.
    2. Server rules handle www, HTTPS, and paths that still return 200. com_redirect handles paths that already 404.
    3. Enable System – Redirect. The component UI alone is not enough.
    4. Publish redirect rows. Collected 404s are a log until Enabled with a New URL.
    5. Match the full expired URL (scheme, host, slash) or canonicalize host at the server.
    6. Test with response headers, not only whether the browser lands on the right page.
    7. After migrations, map old aliases before you declare SEO done. Broader cleanup: Joomla on-page optimization and Joomla SEO services.

    Frequently asked questions

    What is a 301 redirect in Joomla?

    An HTTP response that tells browsers and crawlers a URL moved permanently. Joomla can send it via com_redirect after a 404, or via .htaccess, nginx, or IIS before PHP runs.

    Should I use com_redirect or .htaccess?

    Use .htaccess (or nginx/IIS) for www, HTTPS, and any old URL that still loads. Use com_redirect when the old path already 404s, such as retired article aliases.

    How do I redirect non-www to www in Joomla?

    Add Apache rewrite rules after RewriteEngine On in .htaccess, or the nginx/IIS equivalent. Do not rely on com_redirect for hostname changes while both hosts still 200.

    How do I redirect HTTP to HTTPS in Joomla?

    Force HTTPS in Global Configuration → Server for link generation, and add a server 301 from http:// to https:// so manual HTTP visits redirect too.

    Why is my Joomla 301 redirect not working?

    Usually the System – Redirect plugin is off, the row is unpublished, or the old URL still returns 200. Full checklist: Joomla 301 redirects not working.

    Does Joomla redirect preserve SEO?

    A correct 301 tells search engines to consolidate signals to the new URL. Chains, 302s, and duplicate 200 URLs undermine that.

    Can I bulk import redirects in Joomla?

    Yes on many Joomla 4/5/6 builds via System → Redirects import (CSV). Test a few rows, then import. Regex rows need extra care.

    Is a menu alias the same as a redirect?

    No. An alias serves the same content at a second menu path. Both can 200. A redirect returns 301/302 and stops serving the old URL.

    What about IIS servers?

    Rename web.config.txt, install URL Rewrite, and add host and HTTPS rules there. com_redirect still works for 404 paths on IIS.

    Where do I put custom .htaccess redirects?

    Use the custom redirects section documented in Joomla's preconfigured htaccess, after RewriteEngine On, without breaking the core Joomla rewrite block.


    SEO Metadata

    Field Value
    Meta Title Joomla Redirect Guide: 301, com_redirect & .htaccess
    Meta Description Set Joomla 301 redirects with com_redirect, .htaccess, nginx, or IIS. www, HTTPS, old aliases, and which layer to use. Joomla 4, 5, and 6.
    URL Slug joomla-redirect
    Focus Keyword Joomla redirect
  • How to Create a Custom 404 Page in Joomla

    How to Create a Custom 404 Page in Joomla

    To create a custom 404 page in Joomla 5 or 6, publish a Custom HTML (or other) module in the error-404 position on Cassiopeia or a child of Cassiopeia. Joomla still returns HTTP 404. The module replaces the default message inside error.php. Do not header('Location: …') to a normal article. That turns a missing URL into a 302 or 200, which is what the 2019 version of this page did, and it is the wrong signal for Google.

    On Joomla 4 there is no error-404 position in core Cassiopeia. You copy error.php into a child template and edit that copy, or you add the same module include that Joomla 5 shipped. Known broken URLs that should move, not 404, belong in the Redirect component.

    Missing URL stays a 404. The template error page shows branded content

    A custom 404 is still a 404. Pretty HTML does not mean a 200 OK.

    What you will learn

    • Why a redirect to an article is not a 404 page
    • How Cassiopeia error-404 and error-403 modules work (Joomla 5.0+)
    • How to put the same pattern in a child template or a club template
    • What to put on the page (search, home, useful links)
    • How to test status codes, not only the design
    • When to 301 instead of 404

    Official module positions: Custom Error Pages (Joomla 5.4 manual). Magazine walkthrough: The 404 That Could (JCM, November 2025).

    The 2019 method, and why to stop using it

    The old Infyways steps were: create a 404 article, noindex it, copy error.php, then:

    header('Location: /index.php?option=com_content&view=article&id=292');
    exit;
    
    What you wanted What that code does
    “Page not found” for humans A second request to a real article
    HTTP 404 for Google Usually 302 then 200 on the article
    One branded error view A normal com_content URL that can get indexed unless you fight robots

    Search engines need 404 (or 410) for URLs that are gone with no replacement. Soft 404s (200 with “not found” text) waste crawl time. If the URL moved, use a 301 in System → Redirects, not a custom error page.

    If your site still has that Location block in error.php, delete it before you add a module. Put the file in a child so the next Cassiopeia update does not restore a hack, and so your fix is not wiped. Rule: customize Joomla without editing core.

    Joomla 5 and 6: the error-404 module (preferred)

    Cassiopeia since Joomla 5.0 reads modules in:

    • error-404 for not found
    • error-403 for forbidden

    If no module is published there, visitors still get the default language strings. Debug output still appears under the module when debug is on.

    Publish a module in error-404, then test a fake URL

    No error.php edit is required on stock Cassiopeia 5+. A child still needs the same include if you copied a thin error.php.

    Step 1: Use a child template

    Create and assign a Cassiopeia child if you do not have one. How to set up a Joomla child template.

    Club templates: check whether they already declare error-404. If not, you will add the include in Step 4.

    Step 2: Create the 404 content as a module

    1. Content → Site Modules → New
    2. Type: Custom (Custom HTML). Search, Latest Articles, or a menu module also work.
    3. Title: something you can find later, for example 404 message. You can hide the title.
    4. Write the message: short apology, home link, search, two or three real destinations. Keep it useful, not a joke that hides the next click.
    5. Position: type error-404 if it is not in the dropdown. Cassiopeia 5+ accepts it even when the style UI is thin.
    6. Status: Published. Menu assignment: On all pages. The error document is not a normal menu item. All pages is the safe assignment.
    7. Save.

    Use absolute https:// URLs for images and the home link. Relative src="images/…" often breaks on nested missing paths (/category/no-such-page). That is a known error-page path issue. Prefer full URLs until your Joomla patch level includes the error-page SEF fixes.

    Step 3: Test the status, then the design

    Open a URL that does not exist, for example https://www.example.com/this-page-is-not-real.

    You should see your module. Then check the status:

    • Browser Network tab, or
    • curl.exe -sI https://www.example.com/this-page-is-not-real

    You want HTTP/1.1 404 (or 404 from HTTP/2). If you see 200 or 302 to /404 or to an article, you still have a redirect in error.php or in .htaccess.

    Step 4: Joomla 4, or a template without error-404

    Copy parent error.php into the child (same filename at the child template root), then add the official include. Do not edit the parent Cassiopeia file.

    <?php
    $errorCode = $this->error->getCode();
    ?>
    <?php if ($this->countModules('error-' . $errorCode)) : ?>
      <div class="container">
        <jdoc:include type="modules" name="error-<?php echo $errorCode; ?>" style="none" />
      </div>
    <?php else : ?>
      <?php // keep the template's original default message here ?>
    <?php endif; ?>
    

    That snippet is the Joomla custom error pages pattern. Wrap it around the default heading so you do not delete fallback text.

    A full branded layout is still error.php in the child: logo, user.css, maybe a search module. Same child rule as any other PHP file.

    Step 5: 403, Redirects, and language strings

    Need Tool
    Forbidden (logged-out vs ACL) Module in error-403, same idea as 404
    Old URL has a new home System → Redirects, 301. Not a 404 page
    Default “page not found” wording only Language override, if you are not using a module
    Pretty CSS Child user.css, not a core Cassiopeia sheet

    Do not noindex a real 404 URL in an article. There should not be a public article acting as the 404 document.

    Key takeaways

    1. A custom 404 page must keep HTTP 404. Do not redirect error.php to a com_content article.
    2. On Joomla 5 and 6 Cassiopeia, publish a module in error-404.
    3. Put PHP and CSS in a child template. Parent updates will replace error.php if you edited Cassiopeia itself.
    4. Use absolute URLs for images and home on the error document.
    5. Test with a fake path and with the response code.
    6. Moved content is a 301. Gone content is a 404. Soft 200 is the worst of both.

    Need a branded error page built into a client template? Joomla design services. Ongoing 404 cleanup: Joomla SEO services.

    Frequently asked questions

    How do I create a custom 404 page in Joomla 5?

    Publish a Custom HTML module in the error-404 position on Cassiopeia (or a child that includes that position). Visit a missing URL and confirm HTTP 404.

    Should a Joomla 404 page return HTTP 200?

    No. 200 on a not-found URL is a soft 404. Keep 404. Redirects belong in the Redirect component when the page moved.

    Does the error-404 module work on Joomla 4?

    Not in core Cassiopeia 4. Copy error.php into a child and add the error-{code} module include, or run Joomla 5+ Cassiopeia.

    Why are images broken on some 404 URLs?

    The missing path is nested, and the image used a relative URL. Use absolute https:// links. Update Joomla when error-page SEF path fixes are in your branch.

    Can I use an article as the 404 page?

    You can, if you redirect to it. You should not. You lose a clean 404. Use a module on the error document instead.

    Will a Cassiopeia update delete my 404 module?

    No. Modules live in the database. A parent error.php you edited by hand can be overwritten. Keep PHP in a child.

  • How to Enable Maintenance Mode in Joomla

    How to Enable Maintenance Mode in Joomla

    To enable maintenance mode in Joomla, open System → Global Configuration, stay on the Site tab, set Site Offline to Yes, choose an offline message (and optional image), then Save. Guests see the offline page with a login form. The administrator stays available. This is core Joomla. You do not install a plugin. The same switch works on Joomla 4, 5.4, and 6. Joomla calls it Site Offline, not “maintenance mode.” Searchers use both names.

    The 2019 version of this page stopped at “set Yes and Save.” That is still the click. In 2026 you also need Offline Access for staff who are not Super Users, a message that is not a language-file hack, and a way back in if Global Configuration will not save.

    Public visitors see the Joomla offline page. Administrators keep using the backend

    Site Offline hides the frontend from guests. It does not lock you out of administrator.

    What you will learn

    • Where Site Offline lives on Joomla 4, 5, and 6
    • How to set a custom message and an offline image
    • Who can still log in on the frontend while the site is offline
    • How to grant Offline Access without making everyone a Super User
    • How to restyle the offline page in a child template
    • How to force the site online if configuration.php is stuck

    Official walkthrough: Taking the website temporarily offline. User manual: Site Offline.

    Site Offline versus a real outage

    Situation Use
    Planned update, template work, extension install Site Offline in Global Configuration
    White screen, 500, or you cannot open administrator That is a break, not maintenance. Start with diagnostics, not this switch
    You want HTTP auth in front of Joomla Directory privacy on the host. The Joomla guide covers that as a separate “all users” lock
    You only want a banner, site still public A module or a custom message, not Site Offline

    Site Offline is a flag in configuration.php (public $offline). When it is 1, the frontend layout is the offline view. Administrator is unchanged.

    Step 1: Open Global Configuration

    Log in to administrator.

    On Joomla 4, 5, and 6 go to System → Global Configuration. The Home Dashboard also has a Global Configuration icon. Both open the same form.

    Stay on the Site tab. That is the first tab. If you landed on Server or Permissions, click Site.

    Step 2: Set Site Offline to Yes

    Find Site Offline. Set it to Yes.

    Joomla then shows the offline-related fields: Offline Message, Custom Message, Offline Image.

    Do not Save yet if you still need to write the visitor-facing text. An empty custom message with “Use Custom Message” selected looks broken.

    Four steps: Global Configuration, Site Offline Yes, message, Save

    Save last. Test the frontend in a private window after Save.

    Step 3: Choose the message and image

    Offline Message has three useful values:

    Setting What visitors see
    Site language default The string from the site language file. English is “This site is down for maintenance. Please check back again soon.” Other languages use their own translation
    Use custom message The text in Custom Message
    Hide No message block. The login form can still appear

    Prefer Use custom message for a dated note: what you are doing, when you expect to return, a status URL if you have one. Do not promise a clock you cannot keep.

    Offline Image is optional. The help screens still advise keeping it under 400px wide. Upload through Media, then select it here. A huge PNG on a maintenance page is a bad first impression.

    If you only need to change the default English sentence and you are not using a custom message, use a language override for that string. Do not edit core .ini files.

    Step 4: Save and test as a guest

    Click Save or Save & Close.

    Open the public site in a private window, or another browser, not the session that is already logged in as Super User. Super Users with frontend access will not see what guests see.

    You should get the offline page and a login form. Administrator at /administrator/ must still load.

    If Global Configuration refuses to save, configuration.php is not writable. Fix permissions or the FTP layer, then try again. Joomla documents this under Cannot save Global Configuration changes.

    Step 5: Decide who may enter while it is offline

    The user manual is explicit: Site Offline does not apply to administrator. People who can log in to the backend can still log in to the frontend. Frontend login is denied by default to Registered, Author, Editor, and Publisher.

    Staff who are not Super Users need Offline Access.

    1. System → Global Configuration → Permissions
    2. Select the group (for example Manager, or a custom “Editors on call” group)
    3. Set Offline Access to Allowed
    4. Save

    Do not grant Super User to “let them see the site during maintenance.” That is the wrong permission.

    Step 6: Customize the offline page without editing core

    The default offline layout is a PHP view. To change markup, copy the layout into a child template html/ override. Do not edit Cassiopeia or components/ in place. Same rule as every other file Joomla will overwrite: customize Joomla without editing core.

    CSS for the offline page belongs in that child’s user.css, not in a compiled template sheet.

    If the job is a full branded holding page and you do not want to own the override, Joomla design services.

    Step 7: Turn maintenance mode off

    When the work is done:

    1. System → Global Configuration → Site
    2. Site OfflineNo
    3. Save

    Test as a guest again. If you still see offline, you are looking at cache (Joomla page cache, Cloudflare, or the browser). Purge those layers.

    If you are locked out of the switch

    If administrator is up but you cannot save Site Offline, or you need the site public from the server:

    1. Backup configuration.php.
    2. Open it in a file manager or SFTP.
    3. Find public $offline.
    4. Set it to '0' for online, '1' for offline.
    5. Save. Confirm the file is not left world-writable.

    Only do this when the admin form cannot save. A typo in configuration.php takes the whole site down.

    Key takeaways

    1. Joomla maintenance mode is Site Offline in Global Configuration on the Site tab.
    2. No extra extension is required on Joomla 4, 5, or 6.
    3. Save, then test in a private window. A Super User session is a bad test.
    4. Custom Message plus an optional image under 400px is the visitor-facing layer.
    5. Grant Offline Access to staff groups. Do not promote them to Super User for this.
    6. Override the offline layout in a child template. Leave core files stock.
    7. If the form will not save, $offline in configuration.php is the emergency switch.

    Need this done during an upgrade window? Joomla support and maintenance.

    Frequently asked questions

    How do I enable maintenance mode in Joomla 5 or 6?

    Open System → Global Configuration → Site tab, set Site Offline to Yes, set the message, then Save. The administrator stays online.

    Is Site Offline the same as maintenance mode?

    Yes, for Joomla. The product name is Site Offline. Searchers say maintenance mode. It is one switch.

    Can visitors still log in when the site is offline?

    Only groups with Offline Access (and users who can already use the backend). Registered, Author, Editor, and Publisher cannot, unless you change Permissions.

    Does Site Offline hide the Joomla administrator?

    No. /administrator/ stays available. Use host-level directory protection if you need to hide that too.

    Why do I still see the live site after setting Site Offline to Yes?

    You are logged in with access, or cache is serving the old HTML. Use a private window and clear Joomla plus CDN cache.

    Can I change the offline page HTML?

    Yes. Put an override in a child template. Do not edit core PHP. See Joomla child template.

    What if Global Configuration will not save?

    Make configuration.php writable long enough to save, or set public $offline by hand, then lock permissions down again.

  • Add a Favicon in Joomla on Any Template

    Add a Favicon in Joomla on Any Template

    To add a favicon in Joomla, change what the active site template (or a system plugin) prints in the page head as rel="icon". That is not always Cassiopeia, and it is not always three Joomla-named files. Helix, T4, Gantry, YOOtheme, and most club templates have their own favicon field or their own filenames. Cassiopeia is only the core default. View source, find the current href, then use that template’s option, replace that file, or inject a pack and strip the old tags.

    A favicon is the mark in the browser tab, bookmarks, and (with extra sizes) on a phone home screen. Joomla 4, 5, and 6 all work the same way at the HTTP level: whatever is in <head> wins. This guide starts with that, then covers template options, Cassiopeia’s media files as one special case, cache, and when a generator plugin is easier than fighting five different template UIs.

    Browser tab icon, phone icon, and template media files

    The tab shows whatever the assigned template or a plugin put in the head. Cassiopeia is one of those templates, not the only one.

    What you will learn

    • How to see which URL Joomla is actually using for the icon
    • Where commercial templates usually store the favicon (style options)
    • The Cassiopeia-only three-file names, if that is your template
    • Why Atum (administrator) is a separate pack
    • How cache hides a correct upload
    • When Easy Favicon is the template-agnostic manager

    Do not edit parent index.php to hard-code a <link>. Same rule as CSS: customize Joomla without editing core. Prefer a child template when you must change files.

    Step 1: See what is in the head

    Open the public site. View source. Search for rel="icon", apple-touch-icon, and shortcut icon.

    Write down:

    • The href (that is the file you must replace, or the tag you must override)
    • Whether there is more than one icon link (SVG plus ICO plus Apple is normal)
    • Whether the path is media/templates/…, templates/…, images/…, or a CDN

    If Helix (or another club template) prints a tag after Cassiopeia’s, the later tag often wins in the browser. Replacing Cassiopeia files then looks like “Joomla ignored me.” You were on the wrong template.

    Also check System → Site Template Styles. The style with the star (and any menu assignment) is the one that must receive the change.

    Step 2: Use the template’s own favicon control

    Most paid templates never use joomla-favicon.svg. They expect an upload in Template Styles.

    Template family Where to look first
    Helix Ultimate / JoomShaper Template Options → a logo or favicon / favicon ICO field (name varies by version)
    T4 (Joomlart) Template style → theme / site identity
    Gantry 5 Outline → Page Settings or atom for favicon
    YOOtheme Pro Customizer → favicon / apple-touch
    Other club templates Search the style for “favicon”, “icon”, or “site identity”
    Cassiopeia (core) No favicon field. Use the media files in the next section
    Atum (core admin) Separate administrator template. Frontend files do not change the backend tab

    Upload a square PNG or ICO, 512×512 or larger if the field accepts PNG. Save the style. Then skip to cache (Step 4) and prove the new href in view source.

    If the field only stores one ICO, you still will not get Apple 180 or Android adaptive icons unless the template generates them. That gap is why a pack plugin exists.

    Step 3: Replace files only when the head points at files

    This is the right move when view source shows a path under your template’s images or media folder.

    Cassiopeia (and a Cassiopeia child) is the documented core case. It loads three names:

    • joomla-favicon.svg (rel="icon")
    • favicon.ico (rel="alternate icon")
    • joomla-favicon-pinned.svg (rel="mask-icon")

    Path on Joomla 4.1, 5, and 6:

    media/templates/site/{template}/images/

    If the assigned style is a child cassiopeia_brand, that folder is media/templates/site/cassiopeia_brand/images/. Replacing files only on parent Cassiopeia does nothing while the child is default.

    If you replace only favicon.ico, Chrome can keep the SVG. Replace all three. Official map: Cassiopeia Template Folders and Files.

    Any other template: do not invent those three Joomla filenames. Replace the file the href already names, or use the template option in Step 2. Joomla 4.0-era templates/{name}/images/ still appears on old forks. Match the live href, not a blog from 2017.

    Root /favicon.ico: some bots still request it. It does not override a later SVG in Chrome.

    Create the icon files, put them where the template already points, clear cache, check the tab

    Wrong template style, or the wrong filename, is why the Joomla mark remains.

    Step 4: Clear cache and test in a clean browser

    1. System → Maintenance → Clear Cache
    2. Purge CDN cache if you use one
    3. Private window, or a browser profile that has not seen the old icon

    Chrome on phones caches favicons hard. View source again. The href must change. If it did not, you edited the wrong style or the template is still injecting the old URL.

    Pick the method

    Situation Do this
    Club template with a favicon upload Step 2. Then view source.
    Cassiopeia or Cassiopeia child Three named files in that template’s media images/ folder
    Head shows a path you do not recognise Replace that file, or the template option that wrote it
    Several icon tags from the template plus a plugin Strip or disable one source. Two systems fighting is the usual mess
    Apple, Android, dark mode, different admin tab Pack plugin (next section), or a full generator ZIP plus template fields
    Administrator tab still Joomla Atum media files or an admin pack. Frontend changes never touch it

    Managing icons across templates with Easy Favicon

    Template options and Cassiopeia files are enough when you have one ICO and a cooperative theme. They are a poor manager when every client site uses a different template, or when Helix keeps printing the old apple-touch link.

    Easy Favicon is a JoomlaX system plugin for Joomla 4, 5, and 6. It is template-agnostic: one master image, generate the pack, inject tags, optionally strip competing favicon and apple-touch tags so Helix, T4, or Cassiopeia defaults lose. That is the point of mentioning it here. It is not required to “add a favicon.”

    From System → Plugins → System – Easy Favicon you can manage:

    Need What it does
    One upload, usual sizes 16, 32, 48, Apple Touch 180, Android 192 and 512, optional ICO
    Site vs administrator Site pack, optional admin pack (reuse or a second master)
    Dark OS theme Optional dark masters
    Android cropping Maskable padding and background
    Template still winning Strip level for foreign icon tags
    Mobile chrome theme-color meta
    Another PWA owns the manifest Off, Generate, or Defer
    Handoff Preview, regenerate, ZIP. Files under images/easyfavicon/

    PHP 8.1+, GD or Imagick. No jQuery. Icons stay on your server.

    First run: install the inner plugin zip, enable it, choose a square master (512×512+ PNG or SVG), Generate all icons, clear cache, check the public tab, then the admin tab if the admin pack is on. If generate fails, check GD/Imagick. If the old icon remains, raise strip strength and purge CDN. If a PWA extension owns the manifest, set Defer or Off.

    Docs: Easy Favicon documentation. Demo: Easy Favicon demo. JED listing. JoomlaX is Infyways’ extension store.

    Key takeaways

    1. The favicon is whatever the assigned template or plugin puts in <head>. Start with view source.
    2. Most commercial templates use a style option, not Cassiopeia’s three filenames.
    3. Cassiopeia is the core default: joomla-favicon.svg, favicon.ico, joomla-favicon-pinned.svg in that template’s media images/ folder, preferably a child.
    4. Atum (admin) is a second template. Frontend files do not change the backend tab.
    5. Prove the new href, then fight cache.
    6. A pack plugin is for multi-size, admin, dark mode, and stripping template tags, not for every simple ICO swap.

    Client branding across club templates: Joomla design services.

    Frequently asked questions

    How do I add a favicon in Joomla 5 or 6?

    Find the assigned template style. Use its favicon option if it has one. On Cassiopeia, upload the three named files to that template’s media images/ folder. Clear cache and check view source.

    Does this only work with Cassiopeia?

    No. Cassiopeia is the core default and uses three specific filenames. Most live sites use Helix, T4, Gantry, YOOtheme, or another club template. Start from view source and that template’s style options.

    Why does Chrome still show the old icon?

    Wrong template style, a later tag from a club template, only one of several files replaced, or favicon cache. View source before you upload again.

    Do I need a plugin?

    No, if the template option or file replace already updates rel="icon". Yes, if you need a full size pack, a separate admin icon, or to strip Helix (or similar) tags.

    Where do Easy Favicon files live?

    Under images/easyfavicon/. The plugin injects head tags. You do not have to name Cassiopeia’s three files when it is managing the pack.

    Will a template update delete my favicon?

    A parent template media file can come back. A child, a template-style upload in the database, or plugin files under images/easyfavicon/ are safer.


    SEO Metadata

    Field Value
    Meta Title Add a Favicon in Joomla: Any Template, Not Only Cassiopeia
    Meta Description Add a Joomla favicon from the assigned template: style options, Cassiopeia media files, or a pack that strips club-template tags. Joomla 4, 5, and 6.
    URL Slug add-favicon-in-joomla-website-howto-guide
    Focus Keyword add favicon in Joomla
  • How to Safely Customize Joomla Without Editing Core Files

    How to Safely Customize Joomla Without Editing Core Files

    To customize Joomla without editing core files, put every change in a layer Joomla will not overwrite: a child template, user.css / user.js, a layout override in html/, a language override, a template style, or a custom plugin. Do not edit files under components/, modules/, plugins/, libraries/, or the parent template. Those paths come back to stock on the next Joomla, PHP, or extension update. This holds on Joomla 4.1+, 5.4, and 6. On Joomla 3 there is no Create Child Template button. You still use html/ overrides and language overrides. You do not patch core there either.

    Editing Cassiopeia, com_content, or a plugin “just this once” is how sites get stuck on old Joomla. The safe stack is smaller than it looks. Pick the smallest tool that matches the job, keep the parent stock, and check overrides after every update.

    Core Joomla files stay locked. Custom CSS and html overrides live in a child template

    Updates replace core and the parent template. Your child, language overrides, and custom plugins stay.

    What you will learn

    • What counts as a core file (and what does not)
    • Which Joomla tool to use for CSS, HTML, wording, and behaviour
    • How to set up a child template so CSS and overrides survive updates
    • Where user.css actually lives on Cassiopeia
    • How Create Overrides copies layouts into html/
    • When a language override or a custom plugin is the real fix
    • What to re-check after a Joomla update

    The problem core edits create

    You change one PHP file. The header looks right. Two weeks later Joomla ships a security release. The updater replaces that file. The header is stock again. Or worse: the update skips the file because it differs from the package, and you sit on an unpatched copy.

    That is not a discipline problem. It is how Joomla packages work. Core and most extension files are owned by the installer. Template styles (logo, colour params, menu assignment) live in the database and survive. Files you typed into components/com_content/ do not.

    The fix is not “remember to re-apply the hack.” The fix is never putting the hack in a path the installer owns.

    Official layout override model: Layout Overrides in Joomla. Child templates: Joomla User Manual, Child Templates. Cassiopeia user.css: Cassiopeia Template Customisation.

    What counts as a core file

    Treat these as do not edit:

    Path Why
    components/com_* Joomla and extension updates replace views
    modules/mod_* Same for module chrome and tmpl
    plugins/* Event code and plugin tmpl come back on update
    libraries/ Framework. A one-line patch here is a future outage
    media/vendor/ and compiled template CSS you did not create Next build or update wipes it
    Parent template files (Cassiopeia, Atum, a club parent) The parent is the package. Your child is the overlay

    These are safe homes when you use them as designed:

    Place What it stores
    Child template user.css, user.js, html/ overrides, extra positions, optional index.php
    Template style Params, logo, menu assignment. Not PHP.
    Language override UI strings. Not markup.
    Custom fields Extra data on articles, contacts, users
    Custom plugin or module you installed Behaviour you own. You still update that extension yourself.

    A duplicate of the whole Cassiopeia folder renamed “Cassiopeia custom” is not a child. It is a fork. You now maintain hundreds of files you did not write, and Cassiopeia security fixes never reach it.

    Pick the smallest safe tool

    Four jobs: CSS, HTML, text, behaviour. Four Joomla tools

    If CSS can do it, stop. If the string is a language key, do not override PHP to change a label.

    You want to… Use Do not
    Change colour, spacing, hide a block that already has a class user.css in the active template (child if you have one) Edit template.min.css or Bootstrap in media/
    Add a small script user.js or a proper Web Asset. Walkthrough: Add custom JavaScript to Joomla Paste <script> into core index.php
    Change article, blog, or module HTML Layout override in html/ Edit components/ or modules/
    Change plugin HTML (Prev/Next, vote, a field type) Plugin override in html/plg_… when the plugin has tmpl. Guide: Joomla plugin override Edit plugins/content/…
    Change a label, button, or email subject Language override Search-and-replace in PHP
    Extra data (price, spec, event date) Joomla custom fields Hack the article table
    Different logo or brand colour per section Template style (and a child if files must differ) Duplicate the whole template
    Different markup on one category only Alternative layout (filename without a leading underscore) if ($catid == 12) inside a core view
    Change how Joomla behaves (redirect, ACL, a new event) Custom plugin, or an extension you can update Patch libraries/
    Survive parent template updates Child template Edit Cassiopeia in place

    The rest of this article is the order of operations. The child-template post is the click-by-click for Create Child Template. Use that when you reach Step 2. Do not skip it and drop user.css into the parent “for now.”

    Step 1: Name the change before you open a file

    Write one sentence: “I need the article byline stacked, not inline,” or “I need the header background #0b3d5c,” or “I need Read more to say Continue.”

    Then classify it:

    1. Look only (colour, type, hide): CSS.
    2. Markup (extra wrapper, different heading level, remove a div): layout override.
    3. Wording: language override. Confirm with Debug Language if you are unsure which key it is.
    4. Data: custom field, not a new column in #__content by hand.
    5. Logic: plugin. If you cannot name the event (onContentPrepare, onAfterRoute), you are not ready to write PHP.

    If you cannot classify it, you are about to edit the wrong file.

    Step 2: Create a child template (Joomla 4.1 and later)

    On Joomla 4.1, 5, and 6, open System → Templates → Site Templates, open an inheritable parent (Cassiopeia is the one that ships ready), and click Create Child Template. Assign the child’s style as default or per menu item.

    Full clicks, media/ vs templates/, Atum, and making a custom parent inheritable: How to set up a Joomla child template.

    Until that style is assigned, the public site still uses the parent. Creating the child does not change the frontend by itself.

    Joomla 3: there is no native child. Keep overrides in your template html/ folder. Prefer a template you control, not a club template you will overwrite on the next vendor zip. Plan the Joomla 3 to 6 upgrade so you can use children.

    Joomla 6: Cassiopeia Extended is already a child of Cassiopeia. Do not hack Extended as if it were a parent. Copy the child (6.1) or create your own child of Cassiopeia.

    Four steps: child template, user.css, layout override, language override

    Do these in order. CSS first. PHP last.

    Step 3: Put CSS in user.css (not in the compiled sheet)

    Cassiopeia loads user.css if the file exists. On Joomla 4.1 and later the path is:

    media/templates/site/{template}/css/user.css

    For a child named cassiopeia_brand, that is media/templates/site/cassiopeia_brand/css/user.css, not the parent’s file. A child does not load the parent’s user.css. If you already wrote rules in Cassiopeia and then created a child, copy them into the child’s file or the site will look stock.

    In Template Manager: open the template, select the css folder, New File, name user (no suffix), type .css.

    The Joomla 4.0-only path templates/cassiopeia/css/user.css was moved into media/ when child templates landed. If your CSS “does nothing,” you are almost always in the old folder, or you assigned a child while the file still sits on the parent. The next article in this series is the CSS-not-showing checklist. Until then, use the child-template user.css section.

    Keep !important rare. Cassiopeia registers user.css with a high asset weight so it loads after the template sheet.

    Step 4: Override HTML with Create Overrides

    For component and module layouts:

    1. System → Templates → Site Templates → {your child} → Create Overrides
    2. Pick the component view or module.
    3. Joomla copies the file into templates/{child}/html/…
    4. Edit that copy only.

    Filename rules matter. A copy named _default.php or a typo in the folder (com_content/article vs com_content/articles) means Joomla never loads it. Create Overrides is there so the path is correct.

    Plugin layouts usually do not appear in that list. You copy tmpl by hand into html/plg_{group}_{element}/. Details: plugin overrides in the html folder.

    After a Joomla update, open the template’s Overrides (or Updated Files) list. If core changed a layout you overrode, diff your copy. Joomla documents this as override management. It does not watch user.css or user.js. You review those yourself.

    🔗 Layout Overrides in Joomla
    Folder map for components, modules, plugins, and JLayouts.

    Step 5: Change wording with a language override

    If the public string exists in a .ini language file, System → Language Overrides. Site vs Administrator is a different list. Debug Language shows the constant on the page.

    Do not override default.php to change “Read more.” That is a core-edit habit with extra steps.

    Setup: Joomla language overrides.

    Step 6: Add data with custom fields, not a core hack

    Price, subtitle, event date, and spec tables belong in Content → Fields. Automatic display or a field layout in the child. If you still run K2 extra fields, migrate on Joomla 3 first: K2 to com_content.

    Fields how-to: Joomla custom fields.

    Step 7: Change behaviour with an extension you own

    Redirect rules, extra authentication, “hide this module when…” that CSS cannot express: write or install a plugin. Leave plugins/system/sef and libraries/src alone.

    If an installed extension is broken, do not patch its PHP on the server. Duplicate the plugin with a new element name, or wait for the vendor, or replace it. A patched third-party file is the same class of problem as a patched core file.

    Need a plugin built to spec? Joomla plugin development.

    After every Joomla or template update

    1. Clear Joomla cache and your browser cache.
    2. Open the child template Overrides list. Diff any layout Joomla marked as updated.
    3. Skim user.css for selectors that no longer exist (Cassiopeia class names do change between major versions).
    4. Confirm the child style is still default or still assigned to the right menus.
    5. If you use a club parent, read the vendor notes before you copy their new index.php over your child copy.

    This five-minute pass is cheaper than discovering a blank header on Monday.

    What this does not replace

    A child template is not a page builder, a CDN, or a backup. It does not fix PHP 8 fatals from an old extension. It does not make a commercial template inheritable until the vendor sets <inheritable>1</inheritable> and moves CSS under media/.

    Safely customize Joomla without editing core files means you still test on staging. Overrides can be wrong. CSS can hide the cart button. The rule is only: when it is wrong, the stock parent is still there to compare against.

    Key takeaways

    1. Never edit components/, modules/, plugins/, libraries/, or the parent template to “make it look right.”
    2. Classify the job: CSS, HTML, string, data, or behaviour. Use one tool.
    3. On Joomla 4.1+, create a child, assign its style, then add files.
    4. Cassiopeia custom CSS belongs in media/templates/site/{template}/css/user.css on the active template.
    5. Layout overrides live in the child’s html/ folder. Create Overrides for components and modules. Plugin tmpl is usually manual.
    6. Labels go through language overrides. Extra article data goes through custom fields.
    7. After updates, diff overridden PHP. Review user.css yourself. Joomla will not do that for you.

    If the next problem is “I did all this and the CSS still does not load,” that is the 4 September post in this series. If the override PHP does not run, that is the 11 September post.

    Need a template customized without forking core on a client site? Joomla design services.

    Related Joomla troubleshooting

    Frequently asked questions

    Can I customize Joomla without editing core files?

    Yes. Use a child template, user.css, layout overrides in html/, language overrides, custom fields, and custom plugins. Leave core and parent template files stock.

    Is editing Cassiopeia the same as a child template?

    No. Cassiopeia is the parent package. Updates replace it. A child stores only your files. Setup: Joomla child template.

    Where do I put custom CSS in Joomla 5?

    For Cassiopeia, media/templates/site/cassiopeia/css/user.css, or the same path under your child name. Create the file if it is missing. The old templates/cassiopeia/css/ location is the Joomla 4.0-era path.

    Do template overrides survive a Joomla update?

    Overrides in a child (or in a template Joomla does not overwrite) stay on disk. The source layout in components/ may change. Diff your copy after the update. CSS is not in that checker.

    Can I edit a plugin file if I back it up?

    You can. The next extension update still overwrites it, or the updater skips it and you stay unpatched. Use an html/plg_… override when there is a tmpl, or a plugin you own when you need logic.

    What about Joomla 3?

    No native child template. Use html/ overrides and language overrides on a template you control. Do not patch components/. Move to 4.1+ when you can so children exist.

    Is a template style enough?

    For logo, colour parameters, and menu assignment, yes. For PHP, CSS files, and overrides, you need a child (or a template you fully own). A style still points at the same files.


    SEO Metadata

    Field Value
    Meta Title Safely Customize Joomla Without Editing Core Files
    Meta Description Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work.
    URL Slug joomla-customize-without-editing-core
    Focus Keyword customize Joomla without editing core

    Character counts:

    • Meta Title: 50 chars
    • Meta Description: 158 chars

    HTML Meta Tags

    <title>Safely Customize Joomla Without Editing Core Files</title>
    <meta name="description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />
    <link rel="canonical" href="https://www.infyways.com/joomla-customize-without-editing-core/" />
    <meta property="og:title" content="Safely Customize Joomla Without Editing Core Files" />
    <meta property="og:description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />
    <meta property="og:url" content="https://www.infyways.com/joomla-customize-without-editing-core/" />
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:title" content="Safely Customize Joomla Without Editing Core Files" />
    <meta name="twitter:description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />
    
  • Joomla Plugin Overrides in the html Folder

    Joomla Plugin Overrides in the html Folder

    A Joomla plugin override is a copy of a plugin layout file in your template html folder. The path is templates/{template}/html/plg_{group}_{element}/{layout}.php. It works on Joomla 4, 5.4, and 6 for any plugin group (system, content, fields, user, authentication, editors-xtd) if that plugin loads a layout through PluginHelper::getLayoutPath(). That almost always means a tmpl folder. No tmpl means there is nothing for html/ to replace. Most system plugins have no layout. A few that print HTML do.

    This is the 2026 operator guide. It is not limited to page navigation. You will test for a layout, name the folder, put the file in a child template, and know when CSS or a language override is the real fix.

    Plugin tmpl file copied into the template html/plg folder

    The plugin keeps the logic. Your template keeps the HTML. Updates replace the plugin. Your copy stays if it lives in a child.

    What you will learn

    • How plugin overrides differ from component and module overrides
    • The tmpl test that decides yes or no, including system plugins
    • The exact html/plg_{group}_{element}/ folder name
    • Why Create Overrides in the template manager usually hides plugins
    • How to override content page navigation, content vote, and field types
    • What a plugin override can change, and what it cannot
    • When to use html/layouts/ instead of html/plg_…
    • How to debug an override that “does nothing”

    The problem plugin overrides solve

    You want Prev/Next as buttons. You want the vote stars in a different order. You want a field type to print a badge instead of a definition list.

    The HTML lives inside the plugin, not in com_content’s article layout. Editing plugins/content/pagenavigation/tmpl/default.php works until the next Joomla or extension update puts the stock file back.

    A component override of the article view does not catch output the plugin injects later. A module override does not catch it either. You need a plugin override, or you are hacking core.

    Official path and the tmpl rule: Layout Overrides in Joomla. The J4 layout page shows the same idea for vote: Template Layouts.

    Three kinds of output, three folders

    What prints HTML Source folder Override folder
    Component view components/com_*/tmpl/… html/com_*/{view}/
    Module modules/mod_*/tmpl/ html/mod_*/
    Plugin with tmpl plugins/{group}/{element}/tmpl/ html/plg_{group}_{element}/
    Shared JLayout layouts/… or extension layouts/ html/layouts/…

    Create Overrides under System → Site Templates → {template} → Create Overrides lists components, modules, and many JLayouts. It usually does not list plugins. You create html/plg_… by hand. That is why people think plugin overrides do not exist.

    The tmpl test (including system plugins)

    If the plugin has tmpl, override it. If not, use CSS or another plugin

    System is not a special exception. The test is the same for every group.

    1. Open plugins/{group}/{element}/.
    2. If you see tmpl/ with .php files, a template override is possible if the PHP calls PluginHelper::getLayoutPath('{group}', '{element}', '{layout}') (or the CMS plugin helper equivalent).
    3. If there is no tmpl and no JLayout render, stop. html/plg_system_cache/ will never run. Cache, SEF, Redirect, Language Filter, Remember Me, and most authentication plugins have no frontend layout.
    4. Optional confirmation: search the plugin PHP for getLayoutPath. If HTML is concatenated in the event method (return '<div>…'), the author did not make it overridable. Fork the plugin or ask the vendor. Do not patch core.

    Developer note: the helper is JoomlaCMSPluginPluginHelper::getLayoutPath($type, $name, $layout = 'default'). The third argument is the file name without .php.

    What you can do, and what you cannot

    An override only replaces markup the plugin already prints through a layout. It does not become a second plugin. If the job is behaviour, routing, or a string, use a different Joomla tool.

    What you can do

    You can… How
    Restyle Prev/Next, vote, a field type Copy tmpl into html/plg_{group}_{element}/
    Change wrappers, classes, HTML5 Edit that PHP layout. Keep the variables the plugin passed in
    Override a system plugin that prints UI Same path: html/plg_system_{element}/ when tmpl exists
    Override a fields plugin type html/plg_fields_{type}/ (all fields of that type)
    Override backend plugin HTML Administrator child of Atum, same plg_ folder
    Override a JLayout the plugin calls html/layouts/…, not html/plg_…
    Keep the change through Joomla updates Put the file in a child template
    Hide or reorder bits that are already in the layout Comment out or move the HTML in your copy

    What you cannot do

    Joomla does not scan html/plg_* for every plugin. It only looks there when the plugin calls getLayoutPath() (or a JLayout helper) to include a file. If that call never happens, your copy is never loaded. That is the whole “why” for most of the rows below.

    You cannot… Why Do this instead
    Override a plugin with no tmpl There is no layout file to swap. SEF, cache, and Redirect never include PHP from html/. A folder named plg_system_sef is ignored. Parameters, CSS, or a custom plugin on the same event
    Override HTML built as a string in PHP return '<div>…' never asks getLayoutPath. The template search never runs. Ask the vendor for a tmpl, or fork the plugin
    Turn the plugin on or off Enable, access, and ordering live in #__extensions / the Plugins screen. Layouts do not run that code. System → Plugins
    Change SEF, 301s, cache, language filter Those plugins rewrite URLs or headers. They do not print a view. Plugin options, .htaccess, com_redirect
    Prev/Next on one article only One layout file serves every article that plugin runs on. Joomla has no “this menu item uses that plugin tmpl” dropdown. CSS for that page, a module, or an article override
    One custom field, not the type plg_fields_text is the type plugin. Every text field shares that tmpl. Field id is data, not a layout name. Custom fields display, or {field ID}
    Change “Read more” or button labels Those strings go through Text::_() and language files. The layout only prints whatever translation returns. Language override
    Change the article body com_content renders the article. The plugin injects extra HTML later. Different search path: html/com_content/, not html/plg_. Article (or category) layout override
    Change a module chrome Modules use html/mod_*. Plugin helper never looks there. Module override
    Pick an alternative layout like a module Modules register extra files in a form field. Most plugins hardcode 'default' (or 'vote') in PHP. Extra files in tmpl/ are unused unless that string changes. Override the layout the PHP already names
    Auto-merge after a plugin update Joomla copies nothing into your html/ file. Your copy wins forever, including stale variables. Diff against the new tmpl after each update
    Keep PHP on a template style A style is a row of parameters and menu assignment. It has no html/ directory. Files in the template (child) folder
    Make Create Overrides list the plugin That screen is built from component views, modules, and known layout folders. Plugin tmpl is often omitted on purpose. Create html/plg_{group}_{element}/ yourself
    Use the site template for admin plugin HTML Site and administrator are different CMS applications, different template roots. Atum child: administrator/templates/{child}/html/plg_…

    The pattern is the same every time: no layout lookup, no override. Group system is not a lock and not a key. Only the PHP that includes a file is.

    How to name the html folder

    templates/{template}/html/plg_{group}_{element}/{layout}.php
    

    {group} is the first directory under plugins/ (system, content, fields, user, …). {element} is the plugin folder name (the element in the XML). Underscores in the plugin name stay. Prefix is always plg_.

    Group Typical override Notes
    content html/plg_content_pagenavigation/default.php Prev/Next on articles
    content html/plg_content_vote/vote.php Also rating.php in the same folder
    fields html/plg_fields_text/text.php Per field type, not per field id
    system html/plg_system_{element}/default.php Only if that system plugin has tmpl
    user html/plg_user_{element}/… Profile extras that ship layouts
    editors-xtd Rare tmpl Buttons are often JS, not PHP layouts
    privacy / MFA Check tmpl Captive or consent screens when they exist

    System, content, fields, and user plugin groups can all use html/plg

    Same formula. Different group name. The Create Overrides tab still may not show them.

    Wrong folder names that fail silently:

    • html/pagenavigation/ (missing plg_content_)
    • html/plugins/system/example/ (that is not how Joomla looks up plugin layouts)
    • html/plg_system_example/tmpl/default.php (no extra tmpl under html)

    Site overrides go in the site template. Administrator plugin UI (if any) goes in an administrator template such as a child of Atum: administrator/templates/{atum_child}/html/plg_….

    Put the file in a child template

    Copying into Cassiopeia’s html/ works until Cassiopeia updates. Create a child first, assign its style, then add html/plg_… there. Setup: How to set up a Joomla child template.

    A template style does not store PHP. Only the template folder does.

    Step 1: Confirm the plugin is overridable

    1. System → Plugins. Note Type (group) and Element (folder name).
    2. On disk: plugins/{type}/{element}/tmpl/.
    3. Open the main plugin class. Confirm getLayoutPath.
    4. Note every layout file (default.php, vote.php, rating.php). You override only the files you copy. Missing files still load from the plugin.

    Backup the site. An override with a PHP error blanks the page that loads that plugin.

    Step 2: Create the html folder

    On the active template (the child):

    templates/{your_child}/html/plg_{type}_{element}/
    

    Example for page navigation:

    templates/cassiopeia_site/html/plg_content_pagenavigation/
    

    FTP, hosting file manager, or System → Site Templates → {child} → html (create folder if the UI allows). The template manager will not invent plg_content_pagenavigation for you.

    Find tmpl, create the html folder, copy the PHP, then test

    Manual folder. Then copy. Then cache. The public page does not change until the active template is the one that contains the file.

    Step 3: Copy the layout and edit HTML only

    Copy plugins/{type}/{element}/tmpl/{layout}.php into that folder. Same file name.

    Change markup, CSS classes, wrapping. Keep the PHP that reads $displayData or the variables the plugin set up. If you drop a required variable, the layout fatals.

    Do not copy the plugin class, XML, or language files into html/. Those are not overrides.

    Step 4: Clear cache and prove the file is used

    1. Assign the child template style to the menu item (or as default).
    2. System → Clear Cache (and any page-cache plugin).
    3. Add a harmless HTML comment or class in the override. View source. If it is missing, Joomla is not loading that file.

    Then style for real.

    Worked example: page navigation

    Core plugin Content – Page Navigation. Group content, element pagenavigation.

    Path
    Original plugins/content/pagenavigation/tmpl/default.php
    Override templates/{child}/html/plg_content_pagenavigation/default.php

    Enable the plugin. In the article Options (or menu item), show page navigation. Edit the override to wrap links in your button classes. This is the example every old tutorial uses. It still works on Joomla 5 and 6.

    Worked example: article vote

    Core plugin Content – Vote. Layouts include vote.php and rating.php.

    templates/{child}/html/plg_content_vote/vote.php
    templates/{child}/html/plg_content_vote/rating.php
    

    Copy both if you change both. Copy one if you only restyle the form or only the stars.

    Worked example: a custom field type

    Field plugins live in plugins/fields/{type}/tmpl/. Override:

    templates/{child}/html/plg_fields_{type}/{layout}.php
    

    That restyles every field of that type. It does not restyle one field id. For one field, Automatic Display, {field ID}, or an article override is the custom fields path. For “Read more” text, use a language override, not a plugin layout.

    System plugins: when html/ works

    A system plugin that only listens (onAfterRender, onAfterRoute, headers, redirects) has no layout. Creating html/plg_system_redirect/ does nothing. Redirect rules stay in com_redirect.

    A system plugin that prints a box, bar, or consent UI and ships tmpl/ uses the same formula:

    plugins/system/{element}/tmpl/default.php
    → templates/{child}/html/plg_system_{element}/default.php
    

    Third-party docs that show html/plg_system_mcnsystem/ are using this rule. Your vendor’s element name replaces theirs.

    Debug, privacy consent, guided tours, and similar core tools may use tmpl or JLayout. Check the disk. Do not assume every system plugin in Joomla 6 gained a layout. Most still have none.

    JLayout is a different folder

    If the plugin (or core) calls LayoutHelper::render('joomla.content.…') or a namespaced layout, the override is:

    templates/{child}/html/layouts/joomla/…
    

    or the same tree the layout name implies under html/layouts/.

    Do not put a JLayout file in html/plg_content_vote/ unless that is actually how getLayoutPath resolves it. Mixing the two folders is the usual “I copied it and nothing changed” bug after tmpl exists.

    The Create Overrides tab does list many layouts/joomla files. Use it for those. Use a manual plg_ folder for plugin tmpl files.

    Alternative layouts

    Modules and articles can have extra files without underscores, chosen in a dropdown. Plugins almost never expose that dropdown. A second file in tmpl/ is used only if PHP asks for that layout name. For plugins, you normally override default (or vote / rating) in place. You do not get a “use my layout on this menu item” switch unless the plugin author coded one.

    What a plugin override is not

    Use the tables above. Short version: markup in a layout, yes. Events, routing, one-off pages, and language strings, no.

    Troubleshooting

    Symptom Likely cause
    Nothing changes Wrong plg_{group}_{element} name, or no getLayoutPath
    Nothing changes Active style is still the parent, not the child that has html/
    Nothing changes Cache, CDN, or you edited a layout the plugin never loads
    White screen PHP error in the copied file
    Breaks after update Plugin tmpl added variables. Diff your copy against the new original
    Works in HTML, not in admin Site vs administrator template

    After every extension update, diff override vs new tmpl. Plugin overrides are not merged automatically.

    Key takeaways

    1. Plugin overrides are real on Joomla 4, 5, and 6. They are usually manual.
    2. Folder: html/plg_{group}_{element}/{layout}.php.
    3. tmpl plus getLayoutPath means yes. No layout means no, including most system plugins.
    4. You can change markup, classes, and field-type HTML. You cannot change plugin events, SEF, cache, or one article only.
    5. System plugins that print HTML and ship tmpl use html/plg_system_{element}/.
    6. Content vote, page navigation, and field types are the core examples you will actually use.
    7. JLayouts use html/layouts/, not html/plg_….
    8. Store the file in a child template. Re-diff after updates.

    Frequently asked questions

    Can I override a system plugin in the html folder?

    Yes, if that system plugin has a tmpl file loaded with getLayoutPath. No, if it only hooks events and never includes a layout. The group name system does not block overrides and does not magically enable them.

    Why is my plugin missing from Create Overrides?

    Joomla’s override UI is built around component views, modules, and many layouts. Plugin tmpl files are often omitted. Create html/plg_{group}_{element}/ yourself.

    Does this work the same on Joomla 5 and Joomla 6?

    Yes. The helper and folder formula did not change. More core plugins may ship tmpl than in Joomla 3. Always check the folder on disk. Do not trust a wiki sentence that says only page navigation is overridable.

    Can I override only one article’s page navigation?

    Not with a plugin override. The override applies everywhere that plugin layout runs. For one page, CSS, a module, or a different article layout is the usual workaround.

    Should I edit the plugin PHP instead?

    No. Updates wipe it. If there is no layout, write a small custom plugin or use parameters. If there is a layout, copy it into the child html/ folder.

    Where do administrator plugin screens get overridden?

    In the administrator template, typically a child of Atum: administrator/templates/{child}/html/plg_{group}_{element}/. Site html/ does not apply to the backend.

    Conclusion

    Plugin HTML is overridable. The Create Overrides tab just does not advertise it. Test for tmpl, name plg_{group}_{element}, put the file in a child, and leave system plugins without layouts alone.

    If you are still editing Cassiopeia html/ directly, create the child first. If the text is a language string, override the string. If the extra data is a field, custom fields plus a field-type plugin override cover display.

    Need this done on a client template? Joomla design services.

  • Joomla Custom Fields: The K2 Extra Fields Replacement

    Joomla Custom Fields: The K2 Extra Fields Replacement

    Joomla custom fields are core extra data on articles, contacts, and users. They live at Content → Fields (and Field Groups) on Joomla 4, 5.4, and 6. They replace K2 extra fields: typed inputs, groups as editor tabs, values stored per item, optional automatic display on the public page. You do not need K2, a CCK, or a page builder for price, author bio, event date, or a specification table. If you still run K2, copy extra fields into this system on Joomla 3 first. That pipeline is the companion guide: Migrate K2 to Joomla articles before you upgrade.

    This article is the feature how-to. The K2 article is the migration sequence. Read both if you are leaving K2. Read only this one if you already use com_content and need structured data on articles.

    K2 extra fields become Joomla custom fields

    K2 stored extra data on items. Joomla stores the same idea on native articles, with groups, category assignment, and display you control.

    What you will learn

    • How custom fields differ from K2 extra fields (and from article body HTML)
    • Field vs field group vs category assignment
    • How to create a group, a field, and a value on an article
    • Automatic display vs {field} in the body vs a layout override
    • What a K2 migration copies, and what you still set by hand
    • When a child template is the right place to print fields

    How this guide and the K2 guide split the work

    You need to… Open
    Move K2 items, categories, tags, images, and 301s, then upgrade 3 → 4 → 5 → 6 Migrate K2 to Joomla articles
    Understand, create, assign, and display custom fields (including after that copy) This article
    Recover a site that already jumped to Joomla 5 with K2 still installed K2 not working in Joomla 5 or 6

    Migrate K2 Pro (phase 2) creates field groups, fields, and values from published K2 extra fields. It does not choose Automatic Display, rebuild your K2 item layout, or invent {field} shortcodes in the article body. Those jobs stay here.

    Why custom fields exist (and why they beat extra fields)

    K2 extra fields existed because Joomla 1.5 and 2.5 articles were title, images, and HTML. Magazines needed “Source,” “Duration,” “Price,” “GPS.” K2 bolted that onto com_k2.

    Joomla 3.7 added custom fields to core. Joomla 4, 5, and 6 kept and extended them. Tags, nested categories, and workflows also moved into core. K2 did not follow Joomla 4. Extra fields therefore have no future as a platform. Custom fields do.

    Custom fields are not a second article. They are named, typed, filterable values attached to an item. The editor shows them on a Fields tab, or on a tab named after the field group. The public site can print them automatically, or you print them in an override.

    Use a field when the value is structured (a number, a list, a date, a media file, a yes/no). Keep narrative in intro/full text. Do not paste a spec sheet into TinyMCE if you will sort, filter, or style it later.

    🔗 Joomla Docs: Adding custom fields (J5)
    Official entry points: Content → Fields, Field Groups, and the context dropdown (Article vs Category).

    K2 extra fields vs Joomla custom fields

    Idea K2 Joomla 4 / 5 / 6
    Where you click K2 extra field groups inside K2 Content → Fields and Content → Field Groups
    Attached to K2 items (and K2 categories in K2’s model) Articles, article categories, contacts, users (separate contexts)
    Grouping in the editor Extra field groups Field groups become tabs
    Which items show the field Tied to K2 extra field group assignment Assigned categories (default All does not include Uncategorised)
    Public output K2 item template / extra fields block Automatic Display, {field ID} in the body, or com_fields layouts
    Survives Joomla 5 and 6 No Yes
    After Migrate K2 Pro n/a Groups, fields, and values exist. Display and category assignment still need a pass

    Typical K2 extra field types mapped onto Joomla custom field types

    Types are close, not identical. Confirm list options and media paths after a migration. Do not change a field type after it already holds data.

    Approximate type mapping (what operators actually meet):

    K2 extra field style Joomla field type to expect
    Text / header-style text Text
    Textarea Textarea
    Select / multiple select List
    Radio Radio
    Checkbox Checkboxes or List (depends how K2 stored it)
    Link URL or Text
    Date Calendar
    Image / media Media
    CSV / lists of pairs Often List or Repeatable/Subform on a rebuild. Check values after migrate

    If a migrated field looks wrong, do not flip Type on a live field with thousands of values. Create a new field, copy values if needed, and retire the old one.

    Step 1: Create a field group

    Groups are editor UX. They do not change the database value. They become tabs on the article form.

    1. Content → Field Groups.
    2. Set the context to Article (not Category, unless you are adding data to the category itself).
    3. New. Title something editors will recognise: Specs, Source, Event.
    4. Save.

    No group means every field piles onto a single Fields tab. That is fine for two fields. It is miserable for twenty.

    After a K2 migration, groups usually already exist. Rename titles for editors. Do not delete a group until you confirm no field still points at it.

    Step 2: Create the field and assign categories

    1. Content → Fields, context Article, New.
    2. Title: what editors see.
    3. Name: lowercase, no spaces. Used in overrides and {field} lookups. Set it once.
    4. Type: pick before you save production data.
    5. Field Group: the tab from Step 1.
    6. Assigned Categories: All, or the categories that should show this field. Remember: All skips Uncategorised. If migrated K2 items landed in Uncategorised, assign that category explicitly or move the articles.
    7. Required, default, filter: set now. Filter decides sanitisation (Text, Integer, HTML, Raw).
    8. Save.

    New articles show the field only after a category is chosen. That is normal. Joomla waits for the category so it can apply assignment.

    Create a group, create a field, assign categories, then choose display

    Order: group (tab), field (type and name), category (where it appears), display (what visitors see).

    Step 3: Choose how the public page prints the field

    Automatic Display (on the field):

    Setting Where it injects
    After Title Between the title and the intro
    Before Display Content Above the article body
    After Display Content Below the article body
    Do not automatically display Nothing until you print it

    A whole field group renders as one block, in field order, in that position.

    Use automatic display for simple “label: value” lines (source, duration, licence).

    Use Do not automatically display plus:

    • {field 12} (field ID) in the article body when placement must differ per article, or
    • a layout override when every article in a category needs a spec table, cards, or schema markup.

    Overrides belong in a child template, typically under html/layouts/com_fields/ or in the article default.php if you print $this->item field arrays yourself. Editing Cassiopeia core files will be wiped on update.

    Automatic display positions: after title, before content, after content

    Automatic display is the fast path. Overrides are the design path. Shortcodes are the one-off path.

    K2 item templates that loop extra fields do not run after you uninstall K2. If the magazine layout was a two-column spec grid, plan the override before you delete html/com_k2. The values will be in custom fields. The HTML will not.

    Step 4: After a K2 migration, walk the fields once

    If you used Migrate K2 Pro:

    1. Content → Fields and Field Groups. Counts should match published K2 extra fields and groups.
    2. Open five articles. Fields tab (or the group tab) must show values, not empty inputs.
    3. Set Automatic Display on the fields you want visitors to see without an override. Migration does not guess your old K2 item chrome.
    4. Fix category assignment. If a field vanished from the editor, the article category is not in the assigned list (Uncategorised is the usual trap).
    5. Spot-check media fields. Paths should point at images/k2-migrated (or your configured base), not media/k2/.
    6. Rebuild the public layout: automatic display, then override if the design is more than a label list.

    Permissions: if an editor cannot see a field, check the field’s Access and Display When Read-Only. That is not a migration bug.

    What custom fields are not

    You need to… Use
    Change “Read more” or module chrome Language override
    Change HTML structure of the article Layout override in a child template
    Move K2 items and URLs onto core K2 to com_content migration
    Store a novel in the article Intro and full text, not a textarea field
    Comments or file attachments from K2 Export from the migrator. Core fields can hold a file you attach later. They do not import K2 comment threads

    Key takeaways

    1. Custom fields are core. They are the replacement for K2 extra fields on Joomla 4, 5, and 6.
    2. Group = editor tab. Field = type, name, value. Category assignment = which articles show the input.
    3. Default All categories does not include Uncategorised.
    4. Automatic Display prints a block. {field ID} places one value in the body. Overrides print a designed layout.
    5. Migrate K2 Pro copies groups, fields, and values. You still set display and rebuild K2 item chrome.
    6. Do not change Type on a field that already has production values.
    7. Put field layout PHP in a child template, not in the parent.

    Frequently asked questions

    Are Joomla custom fields the same as K2 extra fields?

    Same job, different system. Both attach typed data to content. Custom fields are core, work on Joomla 5 and 6, and use category assignment plus Automatic Display. Extra fields die with K2.

    Do I create fields before or after I migrate K2?

    Let the migrator create them from published extra fields, then adjust display and assignment. Creating a parallel set by hand first causes duplicate names and empty values. Manual field setup is for sites that never used K2.

    Why is the Fields tab missing on a new article?

    No category is selected yet, or the field is not assigned to that category. Choose the category. Check assignment. Remember Uncategorised is outside All.

    Can I show a field only in an override, not above the article?

    Yes. Set Automatic Display to Do not automatically display, then print the field in a child-template layout.

    Will custom fields survive a Joomla 5 or 6 upgrade?

    Yes. They are com_fields. K2 extra fields will not, because K2 will not. That is why the K2 migration runs on Joomla 3.10 first.

    Can I use custom fields on contacts or users too?

    Yes. Those are different contexts (Contacts → Fields, Users → Fields). Article fields do not automatically appear on contact forms. Create fields in the context you need.

    Conclusion

    K2 extra fields were a product. Joomla custom fields are the CMS. Create groups, assign categories, then decide display. If the data still lives in K2, migrate to articles first, then come back to this page and finish Automatic Display and the article layout.

    Need both the copy and the field UI done on a large magazine? Joomla K2 migration services.

  • How to Override Any Joomla Language String

    How to Override Any Joomla Language String

    A Joomla language override is a per-language replacement for any string that the CMS prints through a language constant. In Joomla 4, 5.4, and 6.1 it lives at System → Manage → Language Overrides. It can change modules, components, plugins, templates, and core text. You do not need a translation field on each extension. If the PHP calls Text::_(), one override per language is enough.

    This is still the right tool in 2026. The path is the same on Joomla 5.4 and Joomla 6. Login, Articles, plugins, Cassiopeia, Atum, and third-party extensions that follow Joomla practice all use it.

    One Language Overrides screen covers modules, components, plugins, templates, and core

    One screen. Five layers: modules, components, plugins, templates, and core strings.

    What you will learn

    • That overrides are not limited to modules
    • Why UI text is a language constant, not an XML parameter
    • How to create an override for Site vs Administrator
    • How to find a constant when you only know the English words
    • How to keep placeholders (%s, {name}) intact
    • How overrides differ from multilingual associations and from editing language files

    The problem Language Overrides solve

    You publish a multilingual site. Italian visitors still see English on Forgot your password?, Read more, plugin messages, template tooltips, and administrator buttons.

    You open the module, the article options, or the plugin. You look for “Italian label” on every string. It is not there. You duplicate modules per language, or you edit .ini files over FTP. The next update wipes the files. The extra module copies still show English on anything that comes from Text::_().

    That is not a broken extension. Joomla does not store that chrome in each form. The code holds a constant. A language file supplies the words. If Italian has no override and no packaged it-IT string, Joomla falls back to English.

    Language Overrides exist so you change any of those strings without touching the extension, and without cloning items just to change a word.

    What you can override

    One tool covers the whole CMS, as long as the text is a language constant.

    Prefix What it usually is Examples
    MOD_ Modules Login, Menu, Breadcrumbs, any site or admin module
    COM_ Components Articles (COM_CONTENT_…), Contacts, Tags, Smart Search
    PLG_ Plugins System, content, user, search plugins
    TPL_ Templates Cassiopeia, Atum, commercial templates
    JLIB_, JGLOBAL_, JERROR_ Core / libraries Shared buttons, errors, pagination

    If Debug Language shows a constant, you can override it. If the text is hardcoded in PHP, JavaScript, or an article body, this tool cannot see it. Article content still uses associations. Layout HTML still uses a template or module override.

    A setting such as “filter by current language” decides which items show. It does not translate the word “Search.” Content language and UI language are different jobs.

    How Joomla prints that text

    Well-written Joomla code does not hardcode visitor-facing sentences. It holds a language constant. A .ini file maps that constant to text.

    MOD_LOGIN_FORGOT_YOUR_PASSWORD="Forgot your password?"
    COM_CONTENT_READMORE="Read more"
    

    On an Italian page, Joomla loads it-IT files, then loads language/overrides/it-IT.override.ini last. Whatever is in the override file wins. The same last-file-wins rule applies in administrator/language/overrides/ for backend strings.

    File Role
    mod_*.ini, com_*.ini, plg_*.ini, tpl_*.ini, joomla.ini Packaged translations
    *.sys.ini Installer and Extensions list
    xx-XX.override.ini Your replacements. Loaded last. Survives updates

    Site strings live under language/. Administrator strings live under administrator/language/. Mixing those two clients is the number one reason an override “does nothing.”

    You do not invent keys. You reuse the key the PHP already calls.

    🔗 Joomla User Manual: Language Overrides
    Official rule: never edit core or third-party language files. Use the Language Override component.

    What Language Overrides are not

    You need to… Use
    Change any Text::_() string on the public site Language Override, client Site
    Change administrator wording Language Override, client Administrator
    Change English tone on a single-language site Language Override for en-GB
    Show different articles per language Multilingual associations and the Language Filter plugin
    Change HTML markup Template, module, or component layout override
    Protect template PHP and CSS from updates Joomla child template
    Translate article bodies Associations or a translation workflow

    Many tutorials use “override” to mean a layout copy inside a template. Language Overrides are a different tool. Same word, different folder.

    Site overrides vs administrator overrides

    Frontend wording uses client Site. Backend wording uses client Administrator. Mixing them is why an override often appears to do nothing.

    Step 1: Open Language Overrides for the right language and client

    1. Go to System → Manage → Language Overrides. (Joomla 3 used Extensions → Languages → Overrides. Ignore those screenshots.)
    2. Choose the language you are translating into, for example Italiano (it-IT).
    3. Choose Site if the text appears on the public page. Choose Administrator if it appears only in the backend.
    4. Confirm the language pack is installed under System → Manage → Languages. You cannot override fr-FR if French is not installed.

    Create one override row per constant per language. Italian, French, and German are three passes, not one field on the extension.

    Four steps: pick language, find the constant, save the override, confirm on the translated page

    Find the constant, save the override, repeat per language, then verify on the translated URL.

    Step 2: Find the language constant

    If you already know the key from an .ini file or docs, skip to Step 3 and paste it into Language Constant.

    If you only know the English words on screen:

    1. Click New.
    2. Set Search to Value.
    3. Type the visible text, for example Forgot your password? or Read more.
    4. Click Search. Pick the result whose constant matches the extension (MOD_…, COM_…, PLG_…, TPL_…, JGLOBAL_…).
    5. Joomla fills Language Constant. You only edit Text.

    If search returns too many hits or none: enable Debug Language in Global Configuration (next section), copy the constant from the page, then turn it off.

    Do not guess a key. A truncated name saves and the page never changes.

    Enable Debug Language in Global Configuration

    Use this when Value search is messy or you cannot tell which constant belongs to which extension.

    Debug Language toggle in Global Configuration

    Turn Debug Language on in Global Configuration → System only while you copy keys. Turn it off before you leave.

    1. Go to System → Global Configuration.
    2. Open the System tab (not the Site tab).
    3. Set Debug Language to Yes.
    4. Optional: set Debug Language Constants to Constant if you want the raw key on the page, or Value if you want the translated text with debug markers.
    5. Save & Close.
    6. Open the frontend or administrator page that shows the English (or untranslated) string.
    7. Copy the constant. Missing strings often look like ??CONSTANT??. Translated strings get marker characters around the words.
    8. Return to Global Configuration → System and set Debug Language back to No. Save.

    Leave it off in production. Debug Language changes the layout, exposes keys to visitors, and is easy to forget.

    Do not confuse this with Debug System. That switch turns on the debug console. You only need Debug Language to hunt constants.

    🔗 Joomla: Debugging a Translation
    Official debug markers for missing vs translated strings.

    Step 3: Create the override

    1. Language Constant: paste the key in uppercase, exactly. No spaces.
    2. Text: type the translation. Keep any placeholders (see Step 5).
    3. Save. Repeat for the next key.
    4. Match the client to where the text appears. Frontend strings are Site. Backend strings are Administrator.

    On disk Joomla appends a line to:

    language/overrides/it-IT.override.ini
    

    or, for backend strings:

    administrator/language/overrides/it-IT.override.ini
    

    There is no overrides table in the database. Back up those files with the rest of the site. A database-only restore will not bring wording back.

    Joomla loads core strings, then the extension .ini, then xx-XX.override.ini last. That is why your override wins.

    Step 4: Repeat for every published language

    If the site ships English, Italian, French, and German, you need four override sets for each constant you care about. English overrides are useful too: they let you change tone (“Read more” to “Continue”) without editing core files.

    Switch the language filter on the Overrides list between en-GB, it-IT, fr-FR, and de-DE. Create the same keys in each. The constant stays identical. Only Text changes.

    Install the language pack first. Creating de-DE overrides without German installed does not add German to the site.

    Step 5: Keep placeholders exactly

    Some strings are templates. Joomla injects a name, a number, or a date at runtime.

    Core often uses Text::sprintf tokens:

    COM_EXAMPLE_GREETING="Hello %s"
    

    Italian can be Ciao %s. Keep %s (or %d, %1$s, %2$s) spelled exactly. Do not reorder bare %s placeholders unless you switch to numbered form (%1$s, %2$s).

    Some extensions use named tokens in braces, for example {total} or {name}. Copy those from the original English string. If you translate the token itself ({totale}), the replacement never runs and visitors see the braces.

    INI quoting: wrap the value in double quotes if you edit .override.ini by hand. A broken quote can take down every string after that line.

    Step 6: Clear cache and verify on the translated URL

    1. System → Maintenance → Clear Cache.
    2. Hard-refresh. Use a private window if a CDN or browser cache is sticky.
    3. Open the Italian (or French, German) page. Overrides follow the active language, not the language of your administrator session.
    4. If nothing changed: wrong client (Site vs Administrator), wrong language tag, typo in the constant, Debug still on, or cached HTML.

    Worked examples across Joomla

    Same screen. Different prefixes.

    Module (Login), client Site

    Search Value for Forgot your password?. Constant: MOD_LOGIN_FORGOT_YOUR_PASSWORD. Italian Text: Hai dimenticato la password?.

    Component (Articles), client Site

    Search Value for Read more. Constant under COM_CONTENT_…. Override per language. It changes wherever that constant is used.

    Plugin, client Site or Administrator

    Search the plugin message you see. Constants start with PLG_. Site plugins that print on the frontend need client Site. Plugin option labels in the backend need client Administrator.

    Template, client Site or Administrator

    Cassiopeia and Atum strings start with TPL_CASSIOPEIA_ or TPL_ATUM_. Same override form. Do not edit the template .ini inside the template package.

    Core / shared strings

    Pagination, Save, Cancel, and many errors live in JGLOBAL_…, JLIB_…, or joomla.ini. One override can change a word in several extensions at once. Search Value, then check the constant prefix before you save, so you do not retitle something you did not mean to.

    You never need a vendor-specific “language” tab for this. If the code uses Text::_(), Language Overrides already work.

    How any standard extension supports this

    An extension supports Language Overrides when it:

    1. Calls Text::_('SOME_KEY') or Text::sprintf
    2. Ships matching .ini files (mod_, com_, plg_, tpl_, or core joomla.ini)
    3. Lets Joomla load those files

    You do not enable a special “allow overrides” switch. Overrides always load last.

    If the extension hardcodes <button>Submit</button> in PHP or JavaScript, Language Overrides cannot see it. Ask the developer to move the string into Text::_(). Until then, a layout override is the only hook, and updates can wipe it.

    🔗 Joomla Programmers Documentation: Multilingual
    How extensions ship .ini files and how Text::_() resolves constants.

    Overrides versus editing language files versus content translation

    Approach Survives updates Right for
    Language Overrides Yes Any Text::_() string: modules, components, plugins, templates, core
    Edit packaged .ini files No Never, except when you are the author shipping a language pack
    Language pack from System → Manage → Languages Yes, until you need custom wording Baseline Italian, French, German for core
    Falang or similar Separate product Article and some content fields, not a substitute for Text::_() chrome
    Duplicate modules or menu items per language Painful Only when settings or layout must differ, not for translating a label

    If the author already ships it-IT files, install that pack. Then override only the strings you want to change from their translation.

    What not to do

    • Do not assume only modules can be translated this way. Components, plugins, templates, and core use the same screen.
    • Do not look for a language tab on every label. Standard Joomla chrome does not live there.
    • Do not edit packaged .ini files in language/, administrator/language/, or inside the extension folder.
    • Do not create the override under Administrator when the text is on the public site (or the reverse).
    • Do not leave Debug Language on in production.
    • Do not drop %s or {name} tokens from template strings.
    • Do not confuse “show items in the current language” with translating UI words.
    • Do not mix this up with child templates. Those protect PHP and CSS. These protect wording.

    Key takeaways

    1. Language Overrides can change any Joomla Text::_() string: MOD_, COM_, PLG_, TPL_, and core keys.
    2. Path in 2026: System → Manage → Language Overrides. Client Site or Administrator. One language at a time.
    3. Find keys with Value search or Debug Language. Paste the constant exactly.
    4. Repeat for every published language. Clear cache. Check the translated URL.
    5. You do not duplicate an extension just to change a label.
    6. Overrides write language/overrides/xx-XX.override.ini (or the administrator copy). They load last. They survive updates.

    Frequently asked questions

    Can Language Overrides change more than modules?

    Yes. Modules, components, plugins, templates, and core library strings all use the same tool. The constant prefix tells you which layer you are changing.

    How do I translate Joomla UI into Italian or French?

    Open System → Manage → Language Overrides, select that language and the right client (Site or Administrator), create an override for each constant, save, then clear cache.

    Do all Joomla extensions support Language Overrides?

    All that print text with Text::_() do. Core does. Third-party extensions that follow the same pattern do. Hardcoded English in PHP or JavaScript does not until the developer fixes it.

    Why is there no language setting on each label?

    Because Joomla already has a language system. Putting every string in every XML form would ignore the visitor’s active language and would not survive as a single place to edit.

    Where are Language Overrides in Joomla 4, 5, and 6?

    System → Manage → Language Overrides. Older tutorials still say Extensions → Languages → Overrides. That was Joomla 3.

    Why did my override not change the page?

    Wrong client (Site vs Administrator), wrong language (en-GB while you are viewing it-IT), typo in the constant, cache, or Debug Language still enabled.

    What is Debug Language?

    It is a Global Configuration switch. Go to System → Global Configuration → System, set Debug Language to Yes, save, copy the constants from the page, then set it back to No. Optional: Debug Language Constants chooses whether you see the key or the value.

    Will a Joomla or extension update delete my translations?

    Not if they live in Language Overrides. Updates overwrite packaged .ini files. They do not replace language/overrides/.

    Can I change English wording without a second language?

    Yes. Create overrides for en-GB. Same tool. Useful for tone (“Read more” to “Continue”) on a single-language site.

    Conclusion

    The missing Italian label is not a missing parameter on the module, component, or plugin. It is an untranslated language constant.

    Create Language Overrides for every language you publish. Use the real keys, whether they start with MOD_, COM_, PLG_, TPL_, or JGLOBAL_. Keep placeholders. Clear the cache. Leave packaged .ini files alone.

    One screen covers the whole site. Same files, same habit.

    Related: How to Set Up a Joomla Child Template when the change is markup, not words. For core search, Basic Search to Smart Search in Joomla 5.