Laravel 5.5 ile Dinamik XML Sitemap Yapımı

5366

http://example.test/sitemap URL'si çağrıldığında çalışacak sitemap.xml  dosyası yerine geçecek bir link oluşturacağız. Projenizin rotalarının bulunduğu web.php dosyasını açıp aşağıdaki satırı ekleyip kaydedin. Farklı sürümlerde routes.php  olarak adlandırılmış olabilir.



/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('sitemap', 'FrontController@sitemap')->name('sitemap');


web.php ya da routes.php dosyasına sitemap rotasını ekledikten sonra kaydediyoruz.

Projeniz için uygun olan controller dosyanızı siz belirleyin. Ben tüm Frontend rotaları için FrontController.php dosyasını kullanıyorum. Siz de uygun controller dosyasını açın ve aşağıdaki public function sitemap fonksiyonunu controller dosyanıza ekleyin. Extra olarak Carbon paketi kullandım. Zaman ve tarih işlemlerinde işime yarıyor.


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Database\Query\Builder;
use App\Post;
use Carbon\Carbon;


class FrontController extends Controller
{
    public function sitemap(){
        $posts = Post::Where('status', '=', 1)->orderBy('updated_at', 'DESC')->get();
        $now = Carbon::now()->toAtomString();
        $content = view('front.sitemap', compact('posts','now'));
        return response($content)->header('Content-Type', 'application/xml');
    }
}


Controller dosyamızda gerekli düzenlemeleri yaptıktan sonra sitemap.xml'in yerini alacak bir blade şablonu oluşturalım. sitemap.blade.php dosyanızı oluşturmak için aşağıdaki örnek kodu inceleyebilirsiniz. Post modelinden gelen verileri foreache aldım böylelikle http://example.test/sitemap adresi ziyaret edildiği anda sitemde bulunan tüm blog yazılarım oluşmuş oluyor. Sayfanın çıktısını http://umutyerebakmaz.com/sitemap adresinden inceleyebilirsiniz. Google Search Console kullanıyorsanız hesabınızı açıp  oluşturduğunuz  URL  parametresini bir kez girmeniz yeterli olacaktır. 

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

<url>
<loc>{{ url('/') }}</loc>
<lastmod>{{ $now }}</lastmod>
<changefreq>Daily</changefreq>
<priority>0.8</priority>
</url>

@foreach($posts as $post)
<url>
<loc>{{ url('/blog/').'/'.$post->category->slug.'/'.$post->slug }}</loc>
<lastmod>{{ $post->created_at->toAtomString() }}</lastmod>
<changefreq>Daily</changefreq>
<priority>0.8</priority>
</url>
@endforeach
</urlset>