All files are located in the output directory. With the default settings that is source/export/:
source/export/
βββ sitemap.xml # sitemap index
βββ sitemap-products.xml # products
βββ sitemap-categories.xml # categories
βββ sitemap-cms.xml # CMS pages
βββ sitemap-manufacturers.xml # manufacturers
βββ sitemap-static.xml # static URLs (only with the setting enabled)
At most one file is created per type. For products, categories, CMS pages and manufacturers it contains at most 50,000 URLs, the static sitemap has no limit. File names with numbers such as sitemap-products-1.xml are not produced by the module. The directory source/export/sitemap, which is created on activation, stays empty with the default settings.
Every URL is written with loc, lastmod, changefreq and priority:
<url>
<loc>https://shop.example.com/product-page/</loc>
<lastmod>2026-01-15</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
lastmod comes from the object's oxtimestamp in the format Y-m-d. If the value is empty or invalid, the date of the generation is usedxhtml:link entries with rel="alternate" are added, and the xhtml namespace is set only when such entries occurimage:image entries with image:loc and, if the product title is not empty, image:title. The image namespace is set only when images occursitemap.xml contains loc and lastmod (date of the generation) per fileAccording to its own documentation, Google does not evaluate
changefreqandpriority, andlastmodonly if the values are reliable. The module writes the fields anyway because the sitemap protocol provides them.
| Type | changefreq |
priority |
|---|---|---|
| Products | weekly |
0.8 |
| Categories | weekly |
0.7 |
| CMS pages | monthly |
0.5 |
| Manufacturers | monthly |
0.6 |
| Static URLs | value of the entry, otherwise monthly |
value of the entry, otherwise 0.5 |
The module works without a cache, without compression (.xml.gz), without pinging search engines and without a scheduler of its own. Every generation reads the data from the database again and overwrites the files.
| Class | Task |
|---|---|
Command\GenerateSitemapCommand |
Console command mmd:sitemap:generate, options, language and type selection, output |
Service\Command\GenerateSitemapService |
Orchestrates query, hreflang, URL building, XML and writing, creates the index |
Service\Query\ProductQueryService, CategoryQueryService, CmsPageQueryService, ManufacturerQueryService |
Read the content with SQL against oxarticles, oxcategories, oxcontents, oxmanufacturers and oxseo |
Service\Query\StaticUrlQueryService |
Reads the table mmd_sitemap_static_urls |
Service\Domain\HreflangService |
Determines alternate language URLs from oxseo |
Service\Domain\UrlBuilderService |
Builds the URL with lastmod, changefreq, priority per record |
Service\Domain\XmlWriterService |
Creates sitemap and index XML with DOMDocument |
Service\Domain\FileWriterService |
Writes files, creates directories, deletes with --clear |
Service\Bridge\OxidConfigReader, OxidSettingsBridge |
Read the module settings as well as shop URL, languages and language URLs |
Core\Events |
Activation and deactivation |
Controller\Admin\* |
Admin overview and management of static URLs |
aLanguages, the language ID is the position in that list. Whether a language is active in the storefront is not checkedaLanguageURLs), falling back to the shop URLblHreflangEnabled) only takes effect if the shop has more than one language. For each object with at least two language URLs, alternates per language code are written. An x-default for the default language (sDefaultLang) is written only if the object has a URL in the default languageThe module creates only the table mmd_sitemap_static_urls (columns see Static URLs). All other data is read from the OXID tables without modifying them. It uses the shop's database connection as a PDO object.
| Event | Effect |
|---|---|
Activation (onActivate) |
Creates source/export/sitemap and the table mmd_sitemap_static_urls if they do not exist |
Deactivation (onDeactivate) |
No action, files and data are kept |
There are no migrations. oe:module:apply-configuration only applies the module settings, not the table.
iMaxUrls is not evaluated). The static sitemap has no limit-s, the shop ID changes in the content queries and in the hreflang queryblImagesEnabled is not evaluatedmmd/sitemap/ # source/modules/mmd/sitemap
βββ metadata.php # module ID mmd_sitemap, settings, events
βββ services.yaml # services and console command
βββ menu.xml # admin menu "Sitemap"
βββ src/
β βββ Command/ # GenerateSitemapCommand
β βββ Controller/Admin/ # overview, static URLs
β βββ Core/Events.php # activation/deactivation
β βββ DTO/, Enum/, Model/ # value objects, types, StaticUrl model
β βββ Service/ # Bridge, Query, Domain, Command
βββ views/ # admin templates and translations