Semakin
Customer

SemaSitemap

SemaSitemap for Joomla Joomla 4 / 5 / 6

Joomla 4 / 5 / 6 Version 0.3

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.

How it works

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, hreflang alternates 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 .htaccess does not rewrite .xml, there is an index.php address style

How it works

The way to the crawler

1

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.

2

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.

3

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

SettingDescription
SourcesMenu, articles, article categories, VirtueMart categories / products / manufacturers — each separately
Product variantsInclude VirtueMart child products as well
Language alternatesEnable hreflang, optionally an x-default link
Cache lifetimeIn hours; after expiry the map is rebuilt
URLs per fileSize of one XML file; the index assembles itself
Query batch sizeHow many rows are loaded per queue step
In-request build limitUp to how many addresses the map is built directly in the crawler's request
Sitemap address stylePretty paths (/sitemap-menu.xml) or addresses via index.php
State strip patternsVirtueMart address segments removed from the map
Unrouted addressesAlso list addresses the router has no menu item for
Priority and changefreqOff by default — search engines ignore them
Step timeout and tick budgetQueue tuning to the limits of your hosting
Build endpoint rate limitProtection against flooding the build (per minute)

Technical details

ParameterValue
Extension typeJoomla Package (admin component + system plugin + task plugin)
CompatibilityJoomla 4.4 / 5.x, PHP 8.1+
VirtueMart4.2+ — optional; without it the Joomla content is covered
OutputIndex /sitemap.xml + one file per language and source, sitemaps.org protocol, hreflang
CacheFiles on disk, lifetime in hours, index built from existing files only
BuildTwo-phase queue, resumable from the failed step, Joomla scheduler
Measured10,028 products × 4 languages: full build 10 s, peak 16 MB, 12 files + index
HostingShared hosting without SSH (PHP ~30 s / 128 MB)
DatabaseThree own tables, removed on uninstall
LocalisationCzech, English
InstallationOne ZIP through the extension installer
UpdatesThrough the Joomla update manager (SemaHub)
LicenceGPL 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.

SemaSitemap for Joomla

Online generated XML sitemap for Joomla and VirtueMart – filesystem cache, hreflang and a step-by-step build that handles large catalogues on shared hosting.

Powered by SemaHub

Interested in working together?

Get in touch and let's discuss your project. We'll be happy to help you choose the right solution.