Hootan Alghaspour
خواندن ۲ دقیقه·۴ روز پیش

ساخت sitemap.xml با لاراول

در ابتدا spatie/laravel-sitemap را با composer نصب می کنیم.

composer require spatie/laravel-sitemap

سپس فایل تنظیماتش را منتشر می کنیم که البته خیلی لازم نیست، برای من تاکنون پیش نیامده تغییراتی در تنظیمات پیش فرض اش بدهم.

php artisan vendor:publish --provider=&quotSpatie\Sitemap\SitemapServiceProvider&quot --tag=sitemap-config

دستور بالا یک فایل در config/sitemap.php ایجاد می کند که می توانید تنظیمات را از داخل آن تغییر دهد. تنها مورد تنظیمات کاربردی شاید execute_javascript باشد که میتواند لینک هایی که به صورت دینامیک در صفحه با جاوا اسکریپت ساخته می شوند را نیز کراول کند.

با توجه به اینکه عملیاتی است که طول می کشد و پشت کلودفلر باشید به timeout خواهید خورد و همچنین اینکه ممکنه بخواهیم به صورت cron job استفاده کنیم به دستور artisan تبدیلش می کنیم. کلاً برای اینجور موارد تبدیل به دستور artisan و اجرا در خط فرمان بهتر است.

php artisan make:command GenerateSitemap

دستور بالا یک فایل در app/Console/Commands/GenerateSitemap.php میسازد که می توانید برنامه ای که می خواهید با دستور GenerateSitemap اجرا شود را در آن بنویسید.

برای اینکه با crawler خودش به صورت خودکار شروع کند برای یک دامنه sitemap.xml بسازد می توان از این کد استفاده کرد.

<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Spatie\Sitemap\SitemapGenerator; use Spatie\Sitemap\Tags\Url; use Illuminate\Support\Facades\Http; class GenerateSitemap extends Command{ protected $signature = 'sitemap:generate'; protected $description = 'Generate sitemap'; public function handle(){ config(['app.url' => 'http://example.com']); $path = public_path('sitemap.xml'); SitemapGenerator::create('http://example.com')->writeToFile($path); } }
دقت بفرمایید در اینجا چون اپلیکیشن من یک سیستم مونولیت روی یک سرور و پشت کلودفلر است قبل از اجرا app.url را به http تغییر می دهم زیرا روی این دامنه گواهینامه معتبر ssl نصب نیست و روی همین سرور دستور را اجرا می کنم و dns آن برای این دامنه همین IP را بر می گرداند و ترجیحم هم این است با http سریعتر crawl کند و با https به مشکل می خورد و ... ، برای سناریو شما شاید نیازی به تغییر app.url نباشد.

بعد که sitemap.xml ساخته شد داخل آن همه http ها را با https به روش find & replace عوض می کنم.

روی سناریوی من این روش کار کرد، کلاً برای اجر باید با dd(Http::get(config('app.url'))->status()) پاسخ ۲۰۰ بگیرید تا درست کار کند.

برای حدود ۹۰۰۰ لینک حدود یک ساعت طول کشید تا sitemap.xml ساخته شود. cpu زیادی هم اشغال می کند و بهتر است اگر روی همان سرور اجرا می کنید در زمان خلوتی اجرا بفرمایید.

می توانید برای هر Model یا Url های دلخواه هم sitemap بسازید و اینطوری خودش crawl نکند و خودکار بسازد.


من دیگر شرح بیشتری لازم نیست اینجا بدهم و برای جزییات بیشتر به مقالات دیگر ارجاع می دهم که بهتر و کامل تر هم توضیح داده اند.

Automatically generate a sitemap in Laravel

Mastering Laravel Sitemap: A Comprehensive Tutorial

Generate sitemaps with ease



هوتن القاس پور
شاید از این پست‌ها خوشتان بیاید