Provider for XML-Sitemap

SitemapProvider are used to load data for the XML-Sitemap. It returns an array of SitemapUrl instances. This Api has to be paginated because Google only allows 50000 urls in a single Sitemap. The SitemapController takes care of generating a sitemapindex if more than one Provider or more than one pages are available. Otherwise it will deliver a the Sitemap of the first Provider.

The SitemapUrl consists of the following properties:

  • loc - Url to page.
  • lastmod (optional) - Latest modification datetime.
  • changefreq (optional) - Frequency of change (see SitemapUrl::CHANGE_FREQUENCY_* constants)
  • priority (optional) - Priority of page in relation to other pages.
  • alternateLinks (optional) - Alternate links like other representations or translations

The Sulu core provides a single Provider for pages (including homepage). Custom modules can provide their own Providers that this URLs also will be published over the sitemap.xml.

Example

This is a simple example which assumes that the logic to load entities is implemented in the Respository.

namespace AppBundle\Sitemap;

use AppBundle\Entity\ExampleRepository;
use Sulu\Bundle\WebsiteBundle\Sitemap\Sitemap;
use Sulu\Bundle\WebsiteBundle\Sitemap\SitemapProviderInterface;
use Sulu\Bundle\WebsiteBundle\Sitemap\SitemapUrl;

class SitemapProvider implements SitemapProviderInterface
{
    /**
     * @var ExampleRepository
     */
    private $repository;

    /**
     * @param ExampleRepository $repository
     */
    public function __construct(ExampleRepository $repository)
    {
        $this->repository = $repository;
    }

    /**
     * {@inheritdoc}
     */
    public function build($page, $portalKey, $locale)
    {
        $result = [];
        foreach ($this->repository->findAllForSitemap($page, self::PAGE_SIZE) as $item) {
            $result[] = new SitemapUrl($item->getRoute()->getPath(), $item->getChanged());
        }

        return $result;
    }

    /**
     * {@inheritdoc}
     */
    public function createSitemap($alias)
    {
        return new Sitemap($alias, $this->getMaxPage());
    }

    /**
     * {@inheritdoc}
     */
    public function getMaxPage()
    {
        return ceil($this->repository->countForSitemap() / self::PAGE_SIZE);
    }
}

Now you can create a service for this class and add the tag <tag name=”sulu.sitemap.provider” alias=”{your link-type}”/>.