Category: Joomla

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

    Related Joomla guides

    Need hands-on help? See our Joomla development services.

    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.

    Joomla at 21: the milestones

    Joomla turned 21 on 17 August 2026. The project began on 17 August 2005 as a fork of Mambo, so the CMS would stay open source and community-run. The name, from the Swahili jumla (“all together”), was announced on 1 September 2005, and Joomla 1.0 shipped on 22 September 2005.

    Date Milestone
    17 August 2005 Mambo fork; the project that became Joomla begins
    1 September 2005 The name Joomla is announced
    22 September 2005 Joomla 1.0 ships
    17 October 2023 Joomla 5.0 ships
    17 August 2025 20th anniversary
    14 October 2025 Joomla 6.0 and Joomla 5.4 ship together
    17 August 2026 Joomla turns 21
    12 October 2027 Joomla 5 end of life (last 5.4 security fixes)

    Twenty-one years on, Joomla has no corporate owner and still ships native multilingual, granular ACL, custom fields and a Web Services API in core. Dates from the Joomla roadmap.

    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

    MetricWhat Google wants (good)Usual Joomla cause when it fails
    LCPLargest content paints quicklyHero JPEG, no dimensions, slow TTFB
    INPClicks respond in about 200 ms or lessHeavy JS, jQuery stacks, chat widgets
    CLSLayout stays stillImages without width/height, late fonts, ads
    TTFBServer answers fastPHP 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

    HabitResult
    Progressive cache on a shopWrong prices or a logged-in module on a guest page
    Five “speed” pluginsBroken CSS, duplicate jQuery, worse INP
    Lazy-loading the logo and heroWorse LCP
    Chasing 100 on Lighthouse desktopYou ignore mobile field data
    Gzip plus Brotli plus a minify CDN plus JCHUnreadable CSS and no way to debug

    Related guides and services

    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.

  • How to Repair a Hacked Joomla Website: Incident-Response Guide (Joomla 4, 5 & 6.2)

    How to Repair a Hacked Joomla Website: Incident-Response Guide (Joomla 4, 5 & 6.2)

    Updated 15 October 2026 · By Abhilash Sahoo, Founder, Infyways

    Quick answer: Repairing a hacked Joomla site is incident response, done in order:

    1. Contain: copy the infected files, database and logs for evidence, then take the site offline.
    2. Change every password (Joomla admin, database, FTP/SSH, hosting).
    3. Remove the attacker’s persistence: rogue PHP files, extra Super Users, injected .htaccess rules, scheduled tasks.
    4. Replace core and extensions from clean official packages. Clean the database.
    5. Close the hole (outdated core or a vulnerable extension), then request a Google review.

    Patching without removing backdoors gets you reinfected. For a badly compromised old Joomla 3 site, rebuilding on Joomla 6.2, the latest version, is often safer than cleaning. This is the recovery guide; for prevention and hardening, see our Joomla security guide.

    This is the sequence we use at Infyways when a client’s Joomla site is already serving malware or has been blacklisted. The command output below comes from a deliberately infected Joomla test tree on our own machine, not from any client site. If you’d rather hand this to someone, we offer hacked Joomla site repair. Take a forensic copy of the infected files before you change anything.

    Is my Joomla site actually hacked?

    Signs a Joomla site is actually hacked versus a non-security problem

    Confirm a compromise before you start deleting. These are signs of a real hack:

    • Google Search Console → Security issues, or a red “Dangerous site” warning in the browser.
    • Your host suspended the account for malware.
    • A Super User you didn’t create, or a user with a registration date that doesn’t match your records.
    • Redirects that only fire for visitors coming from Google, or only on mobile.
    • PHP files in /images, /tmp, /media or a template folder.
    • .htaccess rules or pages you didn’t write.

    A slow site, a white screen after an update, or a plugin conflict is usually not a hack. Google’s own guidance is to treat the Security issues report as the source of truth, because a Safe Browsing warning may not reproduce in every browser.

    What should I do first (contain the damage)?

    Ordered incident-response sequence for repairing a hacked Joomla site
    1. Freeze evidence. Copy the whole site, the database, and 14–30 days of web server access and error logs. Label the copy “infected”. Don’t restore it later as the clean site; you need it to find the entry point and to recover any unique content.
    2. Take the site offline without wiping the server. Use Joomla’s offline mode if the admin still works, or a host-level placeholder. Keep logging on. Our Joomla offline mode guide shows how.
    3. Change every password: Joomla Super Users, database, FTP/SSH, and the hosting control panel. Attackers often have stolen credentials, so patching files alone won’t lock them out.
    4. Scan the computers used to administer the site. Stolen FTP and admin passwords are frequently harvested by malware on a local machine (Joomla’s checklist makes this point).

    How do I find the backdoors and injected code?

    Work from a shell (SSH) or a local copy of the files. Joomla’s checklist and Google’s hacked-site guide both say to search for suspicious code and recently changed files. These are the commands we actually run; the output here is from our infected test tree.

    PHP where it doesn’t belong

    A clean Joomla site has no PHP under /images. Webshells love those folders:

    Finding PHP webshells in the Joomla images folder with find and grep
    # PHP (even disguised) in folders that should only hold assets
    find images media tmp templates -type f \( -name '*.php' -o -name '*.phtml' -o -name '*.php*.gif' \)
    
    # obfuscation markers (Google suggests: eval, base64_decode, system)
    grep -rIn --include='*.php' -E 'eval\(|base64_decode|gzinflate|str_rot13|\$_(POST|GET|REQUEST)\[' .

    Recently changed files

    Joomla’s checklist gives this one. It lists files changed in the last day:

    find /path/to/site -type f -ctime -1 -exec ls -ls {} \;

    Spam and redirects in JavaScript and HTML

    Automated scanners are good at base64 in PHP and weak at a one-line redirect inside a JavaScript file. Search by hand:

    grep -rIn --include='*.js' -E 'document\.write|<iframe|eval\(|atob\(' .
    grep -rIn -E 'HTTP_REFERER|window\.location|<iframe' .

    Client case 1: a hidden iframe a security extension missed

    On one client site, a popular Joomla security extension reported the site clean, but Google still flagged it. The injection was a single line appended to a minified JavaScript file that the template loaded on every page. It wrote a zero-size, off-screen <iframe> to a malicious host. Scanners that focus on PHP walked right past it.

    What found it was a diff against a clean copy of that file:

    Diff revealing a hidden iframe injected into a Joomla template JavaScript file

    The lesson: compare every served file against a known-good original, and read JavaScript, not only PHP. A scanner saying “clean” is not proof.

    Client case 2: .htaccess injected into every folder

    Another client ran an old Joomla 3 site on PHP 7.2. The attacker had dropped an .htaccess file into nearly every folder, each adding a referrer-based redirect, so visitors arriving from Google or Bing were sent to a malicious site while the owner, typing the URL directly, saw nothing wrong.

    Finding injected .htaccess referrer redirects in every Joomla folder
    # list every .htaccess, then flag the ones with redirects
    find . -name .htaccess
    grep -rIl --include='.htaccess' -E 'HTTP_REFERER|RewriteRule.*https?://' .

    Because the site was on an unsupported Joomla and PHP version with injections throughout, cleaning file-by-file wasn’t worth the risk. We kept the database and the images, and rebuilt everything else from scratch on Joomla 6: a fresh install, a fresh template, and extensions reinstalled from clean sources. That’s our standard approach for badly compromised old Joomla 3 sites, and it ties into our Joomla 3 to 6 upgrade guide.

    Should I clean the site or rebuild it?

    When to clean a hacked Joomla site in place versus rebuild on Joomla 6.2
    Clean in place Rebuild on new Joomla
    Best when Current Joomla, one known entry point, a clean pre-hack backup exists Old Joomla 3 / PHP 7.x, injections everywhere, no trustworthy backup
    Core Reinstall the same series from a clean zip Fresh Joomla 6.2 install
    What you keep Cleaned files plus the database Database and images only, after review
    Template & extensions Reinstalled from clean copies Rebuilt from scratch
    Confidence it’s gone Good, if you found every backdoor Highest

    Joomla 6 needs PHP 8.3 or newer (we confirmed JOOMLA_MINIMUM_PHP = 8.3.0 in the 6.2.0 package). A rebuild is also a forced move onto a supported stack, which closes the door that let the old site get hacked.

    How do I replace the core without breaking the site?

    • Match the installed major version first. Reinstall the same series from a clean official package to overwrite tampered files; keep configuration.php and your database. Joomla’s checklist warns that overwriting a Joomla 3 tree with a different major version will break the site.
    • Reinstall, don’t just unpublish, extensions. Unpublishing a vulnerable component leaves its PHP on disk, and it still runs if the attacker hits the old URL. Joomla’s documentation is explicit that unpublishing is not enough; uninstall it.
    • Check the Vulnerable Extensions List for every component, module and plugin you keep, and update to a patched release. For versions, use our Joomla 6 compatibility check.
    • Clean the database and .htaccess. Malware hides in article HTML, module content and server rules, not only in files. Replace the root .htaccess with Joomla’s shipped htaccess.txt (see our Joomla .htaccess guide).
    • Lock down upload folders. Joomla’s checklist suggests an .htaccess in /images that disables script execution, plus file permissions of 644 and folders 755, never 777.

    How do I remove the Google “this site may be hacked” warning?

    Requesting a Google Search Console security review after cleaning a hacked site
    1. Fix the issue on every page, not just the samples Google lists. A partial fix won’t restore you.
    2. Verify the way Google sees the site. Hackers often cloak content for Googlebot, so use the URL Inspection tool, or curl with a Googlebot user-agent and a Google referrer, rather than only a normal browser.
    3. Request a review in Search Console → Security issues. Google says a good request names the exact issue, lists the steps you took, and shows the result.
    4. Wait. Reviews take from a few days to a few weeks. Don’t resubmit while one is pending, or you can be marked a repeat offender.

    Safe Browsing, Search Console and your host’s blocklist are separate systems. Clearing one doesn’t clear the others, so check each.

    Troubleshooting

    Symptom Likely cause What to do
    Cleaned the site, reinfected within hours A backdoor or entry point was missed Reinstall core fresh, re-hunt webshells, change all passwords again
    Only visitors from Google get redirected Referrer rule in .htaccess or a cloaking script Grep every .htaccess for HTTP_REFERER; test with a Googlebot referrer
    Security extension says “clean” but Google disagrees Injection in JS/HTML the scanner skipped Diff files against clean originals; read JavaScript by hand
    Restored a backup and the hack came back The backup was taken after the compromise Use an older backup, or clean and rebuild instead
    Site white-screens after replacing core Wrong major version written over the tree Restore the infected copy, then match the installed series
    New Super User keeps reappearing A webshell or scheduled task recreates it Find the backdoor and the cron/task; don’t just delete the user
    Spam links appear only in page source Injected into modules or article HTML in the database Search the database, not only files
    Google review rejected Issue still present on some pages Fix site-wide, reverify as Googlebot, resubmit once

    FAQs

    How do I repair a hacked Joomla website?

    Contain and back up the evidence, take the site offline, change all passwords, remove the attacker’s files, users and .htaccess rules, replace core and extensions from clean copies, close the entry point, then request a Google review.

    Can I just update Joomla to remove the malware?

    No. Updating closes one hole but leaves any webshells, rogue users or injected files already on the site. You have to remove the backdoors as well.

    Is unpublishing a vulnerable extension enough?

    No. The files still execute if the attacker requests the old URL. Joomla’s documentation says to uninstall it, not unpublish it.

    Should I restore my latest backup?

    Only if it was taken before the hack. A backup made after the compromise restores the malware too. If you can’t be sure, clean or rebuild instead.

    When should I rebuild instead of clean?

    When the site is on an old, unsupported Joomla and PHP version, the infection is everywhere, or you have no clean backup. Keep the database and images, and rebuild the rest on Joomla 6.2.

    Why did my security extension miss the infection?

    Many scanners focus on PHP. One of our client cases was a hidden iframe inside a JavaScript file, which the scanner ignored. Diffing against clean files and reading JavaScript found it.

    What are the injected .htaccess files for?

    Usually redirects. In one client case, an .htaccess in every folder sent visitors arriving from Google or Bing to a malicious site, while the owner saw nothing.

    How long does the Google warning take to clear?

    After you fix every page and request a review, from a few days to a few weeks. Don’t resubmit while a review is pending.

    Will my search rankings come back?

    Rankings usually recover once the warning is lifted and the spam is gone, but it isn’t instant, and heavily affected pages can take time to return.

    Can Infyways clean or rebuild my site?

    Yes. We do incident response, malware removal and rebuilds through our hacked Joomla site repair service, and ongoing protection through Joomla support and maintenance. To prevent a repeat, start with the Joomla security guide.

  • Joomla Turns 21 Today: Why Its Best Days Are Still Ahead

    Joomla Turns 21 Today: Why Its Best Days Are Still Ahead

    Joomla turns 21 today, 17 August 2026. Twenty-one years after the Mambo fork on 17 August 2005, it is still a production-ready open-source CMS for multilingual, ACL-heavy, and enterprise-style websites. Market share is smaller than WordPress. The next chapter depends on developer confidence, smoother upgrades, and core strengths that still outpace many competitors.

    I have used Joomla since the Mambo days. At Infyways we still ship Joomla extensions used worldwide. Looking only at market share, it is easy to say Joomla lost. Looking at architecture, security, and real project fit, that conclusion is incomplete. Today is a birthday, not a eulogy.

    What you will learn

    • Why 17 August 2026 is Joomla’s 21st birthday, and how the 2005 fork actually started
    • Why Joomla’s decline was mostly confidence and migration friction, not weak technology
    • Which core capabilities still make Joomla a strong CMS choice in 2026
    • Where Joomla 5.4.x and 6.x stand on the current roadmap
    • When to choose Joomla instead of trying to copy WordPress

    17 August 2026: Joomla is 21

    The date is not marketing copy. The Joomla project and the official 20 Years of Joomla timeline put the start of the story on 17 August 2005: a fork of Mambo so the CMS would stay truly open source. The name Joomla (from the Swahili jumla, “all together”) was announced on 1 September 2005. Joomla 1.0 shipped on 22 September 2005.

    That makes today, 17 August 2026, twenty-one years of a volunteer-run CMS with no corporate owner. Last year’s 20th birthday week is documented in the Joomla Community Magazine. Year 21 is quieter, which is fine. The work is in releases, not merch shops.

    Date Milestone
    17 August 2005 Mambo fork. The project that became Joomla begins.
    1 September 2005 The name Joomla is announced.
    22 September 2005 Joomla 1.0 ships.
    17 August 2025 Official 20th anniversary.
    14 October 2025 Joomla 6.0 and Joomla 5.4 ship together.
    17 August 2026 Joomla turns 21.
    18 August 2026 Planned Joomla 5.4.8 and 6.1.3 on the project roadmap.
    21 to 22 August 2026 Global Pizza, Bugs and Fun contributor event.

    Joomla market share vs WordPress in 2026

    According to W3Techs, Joomla currently powers about 1.2% of all websites and roughly 1.7% of sites that use a known CMS. WordPress powers over 43% of all websites and nearly 62% of the CMS market.

    Signal Joomla WordPress
    Share of all websites ~1.2% ~43%+
    Share of known CMS market ~1.7% ~62%
    Core multilingual Native Usually plugin-based
    Granular ACL Built into core Often plugin-dependent
    Best-fit use cases Complex, multilingual, permission-heavy sites Publishing speed and mass adoption

    Bottom line: market share measures popularity. It does not measure whether Joomla is still the better tool for a university portal, government site, membership platform, or multi-language enterprise build.

    Joomla never lost because of technology

    The most common misconception is that Joomla declined because it could not keep up technically. I disagree. Modern Joomla is one of the strongest releases the project has ever shipped.

    • Native multilingual support
    • Enterprise-grade Access Control Lists (ACL)
    • Custom Fields for structured content entities
    • Template overrides for full front-end control
    • Web Services / API endpoints for headless and hybrid builds
    • Modern PHP architecture, cleaner code, and a strong security posture

    Many of these capabilities existed in Joomla before they became table stakes elsewhere. Technology was never the core weakness.

    The real challenge was confidence

    The harder problem was investment confidence. Major releases modernized the platform, but they also created painful migrations, broken extensions, template rewrites, and changing APIs.

    Businesses delayed upgrades. Developers spent months on compatibility instead of new products. Agencies hesitated before recommending Joomla for long-term roadmaps. Some extension authors moved ecosystems or stopped shipping altogether.

    That uncertainty, not a lack of features, slowed Joomla’s commercial momentum.

    The biggest loss was developers, not just users

    A CMS is only as strong as the ecosystem around it: extension developers, template creators, agencies, hosts, educators, and community contributors. When developers stop building, users eventually stop arriving. That developer attrition was Joomla’s deepest challenge over the last decade.

    What Joomla still gets right in 2026

    Joomla still wins on flexibility, security, scalability, and developer freedom. Unlike platforms that outsource essential capability to plugins, Joomla keeps many advanced features in core.

    • Multilingual: still among the best native CMS implementations
    • Permissions: ACL depth most competitors still struggle to match cleanly
    • Architecture: enough freedom to build complex applications, not only brochure sites
    • Trust: a long security track record with businesses, education, and public-sector projects
    • Governance: still community-run. No venture owner can flip the license.

    As cybersecurity and data ownership become non-negotiable, those strengths matter more, not less. For a practical hardening view, see our Joomla security 2026 guide.

    Where Joomla 5.4 and Joomla 6 stand on its 21st birthday

    On 14 October 2025, the project released Joomla 6.0 and Joomla 5.4. 5.4 is the bridge. 6.x is the new major line, with automatic core updates and a Backward Compatibility 6 plugin to reduce upgrade risk.

    The Joomla roadmap (updated 16 August 2026) is the right snapshot for today:

    • Joomla 5.x current: 5.4.7. Bugfix only. Regular bugfix support until 13 October 2026. Security-only until 12 October 2027.
    • Joomla 6.x current: 6.1.2. Bugfix support until 17 October 2028. Security-only until 16 October 2029.
    • Tomorrow, 18 August 2026: planned 5.4.8 and 6.1.3.
    • Joomla 6.2.0 is aimed at 13 October 2026, with Beta 1 listed for 18 August 2026.

    This week the community also runs Pizza, Bugs and Fun on 21 to 22 August 2026, a hybrid global event for testing, docs, and patches, including work toward Joomla 6.2. Birthdays are nice. Contributor weekends keep the CMS alive.

    Why I still build with Joomla

    People ask why I keep investing after two decades. Because the product still solves hard problems well. At Infyways we keep releasing and maintaining Joomla products, and we stay active on the Joomla Extensions Directory. If we did not believe Joomla had a future, we would not keep putting time and capital into that ecosystem.

    For teams also optimizing content for AI search answers, pair this CMS strategy with our practical guide to GEO for Joomla.

    Joomla does not need to become WordPress

    Comparing Joomla only to WordPress misses the point. WordPress won by making publishing extremely simple. Joomla won by giving developers and organizations deep flexibility. That identity should stay.

    Instead of chasing raw market share, Joomla should keep improving what already makes it exceptional, while making onboarding, upgrades, and sustainable extension businesses easier.

    Key takeaways

    1. Joomla is 21 today, 17 August 2026, counting from the 17 August 2005 Mambo fork.
    2. Smaller market share does not mean the CMS is obsolete for complex builds.
    3. Core multilingual, ACL, Custom Fields, and Web Services remain durable advantages.
    4. Joomla 6.1.2 is the current major line. 5.4.x is still supported. 5.4.8 and 6.1.3 are on the calendar for 18 August 2026.
    5. Joomla should double down on its identity, not imitate WordPress.

    Frequently asked questions

    When did Joomla turn 21?

    On 17 August 2026. The project began as a Mambo fork on 17 August 2005, was named Joomla on 1 September 2005, and shipped 1.0 on 22 September 2005.

    Is Joomla still worth using in 2026?

    Yes, when you need native multilingual, deep ACL, structured content, or a flexible architecture for complex sites. It is not always the fastest path for a simple brochure blog, but it remains a strong CMS for demanding projects.

    Did Joomla lose to WordPress because of bad technology?

    No. Joomla’s harder problem was confidence: migration pain, extension compatibility risk, and uncertain long-term investment signals. The core technology stayed competitive.

    What should I run on Joomla’s 21st birthday?

    Joomla 6.1.2 on the 6.x line, or 5.4.7 if you are still on 5.x. Watch for 6.1.3 and 5.4.8 around 18 August 2026 on the official roadmap, then plan toward 6.2 later in 2026.

    Who should choose Joomla over WordPress?

    Teams building multilingual portals, permission-heavy applications, government or education sites, or custom systems that benefit from core ACL and overrides, rather than assembling the same stack from many plugins.

    Conclusion

    Twenty-one years in, Joomla’s next chapter will not be written by market-share charts alone. It will be written by developers who keep building, businesses that keep investing, and a community that treats security, ownership, and flexibility as first-class product values. I am still building extensions, still contributing on the JED, and still recommending Joomla when it is the right fit, not from nostalgia, but because the platform still has enormous potential.

    Happy 21st birthday, Joomla. Here’s to the next 21 years.