Coming soon
We are still finishing this extension — it is not on sale yet. The planned price is €45 per year. The description below covers the upcoming version 0.3.4.
XML sitemap for Joomla and VirtueMart
Online generated sitemap with a filesystem cache, hreflang language alternates and VirtueMart collectors
One package. Ten thousand products in ten seconds. Shared hosting is enough.
The sitemap is the first thing Google reads from an e-shop — and on shared hosting with a larger catalogue it is often the one thing that never gets built completely. Generators that assemble everything in a single request hit the time limit, static files go stale, and VirtueMart adds addresses that do not exist on the site at all. SemaSitemap builds the map step by step, stores it on disk and hands the crawler nothing but a finished, verifiable file.
Why you need this
A search engine indexes only what it finds. The sitemap tells it which addresses exist, in which language and which one is canonical. Without it — or with a map full of 404s and redirects — part of the catalogue is lost and nobody notices.
What search engines want
- A complete list of addresses the site really answers with 200
- On a multilingual site,
hreflangalternates for every address - Files of up to 50,000 addresses and an index that ties them together
- A map that refreshes with the content — not once a month by hand
Where the usual tools fail
- The generator assembles the whole catalogue in one request — on shared hosting it dies after 30 s
- The VirtueMart router produces duplicate addresses and state segments that have no place in a sitemap
- Products hidden by stock rules or unpublished in a given language get into the map anyway
- The index lists files that are not on disk yet — the crawler gets a 404
What SemaSitemap solves
Install one ZIP. The package enables the component and both plugins, puts them in the right order and creates the scheduled task. Switch on the sources, press Build — and /sitemap.xml serves an index with a file for every language.
Content sources
- Joomla — menu items, articles and article categories; each source can be switched on separately
- VirtueMart — categories, products and manufacturers, optionally product variants too
- Only what the site really shows — respects publishing state, item language and products hidden by stock rules
- Addresses from the site router — the map holds the same addresses a visitor sees, SEF rewrites included
VirtueMart without surprises
- Canonical category — a product in several categories gets the very address VirtueMart prints on the product page
- State strip patterns — ordering, paging and display segments are removed; the sitemap holds clean paths only
- Large catalogues — collectors work in batches and flush the VirtueMart router caches, so memory does not grow with the catalogue
- Verify a sample — one button checks that a sample of generated addresses answers 200 rather than a redirect
Multilingual sites and output
- One file per language —
/en/sitemap-menu.xml,/de/sitemap-vmprod-2.xml… and a shared index at/sitemap.xml - hreflang — alternates in the other languages for every address, taken from Joomla associations, optionally with
x-default - Filesystem cache — the crawler reads a finished file; the lifetime is set in hours
- File splitting — you choose the number of addresses per file, the index assembles itself
- Hosting without URL rewriting — for servers where
.htaccessdoes not rewrite.xml, there is anindex.phpaddress style
How it works
The way to the crawler
Addresses collected in steps
A queue walks the enabled sources language by language and batch by batch. Every step fits the time limit of shared hosting; when one fails, the build resumes from it, not from the start.
Files on disk
The maps of all languages are merged into XML files with hreflang blocks plus an index. Merging is cheap — with ten thousand products, a fraction of a second per file.
The crawler gets a finished file
A request for /sitemap.xml returns an index of existing files only. A small site builds itself within the request; a large one answers 503 Retry-After until the queue has run — never a 404.
For the site operator
- Environment check — Right after installation the dashboard tells you what is missing: URL rewriting, the language filter, a writable cache, VirtueMart. No row may be ERROR.
- Build with progress — Start the build with a button and watch the step, elapsed time and the estimate of what remains. After a failure you continue from where the queue stopped.
- Scheduled task — The package creates a task in the Joomla scheduler; the hosting cron or a webcron triggers it and the map refreshes on its own.
- Verify a sample — A sample of addresses from the finished map is tested with real HTTP requests: 200 is OK, a redirect a warning, 404 an error.
- Error journal — Whatever went wrong during the build is shown in the dashboard, not buried in a log nobody reads.
- Effective settings — A card lists every setting together with where its value comes from; a mismatch against the defaults is reported.
What can be configured
| Setting | Description |
|---|---|
| Sources | Menu, articles, article categories, VirtueMart categories / products / manufacturers — each separately |
| Product variants | Include VirtueMart child products as well |
| Language alternates | Enable hreflang, optionally an x-default link |
| Cache lifetime | In hours; after expiry the map is rebuilt |
| URLs per file | Size of one XML file; the index assembles itself |
| Query batch size | How many rows are loaded per queue step |
| In-request build limit | Up to how many addresses the map is built directly in the crawler's request |
| Sitemap address style | Pretty paths (/sitemap-menu.xml) or addresses via index.php |
| State strip patterns | VirtueMart address segments removed from the map |
| Unrouted addresses | Also list addresses the router has no menu item for |
| Priority and changefreq | Off by default — search engines ignore them |
| Step timeout and tick budget | Queue tuning to the limits of your hosting |
| Build endpoint rate limit | Protection against flooding the build (per minute) |
Technical details
| Parameter | Value |
|---|---|
| Extension type | Joomla Package (admin component + system plugin + task plugin) |
| Compatibility | Joomla 4.4 / 5.x, PHP 8.1+ |
| VirtueMart | 4.2+ — optional; without it the Joomla content is covered |
| Output | Index /sitemap.xml + one file per language and source, sitemaps.org protocol, hreflang |
| Cache | Files on disk, lifetime in hours, index built from existing files only |
| Build | Two-phase queue, resumable from the failed step, Joomla scheduler |
| Measured | 10,028 products × 4 languages: full build 10 s, peak 16 MB, 12 files + index |
| Hosting | Shared hosting without SSH (PHP ~30 s / 128 MB) |
| Database | Three own tables, removed on uninstall |
| Localisation | Czech, English |
| Installation | One ZIP through the extension installer |
| Updates | Through the Joomla update manager (SemaHub) |
| Licence | GPL v2+ |
Frequently asked questions
Do I need VirtueMart?
No. The VirtueMart collectors switch on only where VirtueMart is present. On a plain Joomla site SemaSitemap maps menu items, articles and article categories.
Do I have to edit the template or .htaccess?
Not the template. The standard Joomla .htaccess with URL rewriting is enough — the plugin serves /sitemap.xml. If the hosting does not pass .xml to PHP, switch the address style to index.php and submit that one to Search Console.
Why did the sitemap answer 503 the first time?
The index lists only files that exist on disk. Until the first build has run, the response is 503 with a Retry-After header — the crawler comes back later and gets the whole map. It never receives an index pointing to missing files.
How does the map refresh?
The Joomla scheduled task the package creates is triggered by the hosting cron or a webcron; the dashboard prints the exact command. The lazy scheduler (triggering by visits) is not supported — on a large site it would never finish a build.
Can it handle a large catalogue on shared hosting?
Yes, that is exactly what the queue is for. Measured on 10,028 products in four languages: a cold build in 10 seconds, 16 MB peak memory. Every step fits the hosting limit and after a failure the build resumes from that step.
What about products in several categories?
A product gets one address — the one VirtueMart itself prints on the product page. Duplicate paths through the other categories do not get into the map.
Multilingual site and hreflang?
Every language has its own files, and every address carries alternates in the other languages from the Joomla and VirtueMart associations. Untranslated content stays in the default language map only, so no duplicates get indexed.
What if a wrong address gets generated?
The Verify a sample button tests addresses from the finished map with real HTTP requests and prints the response code. A redirect is a warning, a 404 an error — you learn it in the administration, not later in Search Console.