icamys / php-sitemap-generator

A simple PHP sitemap generator.
MIT License
168 stars 65 forks source link

PHP Sitemap Generator

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

Library for sitemap generation and submission.

Features:

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