some progress
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Book;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
|
||||
class SitemapController extends Controller
|
||||
{
|
||||
/**
|
||||
* Generate the XML sitemap.
|
||||
*/
|
||||
public function index(): Response
|
||||
{
|
||||
$urls = [];
|
||||
|
||||
// Static and index pages
|
||||
$urls[] = [URL::to('/'), now()];
|
||||
$urls[] = [URL::to('/about'), null];
|
||||
$urls[] = [URL::to('/privacy'), null];
|
||||
$urls[] = [URL::to('/terms'), null];
|
||||
$urls[] = [URL::to('/contact'), null];
|
||||
$urls[] = [URL::to('/books'), now()];
|
||||
$urls[] = [URL::to('/categories'), now()];
|
||||
|
||||
// Individual book pages
|
||||
Book::select(['slug', 'updated_at'])->orderBy('updated_at', 'desc')->chunk(500, function ($books) use (&$urls) {
|
||||
foreach ($books as $book) {
|
||||
$urls[] = [URL::to('/books/' . $book->slug), optional($book->updated_at)];
|
||||
}
|
||||
});
|
||||
|
||||
$xml = $this->buildXml($urls);
|
||||
|
||||
return response($xml, 200)->header('Content-Type', 'application/xml');
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a basic XML sitemap string.
|
||||
*
|
||||
* @param array<int, array{0:string,1:\DateTimeInterface|null}> $urls
|
||||
*/
|
||||
protected function buildXml(array $urls): string
|
||||
{
|
||||
$xmlHeader = '<?xml version="1.0" encoding="UTF-8"?>';
|
||||
$urlsetOpen = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
||||
$urlsetClose = '</urlset>';
|
||||
|
||||
$body = '';
|
||||
foreach ($urls as [$loc, $lastmod]) {
|
||||
$body .= "\n <url>\n";
|
||||
$body .= ' <loc>' . e($loc) . "</loc>\n";
|
||||
if ($lastmod) {
|
||||
$body .= ' <lastmod>' . $lastmod->format('c') . "</lastmod>\n";
|
||||
}
|
||||
$body .= " </url>";
|
||||
}
|
||||
|
||||
return $xmlHeader . "\n" . $urlsetOpen . $body . "\n" . $urlsetClose . "\n";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user