Back to the installation instructions, you may have noticed that this bundle is declaring routes:
/sitemap.xml
and /sitemap.{section}.xml
.
That means that, whenever the sitemap is requested, it is built on demand.
For small sites, it is fast enough to be a good option. But as your site grows (and so your sitemap), this option starts being a very bad one.
So, there is another option: saving your sitemap as an XML file in the public directory, so your HTTP server will serve it directly without asking the app to build it.
This is called a sitemap dump.
Important note: For this method to work, you will have to configure your router to be able to generate absolute URL from the command line. Have a look to the configuration.
Command accepts a single argument which is the folder where to dump sitemaps to.
It defaults to public
, since most of the people keep the sitemaps in the root of their sites.
The command always creates sitemap.xml
file as sitemaps index.
Other files are named according to section names you registered.
$ bin/console presta:sitemaps:dump
Dumping all sections of sitemaps into public directory
Created the following sitemap files
main.xml
main_0.xml
sitemap.xml
Note: Default directory can also be configured in the bundle configuration.
# config/packages/presta_sitemap.yaml presta_sitemap: dump_directory: some/dir
Command first creates all sitemap files in a temporary location. Once all of the files are created, it deletes matching (by section names) files from your target directory and copies newly prepared files in place. This happens in almost atomic way. In case anything went wrong during sitemap generation your existing sitemap files will be untouched.
Dumper command can also be used to regenerate just a part of the sitemap.
In order to do that you have to supply --section=name
option to the command.
It will regenerate only sections with that name and update corresponding part of sitemap index file,
leaving other sitemap references intact.
If you wish to use this feature, you must wrap all your custom url registering with a condition about the section being dumped.
For example:
<?php
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
use Presta\SitemapBundle\Sitemap\Url as Sitemap;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/** @var SitemapPopulateEvent $event */
/** @var UrlGeneratorInterface $urlGenerator */
if (in_array($event->getSection(), [null, 'mysection'], true)) {
$event->getUrlContainer()->addUrl(
new Sitemap\UrlConcrete($urlGenerator->generate('route_in_my_section', [], UrlGeneratorInterface::ABSOLUTE_URL)),
'mysection'
);
}
You can override Symfony's routing context host if you need to generate several sitemaps with different hosts.
For example:
$ bin/console presta:sitemaps:dump public/sitemap/es/ --base-url=http://es.mysite.com/
Dumping all sections of sitemaps into public/sitemap/es/ directory
Created the following sitemap files
main.xml
main_0.xml
sitemap.xml
The command supports gzip
compression:
$ bin/console presta:sitemaps:dump --gzip
Dumping all sections of sitemaps into public directory
Created/Updated the following sitemap files:
sitemap.default.xml.gz
sitemap.image.xml.gz
[...]
sitemap.xml
See more about compression in sitemaps protocol.