Ma méthode pour générer un sitemap sur Laravel
Un sitemap est un fichier au format XML, RSS ou TXT qui recense les pages web d'un site. Les moteurs de recherche utilisent ce fichier pour parcourir un site de manière plus efficace. Des informations complémentaires comme la date de mise à jour d'une page peuvent être indiquées, pour "recommander" aux moteurs de recherche de retourner explorer les pages récemment modifiées. Je mets le mot recommandé entre guillemets, car les robots n’en font parfois qu'à leur tête. Bien que pas obligatoire pour améliorer son SEO, il est quand même recommandé d'avoir un sitemap pour guider les robots de crawl.
Dans cet article, je vous propose de découvrir ma méthode pour générer un sitemap sur Laravel.
Est-ce la meilleure méthode pour générer un sitemap sur un projet Laravel ?
Comme souvent en programmation, il existe un tas de solutions pour résoudre une même problématique. Il existe des plugins qui permettent de générer "automatiquement" un sitemap avec un peu de configuration dans les modèles. Je pense notamment au plugin spatie/laravel-sitemap.
Pour ma part, j'ai fait le choix de gérer le sitemap plus manuellement, pour garder un maximum de souplesse et pouvoir mixer facilement les pages basées sur un élément en base de données et les pages statiques du projet.
Création d'une commande Laravel pour générer un sitemap
Par définition, un sitemap est amené à évoluer au fil du temps par l'ajout, la modification ou encore la suppression de contenu (articles, produits, page, etc.).
Il me parait donc judicieux de créer une commande pour cette tâche, qui pourra être lancée à intervalle régulier grâce à la programmation de tâche Laravel.
php artisan make:command GenerateSitemap
Dans le fichier app/Console/Commands/GenerateSitemap.php
, n'oubliez pas de préciser la variable $signature
pour pouvoir exécuter la commande. Par exemple : sitemap:generate
Ainsi, vous n'aurez plus qu'à lancer la commande suivante pour générer votre sitemap.
php artisan sitemap:generate
Utilisation du package samdark/sitemap
Pour créer le sitemap, j'ai choisi d'utiliser le package samdark/sitemap, qui propose toutes les fonctions et paramètres utiles à la création d'un sitemap au format XML.
Pour installer le package :
composer require samdark/sitemap
Tout est désormais prêt pour créer un sitemap !
Générer un sitemap
Dans le fichier GenerateSitemap.php
précédemment créé, il est maintenant temps d'agrémenter la fonction handle()
, qui s'exécutera au lancement de la commande.
Le code se divise en 4 parties :
- Instanciation de la classe Sitemap du package samdark/sitemap
- Ajout des URLs fixes
- Ajout des URLs générées à partir de votre BDD : articles, produits, profils utilisateurs, etc.
- Enregistrement du sitemap
use samdark\sitemap\Sitemap;
public function handle() {
// Création du sitemap à la racine du site
$sitemap = new Sitemap(public_path('sitemap.xml'));
// Ajouter les URLs fixe
$sitemap->addItem(route('page.a'));
$sitemap->addItem(route('page.b'));
// Ajouter les URLs générées à partir de la base de données
$articles = Article::getAll();
foreach ($articles as $article) {
$road = route('articles.show', $article->slug);
$sitemap->addItem($road, $article->updated_at->timestamp);
}
// Ecriture du sitemap
$sitemap->write();
$this->info('Sitemap créé avec succès !');
return true;
}
Exécutez la commande pour générer le sitemap. Si tout c'est bien passé, votre sitemap devrait-être accessible à l'adresse /sitemap.xml.
Pour les sitemaps volumineux
Si votre site contient un grand nombre d'URL, vous devriez peut-être réfléchir à scinder votre sitemap.
Un sitemap peut contenir au maximum 50 000 URL pour un poids de 50 Mo (sitemaps non compressé). Avant même d'atteindre ces volumes de liens, c'est une pratique courante de regrouper les URLs entres-elles.
Si vous avez plusieurs sitemaps, il vous faudra un sitemap index, qui référencera les URLs des autres sitemaps pour que Google et les autres moteurs de recherche puissent s'y retrouver.
Rassurez-vous, le package installé précédemment gère ça à merveille.
Voilà le code que j'utilise lorsque je veux créer plusieurs sitemaps :
public function handle() {
// Créations des sitemaps annexes
$urls = [];
$urls = array_merge($urls, $this->Blog());
$urls = array_merge($urls, $this->Products());
// Création du sitemap index
$index = new Index(public_path('sitemap.xml'));
foreach ($urls as $url) {
$index->addSitemap(url($url));
}
$index->write();
$this->info('Sitemap created !');
return true;
}
private function Blog(): array {
$sitemap = new Sitemap(public_path('sitemap-blog.xml'));
$articles = Article::getAll();
foreach ($articles as $article) {
$road = route('articles.show', $article->slug);
$sitemap->addItem($road, $article->updated_at->timestamp);
}
$sitemap->write();
$this->info('Sitemap of blog created.');
return $sitemap->getSitemapUrls('');
}
private function Products(): array {
$sitemap = new Sitemap(public_path('sitemap-products.xml'));
$landings = Product::getAll();
foreach ($products as $product) {
$road = route('products.show', $product->slug);
$sitemap->addItem($road, $product->updated_at->timestamp);
}
$sitemap->write();
$this->info('Sitemap of products created.');
return $sitemap->getSitemapUrls('');
}
Programmer la génération du sitemap
Il ne reste plus qu'à programmer la génération de votre sitemap.
Si vous souhaitez générer le sitemap toutes les 6h par exemple, ça se passe dans le fichier app/Console/Kernel.php.
Ajoutez :
protected function schedule(Schedule $schedule) {
$schedule->command('sitemap:generate')->everySixHours();
}
N'oubliez pas d'ajouter la commande nécessaire au fonctionnement du planificateur de tâche dans le cron de votre serveur :
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Vous pouvez également lancer la génération du sitemap après l'enregistrement ou la mise à jour d'une donnée, en appelant la commande précédemment créée.
use Illuminate\Support\Facades\Artisan;
Artisan::call('sitemap:generate');
À vous d'organiser ensuite votre code, avec les events de Laravel par exemple.
Besoin d'aide pour votre projet Web ?
- Création de sites internet
- Référencement naturel (SEO)
- Développement d'application Web
- Développeur Laravel / VueJS
