in-square / pimcore-sitemap-bundle
Static XML sitemap generator for Pimcore (Documents + DataObjects).
Installs: 2
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:pimcore-bundle
pkg:composer/in-square/pimcore-sitemap-bundle
Requires
- php: ^8.1
- elements/process-manager-bundle: ^5.0
- pimcore/pimcore: ^11.0
- symfony/console: ^6.4
- symfony/framework-bundle: ^6.4
- symfony/messenger: ^6.4
- symfony/routing: ^6.4
This package is not auto-updated.
Last update: 2025-12-30 14:35:45 UTC
README
Static XML sitemap generator for Pimcore (Documents + DataObjects) with multi-site and multi-locale support.
Requirements
- PHP 8.1+
- Pimcore 11 / Symfony 6.4
- Symfony Messenger (for queue processing)
- Elements Process Manager (commands integrate with Process Manager)
Installation
composer require in-square/pimcore-sitemap-bundle
Enable the bundle in config/bundles.php:
return [ InSquare\PimcoreSitemapBundle\InSquarePimcoreSitemapBundle::class => ['all' => true], ];
Configuration
Create config/packages/in_square_pimcore_sitemap.yaml:
in_square_pimcore_sitemap: sites: - id: 0 host: 'example.com' languages: ['pl'] objects: - 'Pimcore\Model\DataObject\Post' - 'Pimcore\Model\DataObject\PostCategory' - id: 1 host: 'example.org' languages: ['pl', 'en'] objects: - 'Pimcore\Model\DataObject\Product' object_generators: post: 'App\\Sitemap\\PostGenerator' postCategory: 'App\\Sitemap\\PostCategoryGenerator' product: 'App\\Sitemap\\ProductGenerator' output: dir: '%kernel.project_dir%/public/sitemap' max_urls_per_file: 50000
Notes:
sites[*].objectsdefines DataObject classes to collect for each site.object_generatorskeys must matchObjectGeneratorInterface::getId(); keys are used in sitemap filenames.
Commands
bin/console insquare:sitemap:install– createsitemap_itemtable.bin/console insquare:sitemap:collect– dispatch sitemap messages to Messenger.bin/console insquare:sitemap:dump– generate XML files from database.bin/console insquare:sitemap:delete– delete XML files and truncate the table.
Add routing for Messenger in config/packages/framework.yaml:
framework: messenger: routing: 'InSquare\PimcoreSitemapBundle\Message\SitemapItemCreateMessage': async
Run Messenger worker for the queue:
bin/console messenger:consume async
Controller
The bundle exposes /sitemap.xml. The controller selects the correct site and serves the
pre-generated file from public/sitemap/sitemap.{siteId}.xml.
Object generators
Implement InSquare\PimcoreSitemapBundle\Generator\ObjectGeneratorInterface in your app:
<?php declare(strict_types=1); namespace App\Sitemap; use InSquare\PimcoreSitemapBundle\Generator\ObjectGeneratorInterface; use InSquare\PimcoreSitemapBundle\Generator\SitemapItemData; use Pimcore\Model\DataObject\Post; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; final class PostGenerator implements ObjectGeneratorInterface { public function getId(): string { return 'post'; } public function getObjectClass(): string { return Post::class; } public function buildItem(object $object, int $siteId, string $locale): ?SitemapItemData { if (!$object instanceof Post) { return null; } if (!$object->isPublished()) { return null; } $linkGenerator = $object->getClass()?->getLinkGenerator(); if ($linkGenerator === null) { return null; } $url = $linkGenerator->generate($object, [ 'locale' => $locale, 'siteId' => $siteId, 'referenceType' => UrlGeneratorInterface::ABSOLUTE_URL, ]); $lastmod = (new \DateTimeImmutable())->setTimestamp($object->getModificationDate()); return new SitemapItemData( $object->getId(), $object::class, $url, $lastmod ); } }
The generator returns a SitemapItemData DTO used to persist rows in sitemap_item.