Blog

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

  • Migrate K2 to Joomla Articles Before You Upgrade

    Migrate K2 to Joomla Articles Before You Upgrade

    Migrate K2 to native Joomla articles on Joomla 3.10 first. Then uninstall K2. Then upgrade 3.10 to 4.4 to 5.4, and to Joomla 6 if your extensions allow it. K2 has no supported Joomla 4, 5, or 6 release. If you upgrade first, the component does not load and the items stay trapped in #__k2_* tables. Uninstalling K2 before a copy into com_content is how magazines lose URLs, extra fields, and images.

    This is the 2026 operator path. It matches what we ship in Migrate K2 Pro and what the Joomla Community Magazine case study concluded for a 20,000 item news site: finish the content move on Joomla 3, then climb the core versions.

    Use this article for the copy and upgrade. Use Joomla custom fields for extra fields after they land in core (groups, category assignment, Automatic Display, overrides). The migrator copies values. It does not rebuild your K2 item chrome.

    K2 on Joomla 3 converts to native articles, then the site steps through Joomla 4, 5, and 6

    Do the K2 work while the site still runs Joomla 3. Native articles travel with you on every later upgrade.

    What you will learn

    • Why K2 blocks Joomla 4, 5, and 6
    • Why “uninstall K2 and hope” destroys SEO
    • How K2 entities map onto com_content, custom fields, tags, and redirects
    • How extra fields become custom fields, and where the custom fields guide takes over
    • How to run Migrate K2 Pro on Joomla 3.10
    • What to verify before you remove K2
    • The upgrade ladder after native articles exist
    • What the component does not copy (comments, attachments, author pages)

    If K2 already exploded after a rushed Joomla 5 attempt, start with the recovery notes in K2 not working in Joomla 5 or 6, then come back here and do the move on a Joomla 3 staging copy.

    Why you migrate on Joomla 3, not after the upgrade

    K2 was a full content stack: items, nested categories, extra fields, tags, galleries, attachments, and its own image store under media/k2/. Joomla core later grew custom fields, tags, and nested categories. The K2 project did not follow Joomla 4.

    So in 2026 the rule is mechanical, not philosophical.

    1. K2 PHP only runs on Joomla 3.
    2. Native articles, fields, and tags run on Joomla 4, 5, and 6.
    3. Therefore the conversion has to happen while K2 still executes.

    The JCM write-up put it in one sentence: migrate on the Joomla 3 site, then upgrade. That was true for a CLI script on 20,000 items. It is still true for a component that does the same mapping in the administrator.

    Approach What actually happens Use it?
    Upgrade first, keep K2 K2 fatal errors. Admin and site views that depend on K2 go blank. Data is still in K2 tables, but you cannot manage it. No
    Uninstall K2, then upgrade Tables may drop or linger unused. Front-end URLs 404. Extra fields and media/k2 images have no articles attached. No
    Copy to articles on Joomla 3.10, then upgrade Articles, fields, tags, images, and 301s exist in core. Later Joomla updates do not need K2. Yes

    Migrate K2 Pro is built for that third row. It is a Joomla 3.10 component. It reads K2. It writes Joomla articles. It does not rewrite K2 rows.

    🔗 Migrate K2 Pro documentation
    Installation, phases, field map, rollback, and the System Redirect plugin checklist.

    What maps, and what does not

    Treat this table as the contract. If a row is “migrated,” you should see it in core after a successful run. If a row is “export only,” plan a comment extension or a file pass before you delete K2.

    K2 Joomla core How Migrate K2 Pro handles it
    Item Article (com_content) Title, alias, intro, full text, state, featured, dates, author, meta, hits, access, language
    Category tree com_content categories Parent/child kept. Matching alias plus parent is reused, not duplicated
    Extra field group Custom field group (scoped to com_content) Published groups only
    Extra field + values Custom fields + per-article values Types mapped. media/k2 URLs inside values rewritten
    Tag com_tags Published tags and article associations
    Item image, caption, credits Intro/full article image JSON Files copied to the image base path (default images/k2-migrated)
    Item URL com_redirect 301 /component/k2/item/{id} and /component/k2/item/{alias}
    Comments No core article comments on Joomla 3 CSV, JSON, or SQL export only
    Attachments No core attachment field Export with paths; attach later if you need files
    K2 user / author page No native equivalent Authors on articles map to Joomla users. Profile pages need a new menu or a third-party directory

    K2 item, category, extra field, tag, image, and URL mapping onto Joomla articles and 301 redirects

    Copy entities into core. Do not leave SEO on K2 routers you are about to uninstall.

    Readmore handling: if K2 fulltext is empty, the component splits introtext at <hr id="system-readmore" /> the way Joomla articles already expect.

    Image credits go into Joomla’s image alt fields. Captions go into the intro/full caption fields. That is SEO-relevant. Check a sample of articles after the run.

    How Joomla custom fields replace K2 extra fields

    K2 extra fields were typed data on items: source, price, duration, a spec list. Joomla core now does that job with custom fields. Same idea. Different tables, different admin, a future on Joomla 5 and 6.

    K2 extra fields After a successful migration
    Extra field groups Content → Field Groups (editor tabs)
    Extra fields + values Content → Fields, values on the article Fields tab
    K2 item template loop Automatic Display, {field ID} in the body, or a com_fields override

    Migrate K2 Pro phase 2 creates the groups, fields, and values from published extra fields. Media URLs inside values are rewritten. Unpublished extra fields are skipped.

    It does not set Automatic Display to match your old K2 item layout. It does not put {field} shortcodes in the article HTML. It does not fix category assignment if articles landed in Uncategorised (Joomla’s “All” assignment skips that category). Those steps are the rest of the job.

    Read Joomla custom fields: the K2 extra fields replacement next, or keep it open while you verify Step 5. Order of work:

    1. This guide: backup, migrate, 301s, menus, uninstall K2, upgrade.
    2. Custom fields guide: confirm groups, assign categories, choose display, rebuild the spec layout in a child template if the magazine was more than label:value lines.

    If you never used extra fields, skip the second article until you need structured data on native articles.

    Step 1: Stay on Joomla 3.10 and take a real backup

    Work on a staging clone, not production, for the first pass.

    1. Confirm System → System Information shows Joomla 3.10.x. If you are on an older 3.x, update Joomla 3 to 3.10 first. Do not jump to 4 yet.
    2. Confirm PHP still satisfies both Joomla 3.10 and K2 (Migrate K2 Pro needs PHP 7.2 or higher).
    3. Take a full Akeeba (or host) backup: files plus database.
    4. Count K2 items, categories, tags, extra fields, comments, and attachments. You will match these numbers after the copy.

    If production is already on Joomla 4+ with a dead K2, restore a Joomla 3 backup to staging and migrate there. Then plan a content merge. Guessing SQL on a Joomla 5 database is how you duplicate aliases and break menus.

    Step 2: Audit aliases, authors, and menus

    Do this before you click Start Migration.

    • Alias clashes. If a Joomla article or category already uses the same alias as a K2 item or category, decide which one keeps the slug. Migrate K2 Pro reuses categories when alias and parent match. Articles are tracked in a mapping table so a resume does not duplicate. A leftover “News” category from core and a K2 “News” category still need a human look.
    • Deleted authors. Set Fallback User in component options to a real Super User ID if K2 created_by points at deleted accounts.
    • Trashed K2. Leave Skip Trashed on unless you truly need junk restored.
    • K2 menu items. List every K2 item, category, tag, and user menu. After migration you replace them with Article, Category Blog/List, and Tagged Items types. The JCM table is the right map: K2 “Latest Items” becomes a category blog. K2 user pages have no core twin.
    • Custom K2 SEF. If a third-party router used /blog/alias instead of /component/k2/item/alias, budget extra redirect rows. The component writes the two com_k2 patterns above. It cannot invent every historical SEF plugin path.

    Export a K2 dump from the dashboard (CSV, JSON, or SQL) even if you plan to migrate. That archive is your proof if someone uninstalls K2 too early.

    Step 3: Install Migrate K2 Pro and pass pre-flight

    Download the current ZIP (v1.2.1 as of this writing) from JoomlaX or the Joomla Extensions Directory listing.

    1. Extensions → Manage → Install, upload com_migratek2pro_vX.x.zip.
    2. Open Components → MigrateK2 Pro.
    3. Confirm the dashboard sees K2, item counts, media/k2/items, and media/k2/items/src.
    4. Options: Image Base Path (default images/k2-migrated, must be writable), Skip Trashed, Fallback User.

    Red banner “K2 not detected” means K2 is not in #__extensions or #__k2_items is missing. A partial uninstall is the usual cause. Restore K2 (or at least its tables) before you continue.

    Four steps: backup, migrate K2, enable redirects, then upgrade through Joomla 4, 5, and 6

    Order matters. Redirects and menu rebuilds happen after the copy, before you delete K2.

    Step 4: Run the four migration phases

    Create the backup warning acknowledgement, then start.

    Phases always run in this order:

    1. Categories. Nested tree. Existing alias+parent reused.
    2. Custom fields. Groups and fields from published K2 extra fields.
    3. Tags. Published tags only.
    4. Items. Batched AJAX. Each item becomes an article, gets images, tags, field values, and two 301 rows.

    Do not close the tab if you can help it. If you do, the dashboard shows “in progress.” Continue Migration resumes from the last successful batch. The mapping table is why you should not get a second copy of the same K2 id.

    Timeouts: raise max_execution_time (60 seconds or more) and memory_limit (128M or more) if a batch dies. Use the log (WARNING / ERROR) instead of guessing.

    Need to scrap a bad run? Reset & Remove Migrated Data deletes only what this component created: those articles, categories, tags, fields, field groups, and tagged redirects. K2 tables stay. Copied image files on disk stay (delete images/k2-migrated yourself if you want a clean folder). Then run again.

    Step 5: Verify before you touch K2

    Do not uninstall anything until this list is boring.

    1. Content → Articles. Counts match K2 items (minus trash if skipped). Open ten random items: intro, full text, images, featured flag, publish dates.
    2. Content → Categories. Tree matches K2. Descriptions and access levels.
    3. Content → Fields and Field Groups. Extra field values on the article Fields tab. Then follow custom fields after migration for Automatic Display and Uncategorised assignment.
    4. Components → Tags. Associations on articles.
    5. Components → Redirects. Comment contains MigrateK2 Pro. Sample an ID URL and an alias URL.
    6. Migration Log. No unresolved ERROR rows. Image-not-found warnings mean those files were already missing in media/k2.

    Old K2 item URL permanently redirected to the new Joomla article URL

    301s only work if System Redirect is enabled. Creating the rows is not enough.

    Step 6: Turn on redirects and rebuild menus

    1. Extensions → Plugins → System – Redirect: enable it.
    2. In Global Configuration, confirm URL rewriting and your .htaccess still match how the site ran under K2.
    3. Recreate menus:
    Old K2 menu type New Joomla menu type
    Item Articles → Single Article
    Categories Articles → Category List
    Latest Items Articles → Category Blog
    Tag Tags → Tagged Items
    Item form Articles → Create Article
    User / author page No core type. Plan a Contacts or custom page
    1. Point category blogs at the migrated categories, not leftover empty core categories.
    2. Hit a handful of indexed K2 URLs in an incognito window. You want 301 then 200 on the article, not 404.

    SEF plugins that rewrote K2 beyond com_k2 still need manual redirect rows. Add them now, while you can still open a K2 item and copy the public URL.

    Step 7: Uninstall K2 only after the site no longer needs it

    When articles render, menus work, and 301s fire:

    1. Keep the CSV/JSON/SQL export off-site.
    2. Uninstall K2 and K2-only modules, plugins, and templates that call K2 helpers.
    3. Search the template for com_k2 overrides under templates/{name}/html/com_k2. Those files do nothing for com_content. Extra field loops in those files must become custom field display or a com_fields override. Use a Joomla child template so the next core update does not eat the layout. The custom fields guide covers Automatic Display vs override.
    4. Uninstall Migrate K2 Pro when you are done. Uninstalling the migrator does not delete the articles. Run Reset first only if you intended to throw the copy away.

    Step 8: Upgrade Joomla 3.10 to 4.4 to 5.4 (then 6)

    Native articles ride the core updater. K2 does not. The ladder in 2026 is still:

    Joomla 3.10 → 4.4.x → 5.4.x → 6.x (6 only if every remaining extension is compatible).

    There is no supported jump from 3 to 5 or 3 to 6. Use the Pre-Update Check at each hop. PHP must move with the target (Joomla 5 and 6 want current PHP 8.x). Details: Joomla 3 to Joomla 4 upgrade and Joomla 5 upgrade.

    Do this on staging first. After 4.4, confirm custom fields, tags, redirects, and article images. Then 5.4. Then 6 if the Pre-Update Check is clean.

    Joomla 5.4 is the long-support line if a shop extension is not ready for 6. Joomla 6 is the current major if everything on the Pre-Update list agrees.

    When a component is not enough

    Migrate K2 Pro is the admin path for sites that can sit in the browser while AJAX batches run. The JCM project used a CLI script for 20,000 items plus a custom K2 plugin. That is the right call when:

    • You have tens of thousands of items and a low max_execution_time you cannot raise
    • A custom K2 plugin stored extra rows that are not extra fields
    • You need a one-off field map ($cfMapping) that is not in the component

    We still start those projects with the same entity table and the same “Joomla 3 first” rule. If you want that done as a service, use Joomla K2 migration services.

    Key takeaways

    1. K2 does not run on Joomla 4, 5, or 6. Native com_content does.
    2. Convert on Joomla 3.10 while K2 still loads. Then uninstall K2. Then upgrade.
    3. Uninstalling K2 without a copy is how you lose extra fields, media/k2 images, and rankings.
    4. Migrate K2 Pro maps items, categories, extra fields, tags, images, and two 301 patterns per item. It never writes back into K2 tables.
    5. Extra fields become custom fields. Display and layout are a second pass: Joomla custom fields.
    6. Enable System – Redirect or the 301 rows do nothing.
    7. Comments and attachments are export-only. Author pages have no core menu type.
    8. After the copy, rebuild menus onto article and category types, then climb 3.10 → 4.4 → 5.4 → 6.

    Frequently asked questions

    Can I migrate K2 after I am already on Joomla 5?

    Not with K2 running. K2 has no Joomla 5 release. Restore or clone a Joomla 3.10 copy that still has K2, migrate there, then bring native articles forward. If you only have a Joomla 5 database with leftover #__k2_* tables, you need a specialist extract, not the administrator component.

    Does Migrate K2 Pro delete my K2 data?

    No. It only reads K2 tables. Reset removes the Joomla articles, categories, tags, fields, and redirects it created. K2 stays until you uninstall it yourself.

    Will my old K2 URLs keep ranking?

    They can, if 301s exist and System Redirect is on. The component writes /component/k2/item/{id} and /component/k2/item/{alias}. Custom SEF layouts need extra rows. Rebuild equivalent article and category menu items so canonical URLs are clean going forward.

    Are extra fields included?

    Yes, for published K2 extra fields and their values. They become Joomla custom fields on com_content. Unpublished extra fields are skipped. Media paths inside values are rewritten to the new image folder. For groups, category assignment, Automatic Display, and overrides, use the custom fields replacement guide.

    Do comments and attachments become Joomla comments and article files?

    No. Export them. Joomla 3 has no core article comments. Attachments are files plus metadata. Import into a comment extension or a file field after you know the new article IDs.

    How long does a migration take?

    Small sites (hundreds of items) often finish in under a minute. Tens of thousands of items take minutes in the component, or hours in CLI on a large news archive. Batch size and server PHP limits dominate, not the mapping itself.

    Should I go to Joomla 5.4 or Joomla 6 after K2 is gone?

    Go to 4.4 first, always. Then 5.4. Choose 6 only when the Pre-Update Check and every remaining extension are ready. 5.4 is the safer landing if a cart or CCK is lagging.

    Conclusion

    K2 is not “almost Joomla 5.” It is a Joomla 3 content engine. The durable fix is native articles, created before you climb versions.

    Install Migrate K2 Pro on Joomla 3.10, run the four phases, prove redirects, replace K2 menus, uninstall K2, then upgrade. Read the full documentation for logs, reset, and export formats. Then open Joomla custom fields and finish how extra field data actually shows.

    If the site is large, customized, or already half-upgraded, ask Infyways to run the migration. The sequence does not change. The staging and field map just get done for you.

  • How to Set Up a Joomla Child Template

    How to Set Up a Joomla Child Template

    To set up a Joomla child template, open System → Site Templates, open an inheritable parent such as Cassiopeia, click Create Child Template, add only the files you will change, then assign the new style. You need Joomla 4.1 or later (5 and 6 included). Joomla 3 and 4.0 have no Create Child Template button.

    Do this before you edit Cassiopeia. A child keeps your CSS, layout overrides, and extra positions when the parent updates. A template style duplicate does not.

    This is a setup guide. You will create the child, put user.css in the right folder, add an override, assign it to a menu item, and know when to copy index.php.

    Parent Cassiopeia layout connected to two child layouts

    The parent stays stock. Each child keeps only the files you change.

    What you will set up

    • A child of Cassiopeia (or another inheritable template)
    • user.css that actually loads
    • Optional HTML overrides and extra module positions
    • A template style assigned as default or per menu item
    • The Joomla 6 path if you already have Cassiopeia Extended
    • How to make your own (or a fork you control) support children

    The problem a child template solves

    Most Joomla sites get slow to update for a boring reason: someone edited the parent template.

    You change index.php or drop a user.css inside Cassiopeia. It looks fine. Then Joomla (or the club) ships a template update. Core files go back to stock. Your header colour, extra module position, and article override are gone. Restore from backup, or skip the update and sit on an unpatched template.

    The usual workaround is worse. Duplicate the whole template, rename it “Cassiopeia custom,” and never touch the original again. You now maintain hundreds of files you did not write. The next Cassiopeia security fix never reaches that copy.

    A template style does not fix this. Styles store parameters and menu assignment. They still point at the same parent files. Duplicate the style, change the logo, and you are fine. Edit PHP or CSS in the parent, and the next update still wipes it.

    That is the problem. Custom look, stock parent, files that survive updates. Child templates are the core feature built for that, from Joomla 4.1 onward.

    Why you set up a child instead of editing the parent

    A template style only stores parameters and menu assignment. It still uses the parent’s files. Edit templates/cassiopeia/index.php and the next Joomla update puts the stock file back.

    A child template is a second template. Same-named files in the child win. Everything else loads from the parent. Updates replace the parent. Your child folder stays.

    Set up a child as soon as you need custom CSS, a layout override, extra positions, or a second look (home vs knowledge base vs portal). If you only need a different logo colour and no PHP, a style on the same template can be enough. The moment you touch a file Joomla will overwrite, create the child first.

    Assigning styles to pages is covered here: How to Change Template in Joomla 4.

    Template style holds parameters only. Child template holds files you keep.

    A style stores params. A child stores files. You usually need both: create the child, then assign its style.

    Benefits of a Joomla child template

    Here is why this is worth the extra click.

    • Updates stop wiping your work. Joomla can patch Cassiopeia (or your club parent). Your user.css, overrides, and extra positions stay in the child folder.
    • You keep a stock parent. Security and accessibility fixes in the core template actually get installed. You are not sitting on a frozen fork named “Cassiopeia copy 3.”
    • The child stays small. You duplicate one file, not the whole template. Less to maintain, easier to see what you changed.
    • Several looks, one parent. Homepage, knowledge base, and logged-in portal can each have a child. Same Cassiopeia under them, different CSS or index.php.
    • Overrides stop fighting the vendor. If the parent already ships html/com_content/article/default.php, you override it in the child. A parent update refreshes their copy. Yours stays.
    • The administrator can match the brand. Atum is inheritable. A child of Atum can add a client logo or hide clutter without forking the backend template.
    • You can still use styles. Logo, colour params, and menu assignment stay on the style. The child protects files. Together they cover look and safety.

    A child is not a speed plugin and not a page builder. It does not replace PHP 8, a CDN, or image work. It replaces the habit of editing files Joomla will overwrite.

    Before you click Create Child Template

    1. Version. System → System Information. You need 4.1.0 or newer. Joomla 5.4 and 6.1 both work.
    2. Backup. A child is safe. Deleting the parent later is not.
    3. Parent must be inheritable. Open the parent’s templateDetails.xml and confirm <inheritable>1</inheritable>. Cassiopeia (site) and Atum (admin) have it. Many older commercial templates do not. If the button is missing, this is why.
    4. Work from Templates, not Template Styles. Styles assign. Templates create children.

    On Joomla 3, stop here. There is no native child. Migrate first: Joomla 3 to Joomla 6 Upgrade.

    🔗 Joomla User Manual: Child Templates
    Official clicks: create the child, add user.css, assign a menu item.

    Four setup steps: create the child, add CSS, add an override, assign the style

    Do these in order: create, CSS, override (if needed), assign. Creating the child does not change the public site until you assign the style.

    Step 1: Create the child from the parent

    1. Go to System → Templates → Site Templates.
    2. Open Cassiopeia Details and Files (or your inheritable parent).
    3. Click Create Child Template.
    4. Type a short name, for example brand or portal. Joomla prefixes the parent. You get cassiopeia_brand.
    5. Create, then Close the parent.
    6. Open cassiopeia_brand Details and Files.

    You should see a folder tree and almost only templateDetails.xml. That emptiness is correct. Do not copy the whole parent in.

    Joomla 6.1 extra: if you already use Cassiopeia Extended and want a second variant, open that child and use Copy Child Template instead of creating from Cassiopeia again. Then check that /templates/your_child and /media/templates/site/your_child use the same element name. If the editor says the directory is not writable, the media folder name is usually wrong. Rename it to match, or recreate the child on the current 6.1 patch.

    Administrator child: same flow under System → Administrator Templates, parent Atum. Assign that style afterward if you want a branded backend.

    Step 2: Know where your files must live

    Put files in the child, not in Cassiopeia.

    Child template files split between the templates folder and the media folder

    PHP, XML, and html/ overrides live under templates/your_child/. CSS, JS, and images live under media/templates/site/your_child/. The Template Editor css folder is the media folder.

    What you are changing Put it here (example child cassiopeia_brand)
    Manifest, extra positions templates/cassiopeia_brand/templateDetails.xml
    index.php, error.php templates/cassiopeia_brand/ only if you copy them
    Component and module overrides templates/cassiopeia_brand/html/…
    CSS, JS, images, scss media/templates/site/cassiopeia_brand/

    The Template Editor’s css folder is the media CSS folder. It is not templates/cassiopeia/css/ on Joomla 4.1, 5, or 6. If user.css sits in the old 4.0 path, the site ignores it.

    Leave the parent XML as inheritable. The child XML should look like this (simplified):

    <inheritable>0</inheritable>
    <parent>cassiopeia</parent>
    

    If you zip the child for another site, change the template name and the media destination together.

    Step 3: Add user.css (do this on almost every site)

    Cassiopeia loads user.css last when the file exists in the child.

    1. In the child, click New File.
    2. Select the css folder.
    3. Filename: user with no .css in the name field. File type: .css.
    4. Create, then paste your rules. Save.

    Starter example:

    .container-header {
      background-color: darkgreen;
      background-image: none;
    }
    
    h1, h2, h3 {
      color: darkgreen;
    }
    

    Clear Joomla cache and the browser cache, then view a page that uses this child’s style. If nothing changes, you assigned the wrong style, or the CSS file is not in the child’s media folder.

    On Joomla 6 with Cassiopeia Extended assigned: use Colour Settings and Font Settings on the style first. Those write CSS variables such as --headerbg and --link-color. Add user.css only for rules the params cannot do. You can still use those variables inside user.css.

    🔗 Cassiopeia Extended colour and font options
    How the core Joomla 6 child adds params without you forking Cassiopeia.

    Step 4: Add a layout override in the child

    Do not edit overrides inside Cassiopeia. Create them in the child.

    1. Open the child Details and Files.
    2. Open the Create Overrides tab.
    3. Pick the component or module, for example com_content → article.
    4. Joomla copies the layout into the child’s html/ folder.
    5. Edit that file. Save.

    Typical path: templates/cassiopeia_brand/html/com_content/article/default.php.

    If the parent already ships an override, still create yours in the child. A parent update can replace the parent’s html/ files. It will not replace the child’s.

    Step 5: Copy index.php only when chrome must change

    Skip this step if CSS and overrides are enough.

    Copy index.php into the child when you need extra module positions, a different grid, or extra Web Assets. Prefer requiring the parent instead of pasting a full fork.

    Cassiopeia Extended does this: it loads Cassiopeia’s index.php, then registers extra CSS. The idea in the child is:

    defined('_JEXEC') or die;
    
    require JPATH_THEMES . '/cassiopeia/index.php';
    
    $wa = $this->getWebAssetManager();
    // register extra styles or scripts here
    

    Need custom JavaScript? Put a JS file in the child’s media js folder and register it, or follow How to Add Custom JavaScript to Joomla. Do not drop a raw <script> into a copied index.php unless you have no other hook.

    Step 6: Add a module position (only if the layout needs it)

    1. Edit the child’s templateDetails.xml.
    2. Add a <position>brand-hero</position> (use your name).
    3. If index.php is not in the child yet, copy it, then add:
    <jdoc:include type="modules" name="brand-hero" style="html5" />
    
    1. Save both files.
    2. In Content → Site Modules, the new position should appear.

    XML without the jdoc:include lists the position in the manager and never prints it on the page. Do not remove parent positions that modules still use. You will get an empty region and no error.

    Step 7: Assign the child on the front end

    Creating the child does not change the public site.

    1. Go to System → Templates → Site Template Styles.
    2. Open the style for the child (often cassiopeia_brand - Default).
    3. Rename it to a human label, for example Cassiopeia Brand.
    4. Either set it as default, or open Menu Assignment and tick the items that should use it.
    5. Save. Open those URLs logged out.

    Home can stay on Cassiopeia. A landing page can use the child. Same assignment model as any other template.

    Step 8: Check the result and cache

    1. View source or the Network panel and confirm user.css loads from /media/templates/site/cassiopeia_brand/css/ (your child name).
    2. Confirm the override markup on an article if you added one.
    3. System → Maintenance → Clear Cache, then a hard refresh.
    4. Update Joomla on staging and confirm the child files are still yours.

    If CSS never loads, the file is in the parent, the style is wrong, or a CDN is serving an old sheet. Child templates do not replace hosting and image work. For that stack use How to Speed Up a Joomla Website in 2026.

    Which setup to use

    You need to… Set up
    Colour, font, spacing Child user.css, or Joomla 6 colour/font params
    Different article or module HTML Child html/ override (Create Overrides)
    Extra positions or extra assets Child index.php that requires the parent when possible
    Logo or brand colour per menu item, no PHP Template style on the same template
    Second full look that survives updates Second child, then assign styles
    Branded administrator Child of Atum, then assign the admin style

    What not to do while setting up

    • Do not edit Cassiopeia or Atum “just this once.” Create the child first.
    • Do not copy every parent file into the child. That is a fork. You will skip updates.
    • Do not uninstall the parent while children exist.
    • Do not assume a commercial template is inheritable. Check <inheritable>1</inheritable>.
    • Do not put user.css under templates/cassiopeia/css/ on 4.1+.
    • Do not treat Cassiopeia Extended as a parent to hack. It is already a child. Copy it on 6.1, or create a new child of Cassiopeia.

    Building a new inheritable parent is a different job. The Joomla template generator scaffolds that XML flag. It does not convert an old Helix or Protostar fork by itself, and it does not replace Create Child Template.

    Make any template support child templates

    Any Joomla 4.1+ template can support child templates if the parent opts in. Cassiopeia and Atum already do. A club template does not, until its templateDetails.xml says so and its CSS, JS, and images live under media/.

    This is a parent-template change. You need the source (your template, or a fork you are allowed to change). You cannot turn Helix into an inheritable parent by creating a child of Cassiopeia.

    Work on a copy. Package it as a template update. Test on staging.

    🔗 Child templates are opt-in (dGrammatiko)
    The feature author: inheritable XML, media folder, and the PHP path mistakes that break children.

    1. Confirm the button is really missing

    Open System → Site Templates, then the parent Details and Files. If Create Child Template is there, stop. The parent already supports children. Go to Step 1 of this article.

    If the button is missing, open templateDetails.xml. No <inheritable>1</inheritable> means this parent cannot have children yet.

    2. Mark the parent as inheritable

    In the parent’s templateDetails.xml add (or set):

    <inheritable>1</inheritable>
    

    Leave it off the child. Children use:

    <inheritable>0</inheritable>
    <parent>yourtemplate</parent>
    

    yourtemplate must match the parent’s folder name, for example cassiopeia or acme.

    3. Move CSS, JS, and images into media

    Child templates expect static assets in Joomla’s media tree, not only inside templates/yourtemplate/css/.

    In the install package, put css, js, images, and scss under a media/ folder, then declare:

    <media destination="templates/site/yourtemplate" folder="media">
      <folder>css</folder>
      <folder>js</folder>
      <folder>images</folder>
      <folder>scss</folder>
    </media>
    

    After install, files land at media/templates/site/yourtemplate/. For an administrator template, use templates/administrator/yourtemplate as the destination.

    Keep PHP chrome (index.php, error.php, html/) in templates/yourtemplate/. That split is the same as Cassiopeia.

    4. Stop building URLs with $this->template

    A child has a different folder name. If the parent does this, the child’s CSS and logos miss:

    $path = $this->baseurl . '/templates/' . $this->template . '/images/logo.svg';
    

    Point at the parent media path, or register files in joomla.asset.json / the Web Asset Manager:

    $path = 'media/templates/site/yourtemplate/images/logo.svg';
    

    PHP includes have the same trap. Include the parent file, not a path that uses $this->template:

    include JPATH_THEMES . '/yourtemplate/base.php';
    

    If you skip this step, Create Child Template may appear and the site still looks unstyled.

    5. Reinstall or update so the database matches

    Saving XML in the Template Editor is not always enough. Joomla also stores inheritability on the template style row.

    Install the updated package (or copy files, then reinstall with method="upgrade"). After that, Create Child Template should show on the parent.

    If the XML looks right and the button is still missing, the #__template_styles row for that template may still have inheritable set to 0. Fix it on staging, then reload the Template Manager. Do not guess at production SQL.

    6. Create the child the normal way

    Use Step 1 in this article on the new parent. Custom CSS goes in the child’s media css folder. Cassiopeia auto-loads user.css. Your template might not. If it does not, register that file in the parent (or in a thin child index.php that requires the parent) so the child sheet actually prints.

    Club templates you cannot fork: ask the vendor for a 4.1+ inheritable build, or keep their documented custom-CSS field. Do not paste <inheritable>1</inheritable> onto a live Helix package that still stores CSS under templates/.

    🔗 templateDetails.xml (Joomla Programmers Documentation)
    Official inheritable and media elements for a parent template.

    🔗 JCM deep dive on child files and positions
    Media destinations, extra positions, and child vs override.

    Key takeaways

    • Create the child from Site Templates, add only what you change, assign it under Template Styles.
    • Benefits: updates do not wipe custom CSS and overrides, the parent stays stock, you can run several looks, and Atum can have a child too.
    • You need Joomla 4.1+. Cassiopeia and Atum are inheritable. Joomla 6 ships Cassiopeia Extended as a ready child.
    • user.css belongs in the child’s media CSS folder.
    • Overrides belong in the child’s html/ folder, created from Create Overrides.
    • Copy index.php only for chrome and positions. Prefer requiring the parent.
    • Styles assign. Children protect files. You usually set up both.
    • Any template can be a parent if it ships <inheritable>1</inheritable>, assets under media/templates/…, and paths that do not depend on $this->template.

    Frequently asked questions

    How do I create a Joomla child template?

    Open System → Site Templates, open Cassiopeia (or another inheritable parent), click Create Child Template, name it, then close. Open the new template, add files, then assign its style under Site Template Styles.

    What problem do Joomla child templates solve?

    Edits inside Cassiopeia (or any parent) disappear when that template updates. Duplicating the whole template avoids the wipe but blocks future parent fixes. A child keeps only your files, so the parent can still update.

    Why use a Joomla child template?

    So Joomla can update the parent while your CSS, layout overrides, and extra positions stay in a separate folder. You also get more than one look from the same parent, and you can brand Atum the same way.

    Which Joomla version do I need?

    Joomla 4.1.0 or later, including Joomla 5 and 6. Joomla 3 and Joomla 4.0 have no Create Child Template button in core.

    Why is the Create Child Template button missing?

    You are below 4.1, or the template is not inheritable. Open templateDetails.xml and look for <inheritable>1</inheritable>.

    Where do I put user.css?

    In the child, New File → css folder → filename user → type .css. On disk: media/templates/site/your_child/css/user.css.

    Is a child template the same as a template style?

    No. Create the child under Templates. Assign it under Template Styles (default or Menu Assignment). You need both for the public site to change.

    Do I have to copy index.php?

    No. Most setups only need user.css and maybe one override. Copy index.php when you add positions or change page chrome. On Joomla 6, try Cassiopeia Extended’s colour and font tabs first.

    Can I set up a child of the administrator template?

    Yes. System → Administrator Templates → Atum → Create Child Template, then assign the admin style.

    What if my commercial template has no child button?

    It is probably not inheritable. Use the vendor’s custom CSS feature, ask them for a 4.1+ inheritable build, or switch to an inheritable parent. Do not only add <inheritable>1</inheritable> if CSS still lives under templates/.

    How do I make my own template support child templates?

    On the parent: set <inheritable>1</inheritable>, move CSS, JS, and images into media/ with a <media destination="templates/site/yourtemplate"> block, stop building URLs with $this->template, then reinstall so the style row updates. After the Create Child Template button appears, create the child as usual.

    Conclusion

    Setup is the whole point. Create the child, put user.css in the media CSS folder, add overrides in the child’s html/ folder, assign the style, leave the parent stock.

    Do it on staging today. One menu item is enough to prove it. Then stop editing Cassiopeia.

    If the parent is a custom Joomla 3 fork with no inheritable flag, Infyways Joomla design and Joomla upgrade set this up as a cutover: stock parent, thin child, files you can still explain in six months.

  • Joomla Helpdesk vs osTicket: Native Support Tickets

    Joomla Helpdesk vs osTicket: Native Support Tickets

    Most people who want a Joomla helpdesk install osTicket next to Joomla and call it done. That is the mistake.

    A Joomla helpdesk is a support ticket system that runs inside Joomla. Customers open and track tickets on your domain, with your users and ACL. osTicket is good software, and it is still a second PHP app. If you want an osTicket alternative for Joomla, that split is the whole decision.

    Diagram of a native Joomla helpdesk inside one site versus osTicket as a second app

    A native Joomla helpdesk lives in the same site as your customers. osTicket sits beside it as another application.

    I built Easy Helpdesk at Infyways after watching buyers log into Joomla, then get sent to another hostname to attach a screenshot. You do not need another case study. You have lived that ticket.

    As of August 2026, Easy Helpdesk 1.0.31 is built for Joomla 5 and Joomla 6. It is on the JED and documented on JoomlaX.

    What you will learn

    • Why “osTicket plus Joomla” is not a Joomla helpdesk
    • How a real Joomla support ticket should use your existing logins
    • When osTicket is still the smarter call
    • How to choose without reading a feature brochure

    Why people install osTicket instead of a Joomla helpdesk

    They need support tickets. They type Joomla helpdesk or Joomla support ticket into Google.

    Then they install the first famous name they know.

    osTicket shows up because it is free, old, and everywhere. Custom forms. Filters. SLA plans. A client portal. A knowledge base. All of that is real. Check the osTicket feature list if you want the source.

    But wait.

    osTicket is a separate PHP app with its own database and its own staff logins. Joomla already has PHP, MySQL, users, ACL, and a template.

    So you now patch two stacks, brand two portals, and give the customer two “accounts.” That is the cost. Not the osTicket license. The community edition is free.

    If you already run Joomla support and maintenance as a long-term site, a second helpdesk stack is extra work you will still be paying for in two years.

    What a Joomla helpdesk actually is

    A Joomla helpdesk installs as a Joomla package. Your visitor opens a support ticket in Joomla, tracks it on your domain, and an agent works the queue from a Joomla menu, not from a foreign admin skin on another subdomain.

    If the desk does not use Joomla users, Joomla menus, and Joomla updates, it is not a Joomla ticketing system. It is a neighbour.

    Infographic of a native Joomla helpdesk as one stack versus osTicket beside Joomla as two stacks

    One stack means one login story. Two stacks means you patch Joomla and osTicket as separate products.

    Easy Helpdesk is the native example I ship: portal, staff console, mail intake, SLA, knowledge base, reports. I am not going to paste the spec sheet here. You can open the JED or JoomlaX page if you want every toggle.

    This is the same native-vs-bolted-on choice we keep making across the Joomla stack in 2026. Keep the product on the CMS when the CMS is the business.

    Why this matters for your support tickets

    Joomla is already the product. Support is part of that product.

    When you bolt osTicket on the side, you teach customers that help is “over there.” They already have a Joomla login. They will not create another one for a screenshot.

    Here’s why this matters.

    A native Joomla support ticket reuses the session they have. Guests can still open a ticket without an account if you allow it, then come back by email link or ticket number. Agents can work the queue on the frontend so they are not living in /administrator all day.

    osTicket can look fine. It still does not become Joomla unless you pay for glue you will own forever. Teams that already do custom Joomla development feel that glue as soon as ACL and membership collide.

    5 checks before you pick an osTicket alternative for Joomla

    Illustrated checklist of five questions to choose a Joomla helpdesk or osTicket

    Use this as a buying filter. Not a slogan.

    1. Where does the ticket live?
    On your Joomla domain, or on support.somethingelse?

    2. Who owns the user?
    Joomla groups and ACL, or a second staff table?

    3. How does email arrive?
    Inside the same site’s scheduled tasks, or a mailbox only the other app understands?

    4. Can agents work without the Joomla admin?
    If the answer is no, your helpdesk will become a bottleneck.

    5. Do you need one desk for every CMS?
    If yes, stop. osTicket (or another standalone) is the honest fit.

    If no, you want a native Joomla helpdesk.

    Joomla helpdesk vs osTicket (the only table you need)

    Question Native Joomla helpdesk osTicket
    What did you install? A Joomla package A second PHP app
    Where does the customer sit? Your site osTicket’s portal
    Logins Joomla users osTicket users
    Knowledge base Can sit in the Joomla workflow Separate KB
    Best for Support tickets on one Joomla site One queue for many platforms

    Bottom line: stay native if Joomla is the business. Stay on osTicket if the business is bigger than Joomla.

    When you should still use osTicket

    Do not force the alternative.

    Use osTicket if you already trained a global team on it.

    Use osTicket if WordPress, Shopify, and Joomla must share one queue.

    Use osTicket if you want a free, CMS-agnostic core and you will treat hosting and upgrades as a second product.

    Do not pick osTicket because it “sounds more enterprise.” A native Joomla desk can still do departments, SLA, canned replies, private notes, and ratings. The architecture is the differentiator. Not a vibe.

    The money question, without the pitch

    osTicket’s code is free.

    A native Joomla helpdesk is usually a paid extension because someone has to keep it on Joomla 5 and 6.

    You still pay for osTicket. You pay in extra server, extra logins, and tickets that never get filed.

    That is the trade. Pick it with your eyes open.

    Key takeaways

    1. A Joomla helpdesk runs on Joomla. osTicket runs beside it.
    2. Joomla support tickets should use your domain, your users, and your updates.
    3. Easy Helpdesk 1.0.31 (August 2026) is one osTicket alternative for Joomla 5 and 6. It is not the only possible native desk. It is the one built for this exact gap.
    4. Multi-CMS support still belongs on a standalone tool.
    5. Choose the architecture first. Then choose the product.

    Frequently asked questions

    Is Easy Helpdesk an osTicket alternative for Joomla?

    Yes, if your support is Joomla-only. You get queues, email, SLA, and a knowledge base without a second user database. No, if one desk must cover several platforms.

    What is the difference between a Joomla helpdesk and osTicket?

    A Joomla helpdesk is an extension. osTicket is its own application. Same job on paper. Different home in production.

    How should a Joomla support ticket work for the customer?

    They submit on your site. They track it on your site. They do not create a second password unless you force that on purpose.

    Can I just embed osTicket in Joomla?

    You can iframe almost anything. You still have two apps to patch, two UIs to brand, and two identity models. That is a workaround, not a Joomla ticketing system.

    Do I need Joomla administrator access to answer tickets?

    You should not. Daily work belongs on a frontend staff queue. Admin is for setup and reports.

    Is there a free osTicket alternative for Joomla?

    osTicket is free, and it is not a Joomla extension. Native Joomla helpdesks are usually paid. You are buying the integration, not a slogan.

    Conclusion

    You have two honest options.

    Run a Joomla helpdesk so a support ticket in Joomla stays on the site you already maintain.

    Or run osTicket because you need a desk that does not care which CMS is in front.

    Do not mix those goals and hope the customer will not notice.

    If native is the call, look at how Easy Helpdesk is put together on JoomlaX and the JED listing. Then decide. Now it is your turn: pick the architecture this week, before you install another stack you did not need.

  • The Future of Joomla in 2026: Why It Still Deserves Attention

    The Future of Joomla in 2026: Why It Still Deserves Attention

    Joomla still has a future in 2026 if you need a native multilingual, ACL-heavy, or custom CMS, not a blog starter. The project is 21 years old. Joomla 6.1.3 is the current 6.x line. Joomla 5.4.8 is still supported. Market share is small next to WordPress. The architecture is not.

    A friend still asks the same two questions I hear every year: do people still use Joomla, and why would anyone pick it when WordPress and Shopify dominate? Those questions are fair. The 2025 answers are not. This is the 2026 version.

    I have built on Joomla since the Mambo days. At Infyways we still ship Joomla work and extensions. If the CMS had no future, we would have stopped. We have not.

    What you will learn

    • Where Joomla stands in 2026: versions, support dates, and market share
    • Why people still choose Joomla over WordPress for complex sites
    • What Joomla 6 actually changed after the 14 October 2025 launch
    • Who should pick Joomla now, and who should not

    Joomla in 2026: the facts, not the nostalgia

    Joomla logo and long-running CMS history

    Joomla launched from the 17 August 2005 Mambo fork. It turned 21 on 17 August 2026. That history is in our separate piece on Joomla at 21. This article is about whether the CMS still deserves a new build this year.

    According to W3Techs, Joomla powers about 1.2% of all websites and roughly 1.7% of sites with a known CMS. WordPress is in a different league on those charts. Popularity is not the same as fit.

    Signal (August 2026) What it means
    Current 6.x Joomla 6.1.3 (series started 14 October 2025)
    Current 5.x Joomla 5.4.8, bugfix only
    5.x regular support ends 13 October 2026
    5.x security-only ends 12 October 2027
    6.x regular support ends 17 October 2028
    6.x security-only ends 16 October 2029
    Next minor on the calendar Joomla 6.2.0 aimed at 13 October 2026

    Those dates come from the official Joomla roadmap (updated 18 August 2026). If you are still on 5.x, the clock to move toward 6.x is real. If you are on 6.1.3, you have a supported major line into the late 2020s.

    Why people still use Joomla

    Not because it wins the blog market. Because a few core jobs are still easier in Joomla than in a plugin pile.

    Native multilingual

    Joomla still ships multilingual in core. If you run a government, university, or multi-country site, that is not a nice extra. It is the product.

    ACL and structured content

    Granular permissions, Custom Fields, and template overrides let you build portals and membership systems without bolting on half a store of plugins. That is why agencies still recommend Joomla for permission-heavy builds.

    Security that lives in core

    Joomla is not magic. You still patch. The difference is how much you outsource to third-party plugins. We cover that trade in Joomla security in 2026. Core updates and a smaller essential-plugin surface still matter.

    No corporate owner

    Joomla is still community-run. There is no single vendor who can flip the license. For public-sector and long-lived intranet work, that governance is a feature.

    What is new in Joomla 6

    Stop treating Joomla 5.0 (October 2023) as the news. That was two major lines ago.

    On 14 October 2025 the project shipped Joomla 6.0 and Joomla 5.4 together. 5.4 is the bridge. 6.x is the current major line, with automatic core updates and a Backward Compatibility 6 plugin so upgrades are less of a cliff.

    Joomla 6.1 (April 2026) added items such as POW-captcha, a graphical workflow editor, and new media custom fields for audio, video, and documents. 6.1.3 landed on 18 August 2026. 6.2 is scheduled for 13 October 2026.

    If your mental model of Joomla is still “hard upgrades and a dusty admin,” you are describing 3.x to 4.x scars, not the 5.4 to 6.x path.

    Who should choose Joomla in 2026

    Choose Joomla when Choose something else when
    You need native multilingual and deep ACL You need the fastest possible brochure blog
    The site is a portal, membership, or public-sector system The whole business is a Shopify-style storefront
    Developers will own the template and components You only want a page builder and a theme shop
    You can stay on supported 6.x (or finish a 5.x to 6 plan) The site is abandoned on Joomla 3 with no budget to upgrade

    WordPress and Shopify are the right tools for a lot of work. Joomla is the right tool when the CMS has to behave like an application, not a newsletter.

    If you need that kind of build, see our Joomla development and Joomla support and maintenance work. For content that has to show up in AI answers, pair the CMS with GEO for Joomla.

    Bright or bleak: Joomla’s next years

    Illustration of global communication around the future of Joomla
    Joomla’s next decade depends on upgrades and developers, not market-share charts.

    Bleak if you only watch share of all websites. Bright if you watch whether 6.x is maintainable. Automatic core updates and a dated support window through 2028 and 2029 are the confidence signal the last decade was missing.

    What still has to improve is the same list as before, just more urgent: easier onboarding, healthier extension businesses, and clearer marketing for the project types Joomla actually wins. The community does not need to become WordPress. It needs more developers who stay.

    Key takeaways

    1. Joomla in 2026 is Joomla 6.1.3, with 5.4.8 still on a closing support clock.
    2. Small market share does not cancel native multilingual, ACL, and core security posture.
    3. Joomla 5.4 to 6.x is a different upgrade story than the painful 3 to 4 years.
    4. Pick Joomla for complex, multilingual, permission-heavy sites. Pick WordPress or Shopify when those products fit better.
    5. The future is real for teams that will stay on supported 6.x and keep investing in extensions.

    Frequently asked questions

    Does Joomla have a future in 2026?

    Yes, as a specialist CMS for multilingual, ACL-heavy, and custom sites. It will not overtake WordPress on raw market share. It does not need to.

    What is the current Joomla version in 2026?

    Joomla 6.1.3 on the 6.x line, and Joomla 5.4.8 if you are still on 5.x. 5.x regular bugfix support ends 13 October 2026. Plan the move to 6.x.

    Is Joomla still worth using instead of WordPress?

    Use Joomla when you need core multilingual, deep permissions, and a flexible architecture. Use WordPress when publishing speed and the plugin/theme market matter more than those native tools.

    Should I start a new site on Joomla 5 or Joomla 6?

    Start on Joomla 6 unless an extension forces a short stay on 5.4. New projects should not begin on a line that leaves regular support in October 2026.

    Did Joomla die after WordPress took the market?

    No. It lost the mass-blog market. It kept the niches where core ACL and multilingual still beat a plugin stack. That is a smaller future, not a dead one.

    Conclusion

    Joomla in 2026 is not the 2015 story and not the 2023 Joomla 5 launch story. It is a 21-year-old CMS on a 6.x line with a published support calendar. If your next site needs that kind of control, it still deserves a serious look. If you only need a theme and a checkout, pick the tool that already won that job.

  • Joomla 3 to Joomla 6 Upgrade: The Path You Cannot Skip

    Joomla 3 to Joomla 6 Upgrade: The Path You Cannot Skip

    You cannot jump from Joomla 3 to Joomla 6. In 2026 the supported destination is Joomla 6.1.x (current: 6.1.3). The official path is still staged: Joomla 3.10 to 4.4, then 4.4 to 5.4, then 5.4 to 6. Each hop needs its own backup, Pre-Update Check, and extension pass. Stopping at Joomla 4 is no longer the finish line.

    This URL still ranks for Joomla 3 to Joomla 4 because that hop is mandatory. The article is updated for people who think a Joomla 6 zip on a Joomla 3 tree is an upgrade. It is not. It is a broken site.

    We have run this path on client sites at Infyways for years. The 2023 “ten tips for Joomla 4” list still matters. The target, PHP, and Backward Compatibility plugin rules have changed. Follow the current Joomla 3 to 4, 4 to 5, and 5 to 6 manuals for the button-by-button UI. Use this page for the decisions those manuals assume you already made.

    What you will learn

    • Why Joomla 3 to Joomla 6 is a chain, not a single update
    • What still applies from the old Joomla 3 to 4 checklist
    • PHP, MySQL, and Backward Compatibility plugin rules that stop a 5.4 to 6 upgrade
    • Whether to land on 5.4.8 or go all the way to 6.1.3

    The only upgrade path that works

    Stage You must be on You move to
    1 Latest Joomla 3.10.x Joomla 4.4.x
    2 Joomla 4.4.x Joomla 5.4.x
    3 Joomla 5.4.x Joomla 6.x (6.1.3 as of 18 August 2026)

    If the Update component does not offer the next major, your PHP/MySQL or extensions failed the Pre-Update Check. Forcing a package overwrite across majors is how sites go offline.

    Joomla 5.x regular bugfix support ends 13 October 2026 (security-only until 12 October 2027). Joomla 6.x is supported into 2028 and 2029 on the project roadmap. A new project should not “finish” on 4.x. A Joomla 3 site in 2026 should budget for 6.x, with 5.4 as a holding pattern only if an extension is not ready.

    Step 1: Put Joomla 6 on the requirements sheet first

    Do not size the server for Joomla 4 and hope. Joomla 6’s documented floor includes PHP 8.3, MySQL 8.0.13 or MariaDB 10.6.x (PostgreSQL 14 if you use it). Joomla 4 to 5 already wants PHP 8.1 and MySQL 8.0.13. Joomla 3 often still sits on PHP 7.x. That is three hosting conversations, not one.

    If the host cannot do PHP 8.3, you will stop on 5.4 and still have a clock. Change host or plan before you burn a weekend on 3 to 4.

    Step 2: Backup with Akeeba, then prove the restore

    Take a full Akeeba (or equivalent) backup before every hop, not once at the start. Restore that backup on staging at least once. An untested backup is not a rollback plan. Keep the Joomla 3 backup after you reach 4. You will want it if an extension vendor has no Joomla 6 build and you need original data.

    Step 3: Inventory extensions for 4, 5, and 6, not only 4

    The 2023 advice was: check Joomla 4 versions on the JED. In 2026, a Joomla 4-only extension is a trap. You will pay for that migration twice.

    • Keep it if the vendor has a Joomla 5.4 and Joomla 6 package, or a clear 5.4 bridge
    • Replace it before 3 to 4 if the vendor is dead. Dead on Joomla 4 is dead on Joomla 6
    • Ask the developer in writing for the 6.x date. “Coming soon” is not a path

    VirtueMart, K2, old page builders, and custom components are where this project actually lives. Core is the easy part. If you need the work done as a project, that is Joomla upgrade and extension development, not a checkbox.

    Step 4: Treat the template as a rewrite, not a setting

    A Joomla 3 template will not “mostly work” on 6. Bootstrap, Chrome, and module positions change at 4 and again later. Budget a Joomla 5/6 template or a rebuild. Cassiopeia is a landing pad, not a brand.

    Step 5: Run the Pre-Update Check on 3.10 before you touch 4

    On Joomla 3.10, point Joomla Update at the Joomla 4 channel and read the Pre-Update Check. Update what you are keeping. Uninstall what will not survive. Disable incompatible system plugins so they do not fatal the first administrator hit after 4. Then migrate 3 to 4 on staging using the official 3 to 4 guide. Live is last.

    Step 6: Do not live on 4.4

    Joomla 4.4 is a station. After the site is stable, update extensions for 5, uninstall leftover com_search if the 4 to 5 manual still requires it, fix reCAPTCHA as that guide says, then 4.4 to 5.4. Current 5.x at this writing is 5.4.8.

    The Backward Compatibility plugin is enabled on the 4 to 5 hop so old extensions can breathe. That is not permission to skip testing.

    Step 7: Disable the old Backward Compatibility plugin before Joomla 6

    This is the step 2023 Joomla 4 articles never mention, and it is why 5.4 to 6 fails in silence.

    The official 5 to 6 guide: you must be on Joomla 5.4.x. The Behaviour, Backward Compatibility plugin without a number in the name must be disabled before you go to 6. Extensions have to run on 5.4 without that plugin. Joomla 5.4 also ships Backward Compatibility 6 to ease 6.x. Do not mix those two plugins up.

    Then set the update channel to Joomla Next, pass Required Settings, and go to 6.x. Current 6.x: 6.1.3.

    Step 8: Test each hop like it is production

    Checkout, login, multilingual, ACL, custom fields, cron, and the two templates you actually use. Then the next hop. One giant “we will test at the end” is how you discover a Joomla 3 module still running on 6 with a white screen.

    Stop on 5.4 or go all the way to 6

    Land on 5.4.8 when Go to 6.1.3 when
    A paid extension has 5.x only Vendors already ship Joomla 6
    You need weeks to rebuild a template PHP 8.3 is live and staging is green
    You need a freeze before a campaign You want the line supported through 2028 and 2029

    Do not stop on 5.4 forever. Regular 5.x support ends 13 October 2026. For why 6.x is the live major line, see the future of Joomla in 2026.

    Key takeaways

    1. Joomla 3 to Joomla 6 is 3.10 to 4.4 to 5.4 to 6. No skip.
    2. Joomla 3 to 4 is still required. It is not the 2026 destination.
    3. Inventory extensions for Joomla 6 on day one, not after you reach 4.
    4. PHP 8.3 and the unnumbered Backward Compatibility plugin are the usual 5.4 to 6 blockers.
    5. Test and backup at every hop. Then go live.

    Frequently asked questions

    Can I upgrade Joomla 3 directly to Joomla 6?

    No. There is no supported jump. Go 3.10 to 4.4, then 4.4 to 5.4, then 5.4 to 6.

    Is a Joomla 3 to Joomla 4 upgrade enough in 2026?

    No. Joomla 4 is a required station. Plan for 5.4 and 6.x unless you like another migration in a few months.

    What is the current Joomla 6 version?

    Joomla 6.1.3 as of 18 August 2026, with 5.4.8 still on the 5.x line. Check the roadmap before you freeze a package list.

    Why does Joomla 6 not show in the Update component?

    You are not on 5.4.x, PHP is below 8.3, or an extension/plugin (including the old Backward Compatibility plugin) failed the Pre-Update Check.

    Do I still need Akeeba and a staging site?

    Yes. More hops means more rollback points. Restore a backup on staging before every major jump.

    Conclusion

    Keep the Joomla 3 to 4 discipline: backup, extensions, template, Pre-Update Check, staging. Change the destination to Joomla 6. If that chain is more than you want to own, we still run it as an upgrade project and keep the site on support afterward.

  • How to Speed Up a Joomla Website in 2026

    How to Speed Up a Joomla Website in 2026

    To speed up a Joomla website in 2026, fix Time To First Byte and images first, then JavaScript. Google ranks field Core Web Vitals (LCP, INP, CLS), not your one-off Lighthouse screenshot. Joomla 5 and 6 already have cache, Gzip, and the Web Asset Manager. Most slow sites are still on PHP 7, uncompressed images, Progressive cache on a logged-in shop, or five minify plugins fighting each other.

    The 2023 version of this URL was a long “10 ways” list. That list still works. The destination changed. FID is gone. INP is the interactivity metric. Cassiopeia and modern templates load almost no jQuery unless an old extension drags it in. If you only enable Conservative Caching and call it done, you will not win a PageSpeed argument.

    This is the order we use at Infyways on Joomla 4, 5, and 6 (current 6.1.3 / 5.4.8). For a full optimization project, see Joomla website optimization.

    What you will learn

    • Why lab scores lie and Search Console field data does not
    • Conservative vs Progressive vs System Page Cache, without breaking logins
    • What actually moved in Joomla 5 and 6: Web Asset Manager, PHP 8.3, less default JS
    • The image and INP work most “speed up Joomla” posts still skip

    What “fast” means in 2026

    Metric What Google wants (good) Usual Joomla cause when it fails
    LCP Largest content paints quickly Hero JPEG, no dimensions, slow TTFB
    INP Clicks respond in about 200 ms or less Heavy JS, jQuery stacks, chat widgets
    CLS Layout stays still Images without width/height, late fonts, ads
    TTFB Server answers fast PHP 7, no cache, distant origin, huge SQL

    Use PageSpeed Insights and Search Console together. The top of PSI is field data when Google has enough traffic. Lighthouse below that is a lab story on a simulated phone. A green lab and a red field report means your real visitors are slower than the test. Trust the field numbers for ranking.

    Test tools still worth a pass: PageSpeed Insights, GTmetrix, WebPageTest, and your host’s TTFB. They do not replace Search Console.

    Step 1: Measure one URL, logged out, on mobile

    Pick the homepage and one heavy inner URL (product, article with modules). Test logged out. Logged-in administrator pages will always look worse. Note LCP element (usually the hero image), unused JavaScript, and TTFB. Do not change ten settings at once. You will not know what helped.

    Step 2: Put PHP and the host on Joomla 6 footing

    Joomla 6 expects modern PHP (8.3 on the official 5 to 6 path). Shared hosting on PHP 7.4 will lose to a cheap VPS on 8.3 with OPcache. HTTP/2 or HTTP/3, SSD, and a region near your users beat another caching plugin.

    If you are still on Joomla 3, speed work is a delay tactic. Upgrade path is in Joomla 3 to Joomla 6.

    Step 3: Turn on Joomla cache the way the site actually works

    Global Configuration, System tab, Cache Settings:

    • Conservative Caching: safe default. Modules can still vary. Use this on shops, membership, and anything with a cart or login.
    • Progressive Caching: more aggressive. Fine for a brochure site that is identical for every guest. It will show the wrong module to the wrong user if you sell or personalize.
    • Cache Handler: File is fine on small sites. Redis or Memcached if the host actually runs them. Do not pick Redis because a blog said so.
    • Cache Time: start around 15 minutes. Raise it if content barely changes.

    Separately, the System, Page Cache plugin caches full HTML for guests. That is often the biggest Joomla-native win. Exclude cart, checkout, and account pages. Purge cache after template or extension updates.

    Module-level cache helps repeating chrome (menus, footers). Do not cache a module that shows the logged-in name.

    Step 4: Compress on the server, then confirm in Joomla

    Gzip in Global Configuration, Server tab, still matters if the host is not already sending Brotli or Gzip. Many Nginx stacks already compress. Enabling Gzip twice does nothing useful. Confirm in the response headers (content-encoding: gzip or br). Walk through the admin toggle in test and enable Gzip in Joomla. If the host offers Brotli, prefer it at the server and leave Joomla Gzip off to avoid double work.

    Also send long cache-control for /media, /templates, and images. Joomla’s Web Asset Manager appends a version query when assets change, so long browser cache is safe if you actually use WAM. See the Web Asset Manager docs.

    Step 5: Fix LCP, which is usually an image

    Resize the hero to the largest size you display. Serve WebP or AVIF with a fallback. Set width and height so CLS does not jump. Lazy-load below the fold only. Never lazy-load the LCP image.

    A 4000px PNG in a 720px column will beat any cache plugin. If you want that conversion inside Joomla, our JoomlaX WebP/AVIF tools exist for that job. CDN the /images tree after the files are small.

    Step 6: Cut JavaScript until INP recovers

    Joomla 4+ templates should not ship jQuery for decoration. If the page still loads jQuery, an extension asked for it. Unpublish sliders, live chat, and “add to any” buttons you do not use. One chat widget can wreck INP on mobile.

    Do not install three CSS/JS minify extensions. They race, break Web Asset Manager order, and duplicate HTTP requests. Pick one approach: a capable template, or one well-supported optimizer, or Cloudflare’s rocket features, not all three.

    Defer non-critical JS. Keep first click handlers light. INP is about the worst interaction on the page, not the first paint only.

    Step 7: Use a CDN for bytes, not as a substitute for PHP

    Cloudflare, Bunny, or Fastly help static files and TTFB for distant users. Purge after deploys. Page rules that cache HTML for logged-in cookies will leak carts. Cache /media and images aggressively. Be careful with HTML at the edge on Joomla sites that set cookies on first view.

    Step 8: Clean the CMS so the cache has less to store

    • Uninstall unused extensions. Disabled plugins still load in some stacks. Uninstall.
    • Keep Joomla on 6.1.3 or 5.4.8. Old 3.x PHP loops are slow and unsafe.
    • Limit modules in the header. Every module is queries and HTML.
    • Turn off debug and uncompressed scripts on production.
    • Database: delete expired sessions, old banner tracks, and leftover #__session bloat if the host shows huge session tables.

    What not to do

    Habit Result
    Progressive cache on a shop Wrong prices or a logged-in module on a guest page
    Five “speed” plugins Broken CSS, duplicate jQuery, worse INP
    Lazy-loading the logo and hero Worse LCP
    Chasing 100 on Lighthouse desktop You ignore mobile field data
    Gzip plus Brotli plus a minify CDN plus JCH Unreadable CSS and no way to debug

    Key takeaways

    1. Speed up Joomla for LCP, INP, and TTFB, not a vanity lab score.
    2. Conservative cache plus Page Cache for guests beats Progressive cache on personalized sites.
    3. Images and PHP version usually beat another minify extension.
    4. Use the Web Asset Manager. Stop injecting raw script tags in the template.
    5. One optimizer stack. Then re-measure the same URLs.

    Frequently asked questions

    How do I speed up a Joomla website in 2026?

    Measure field Core Web Vitals, raise PHP, enable Conservative Caching and guest Page Cache if the site allows it, compress responses, shrink the LCP image, and remove extra JavaScript. Then retest the same URLs.

    What is the difference between Conservative and Progressive Caching?

    Conservative caching is the safe default and respects module variation. Progressive caching stores more aggressively and is for sites that look the same to every guest. Do not use Progressive on carts, membership, or personalized modules.

    Does Gzip speed up Joomla?

    It reduces HTML, CSS, and JS bytes if the server was sending them raw. If Nginx already sends Brotli or Gzip, turning it on in Joomla will not magically double the gain. Check response headers.

    Will a caching plugin replace a slow template?

    No. Cache serves the same heavy HTML faster the second time. It does not fix a 2 MB hero or 400 KB of jQuery plugins on first view.

    Is Joomla 6 faster than Joomla 3?

    A current 6.x site on PHP 8.3 with Web Asset Manager is in a different league than Joomla 3 on PHP 7. The CMS version alone is not a PageSpeed plugin. You still have to size images and modules.

    Conclusion

    Speed work on Joomla is a sequence: measure, host, cache, compress, images, JavaScript. Skip the sequence and you get a graveyard of speed extensions. If you want that sequence run as a project, use Joomla website optimization and keep the site patched under support.