coderden / sitemap-generator
Sitemap generator with multi-file support and sitemap index
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/coderden/sitemap-generator
Requires
- php: ^8.1
- ext-dom: *
- ext-libxml: *
- ext-simplexml: *
README
A lightweight, framework-agnostic PHP package for generating sitemaps with multi-file support and sitemap index generation.
Features
- ✅ Generate single or multiple sitemap files
- ✅ Automatic sitemap index creation for large sites
- ✅ Create sitemaps from arrays or objects
- ✅ Framework-agnostic (works with any PHP project)
- ✅ No external dependencies
- ✅ URL validation and sanitization
- ✅ Configurable URL limits per file
- ✅ Support for all sitemap attributes (priority, changefreq, lastmod)
Installation
composer require coderden/sitemap-generator
Requirements
- PHP 8.1 or higher
- SimpleXML extension
- DOM extension
- libxml extension
Quick Start
Basic Usage
// Initialize generator $generator = new SitemapGenerator('/path/to/public', 'https://example.com'); // Create URL with attributes $url1 = new Url('https://example.com/page1'); $url1->setLastModification(new DateTime()) ->setChangeFrequency('weekly') ->setPriority(0.8); $url2 = new Url('https://example.com/page2'); $url2->setLastModification(new DateTime('-1 week')) ->setChangeFrequency('daily') ->setPriority(1.0); // Add URLs to generator $generator->addUrl($url1) ->addUrl($url2); // Generate sitemap $generatedFiles = $generator->generate(); echo "Generated files: " . implode(', ', $generatedFiles);
Generate from Array
$urls = [ [ 'loc' => 'https://example.com/page1', 'lastmod' => '2024-01-15', 'changefreq' => 'weekly', 'priority' => 0.8, ], [ 'loc' => 'https://example.com/page2', 'lastmod' => new DateTime(), 'priority' => 1.0, ], ]; $generator = SitemapGenerator::createFromArray( $urls, '/path/to/public', 'https://example.com', 1000 // URLs per file (optional, default: 50000) ); $files = $generator->generate();
Advanced Usage
Multi-File Sitemap with Index
When you have more URLs than the specified limit, the package automatically splits them into multiple files and creates a sitemap index:
$generator = new SitemapGenerator('/path/to/public', 'https://example.com'); // Set custom file name prefix $generator->setFileNamePrefix('my-sitemap'); // Set custom limit (default: 50000) $generator = new SitemapGenerator('/path/to/public', 'https://example.com', 1000); // Add 1500 URLs for ($i = 1; $i <= 1500; $i++) { $url = new Url("https://example.com/page{$i}"); $generator->addUrl($url); } // Generates: // - my-sitemap-1.xml (1000 URLs) // - my-sitemap-2.xml (500 URLs) // - my-sitemap-index.xml (links to both files) $files = $generator->generate();
Sitemap Index Generator (Manual)
For more control over sitemap index creation:
$indexGenerator = new SitemapIndexGenerator('/path/to/public', 'https://example.com'); $indexGenerator->addSitemap('sitemap-pages.xml', new DateTime()) ->addSitemap('sitemap-posts.xml', new DateTime('-1 day')) ->addSitemap('https://cdn.example.com/sitemap-images.xml', new DateTime()); $indexFile = $indexGenerator->generate('custom-index.xml');
Configuration Options
| Option | Description | Default |
|---|---|---|
maxUrlsPerFile |
Maximum URLs per sitemap file | 50000 |
fileNamePrefix |
Prefix for generated sitemap files | sitemap |
outputDirectory |
Directory to save sitemap files | Required |
baseUrl |
Base URL for sitemap links | Required |
Integration Examples
With Laravel (Optional)
namespace App\Services; use Coderden\SitemapGenerator\SitemapGenerator; use Coderden\SitemapGenerator\Url; use App\Models\Post; use App\Models\Page; class SitemapService { public function generate() { $generator = new SitemapGenerator( public_path(), config('app.url'), 1000 ); // Add static pages $generator->addUrl( (new Url(route('home'))) ->setLastModification(now()) ->setChangeFrequency('daily') ->setPriority(1.0) ); // Add dynamic content Post::published()->chunk(100, function ($posts) use ($generator) { foreach ($posts as $post) { $generator->addUrl( (new Url(route('posts.show', $post))) ->setLastModification($post->updated_at) ->setChangeFrequency('weekly') ->setPriority(0.7) ); } }); return $generator->generate(); } }
With WordPress
<?php // functions.php or custom plugin add_action('init', function() { if (isset($_GET['generate_sitemap'])) { require_once __DIR__ . '/vendor/autoload.php'; $generator = new \Coderden\SitemapGenerator\SitemapGenerator( ABSPATH, get_site_url(), 1000 ); // Add homepage $generator->addUrl( (new \Coderden\SitemapGenerator\Url(get_home_url())) ->setChangeFrequency('daily') ->setPriority(1.0) ); // Add posts $posts = get_posts(['numberposts' => -1, 'post_status' => 'publish']); foreach ($posts as $post) { $generator->addUrl( (new \Coderden\SitemapGenerator\Url(get_permalink($post))) ->setLastModification(new DateTime($post->post_modified)) ->setChangeFrequency('weekly') ->setPriority(0.7) ); } $generator->generate(); exit; } });
Error Handling
<?php try { $generator = new SitemapGenerator('/invalid/path', 'https://example.com'); $generator->generate(); } catch (\RuntimeException $e) { echo "Error: " . $e->getMessage(); } catch (\InvalidArgumentException $e) { echo "Validation error: " . $e->getMessage(); }