icamys/php-sitemap-generator

Simple PHP sitemap generator.

5.0.0 2023-10-23 20:29 UTC

README

CI status codecov.io Minimum PHP Version Latest Stable Version Total Downloads

Library for sitemap generation and submission.

Features:

  • Follows sitemaps.org protocol
  • Supports alternative links for multi-language pages (see google documentation)
  • Supports video and image sitemap generation
  • Low memory usage for any amount of URLs
  • Supports sitemap stylesheets

Installation with Composer:

composer require icamys/php-sitemap-generator

Survey

If you found this package useful, please take a short survey to improve your sitemap generation experience.

Usage

<?php

include "vendor/autoload.php";

$config = new \Icamys\SitemapGenerator\Config();

// Your site URL.
$config->setBaseURL('https://example.com');

// OPTIONAL. Setting the current working directory to be output directory
// for generated sitemaps (and, if needed, robots.txt)
// The output directory setting is optional and provided for demonstration purposes.
// The generator writes output to the current directory by default. 
$config->setSaveDirectory(sys_get_temp_dir());

// OPTIONAL. Setting a custom sitemap URL base in case if the sitemap files location
// is different from the website root. Most of the time this is unnecessary and can be skipped. 
$config->setSitemapIndexURL('https://example.com/sitemaps/');

$generator = new \Icamys\SitemapGenerator\SitemapGenerator($config);

// Create a compressed sitemap
$generator->enableCompression();

// Determine how many urls should be put into one file;
// this feature is useful in case if you have too large urls
// and your sitemap is out of allowed size (50Mb)
// according to the standard protocol 50000 urls per sitemap
// is the maximum allowed value (see http://www.sitemaps.org/protocol.html)
$generator->setMaxURLsPerSitemap(50000);

// Set the sitemap file name
$generator->setSitemapFileName("sitemap.xml");

// Set the sitemap index file name
$generator->setSitemapIndexFileName("sitemap-index.xml");

// Add alternate languages if needed
$alternates = [
    ['hreflang' => 'de', 'href' => "http://www.example.com/de"],
    ['hreflang' => 'fr', 'href' => "http://www.example.com/fr"],
];

// Add url components: `path`, `lastmodified`, `changefreq`, `priority`, `alternates`
// Instead of storing all urls in the memory, the generator will flush sets of added urls
// to the temporary files created on your disk.
// The file format is 'sm-{index}-{timestamp}.xml'
$generator->addURL('/path/to/page/', new DateTime(), 'always', 0.5, $alternates);

// Optional: add sitemap stylesheet. Note that you need to create
// the file 'sitemap.xsl' beforehand on your own.
$generator->setSitemapStylesheet('sitemap.xsl');

// Flush all stored urls from memory to the disk and close all necessary tags.
$generator->flush();

// Move flushed files to their final location. Compress if the option is enabled.
$generator->finalize();

// Update robots.txt file in output directory or create a new one
$generator->updateRobots();

// Submit your sitemaps to Yandex.
$generator->submitSitemap();

Video sitemap example

To create video sitemap, pass the $extensions parameter to the addURL() method as follows:

<?php

// Initialize the generator
// ...

// Initialize variable with video tags
// For more see the official google documentation:
// https://developers.google.com/search/docs/advanced/sitemaps/video-sitemaps
$videoTags = [
    'thumbnail_loc' => 'http://www.example.com/thumbs/123.jpg',
    'title' => 'Grilling steaks for summer',
    'description' => 'Alkis shows you how to get perfectly done steaks every time',
    'content_loc' => 'http://streamserver.example.com/video123.mp4',
    'player_loc' => 'http://www.example.com/videoplayer.php?video=123',
    'duration' => 600,
    'expiration_date' => '2021-11-05T19:20:30+08:00',
    'rating' => 4.2,
    'view_count' => 12345,
    'publication_date' => '2007-11-05T19:20:30+08:00',
    'family_friendly' => 'yes',
    'restriction' => [
        'relationship' => 'allow',
        'value' => 'IE GB US CA',
    ],
    'platform' => [
        'relationship' => 'allow',
        'value' => 'web mobile',
    ],
    'price' => [
        [
            'currency' => 'EUR',
            'value' => 1.99,
            'type' => 'rent',
            'resolution' => 'hd',
        ]
    ],
    'requires_subscription' => 'yes',
    'uploader' => [
        'info' => 'https://example.com/users/grillymcgrillerson',
        'value' => 'GrillyMcGrillerson',
    ],
    'live' => 'no',
    'tag' => [
        "steak", "meat", "summer", "outdoor"
    ],
    'category' => 'baking',
];


$extensions = [
    'google_video' => $videoTags
];

$generator->addURL('/path/to/page/', null, null, null, null, $extensions);

// generate, flush, etc.
// ...

Image sitemap example

To create image sitemap, pass the $extensions parameter to the addURL() method as follows:

<?php

// Initialize the generator
// ...

// Initialize a variable with image tags.
// For more see the official google documentation:
// https://developers.google.com/search/docs/advanced/sitemaps/image-sitemaps
$imageTags = [
    'loc' => 'https://www.example.com/thumbs/123.jpg',
    'title' => 'Cat vs Cabbage',
    'caption' => 'A funny picture of a cat eating cabbage',
    'geo_location' => 'Lyon, France',
    'license' => 'https://example.com/image-license',
];

// Alternatively, if you need to pass multiple images per URL, use the format below.
// Maximum number of images per URL is 1000.
$imageTags = [
    [
        'loc' => 'https://www.example.com/thumbs/123.jpg',
        'title' => 'Cat vs Cabbage',
        'caption' => 'A funny picture of a cat eating cabbage',
        'geo_location' => 'Lyon, France',
        'license' => 'https://example.com/image-license',
    ],
    [
        'loc' => 'https://www.example.com/thumbs/456.jpg',
        'title' => 'Dog vs Carrot',
        'caption' => 'A funny picture of a dog eating carrot',
        'geo_location' => 'Lyon, France',
        'license' => 'https://example.com/image-license',
    ]
];

$extensions = [
    'google_image' => $imageTags
];

$generator->addURL('/path/to/page/', null, null, null, null, $extensions);

// generate, flush, etc.
// ...

Testing

Run tests with command:

$ ./vendor/bin/phpunit

Run code coverage:

$ XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-html ./coverage

Changelog

You can find full changelog on the releases page.

Todo

  • Remove $yahooAppId parameter.