add xml sitemap

master
Ondřej Hruška 6 years ago
parent 1d38f51a3a
commit 41d4eac09f
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 125
      app/Http/Controllers/SitemapController.php
  2. 2
      routes/web.php

@ -0,0 +1,125 @@
<?php
namespace App\Http\Controllers;
use App\Models\Table;
use App\Models\User;
use XMLWriter;
class SitemapController extends Controller
{
public function sitemap()
{
ob_end_clean();
// Redirect output to a client’s web browser
header("Content-Type: text/xml; charset=utf-8");
// Cache headers
header('Cache-Control: max-age=0');
// IE9
header('Cache-Control: max-age=1');
// Other IE headers
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: no-cache'); // HTTP/1.0
$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'UTF-8');
$xmlWriter->setIndent(true);
{
$xmlWriter->startElement('urlset');
{
$xmlWriter->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
foreach ($this->iterateTables() as $entry) {
$xmlWriter->startElement('url');
$xmlWriter->writeElement('loc', $entry->url);
if (isset($entry->priority)) {
$xmlWriter->writeElement('priority', $entry->priority);
}
if (isset($entry->changefreq)) {
$xmlWriter->writeElement('changefreq', $entry->changefreq);
}
if (isset($entry->lastmodified)) {
$xmlWriter->writeElement('lastmod', $entry->lastmodified->format(\DateTime::W3C));
}
$xmlWriter->endElement();
}
}
$xmlWriter->endElement();
}
$xmlWriter->endDocument();
}
private function iterateTables()
{
$prio_info = .9;
$prio_user = .8;
$prio_table = .6;
$prio_table_rev = .5;
$prio_misc = .5;
yield (object)[
'url' => route('dash'),
'priority' => 1,
];
yield (object)[
'url' => route('terms'),
'priority' => $prio_info,
];
yield (object)[
'url' => route('faq'),
'priority' => $prio_info,
];
yield (object)[
'url' => route('donate'),
'priority' => $prio_info,
];
yield (object)[
'url' => route('privacy'),
'priority' => $prio_info,
];
yield (object)[
'url' => route('login'),
'priority' => $prio_misc,
];
yield (object)[
'url' => route('register'),
'priority' => $prio_misc,
];
foreach (User::all() as $user) {
yield (object)[
'url' => route('profile.view', $user->name),
'lastmodified' => $user->updated_at,
'priority' => $prio_user,
];
}
foreach (Table::all() as $table) {
yield (object)[
'url' => $table->viewRoute,
'lastmodified' => $table->updated_at,
'priority' => $prio_table,
];
yield (object)[
'url' => $table->revisionsRoute,
'lastmodified' => $table->updated_at,
'priority' => $prio_table_rev,
];
}
}
}

@ -3,6 +3,8 @@
require "login.php";
Route::get('/sitemap', 'SitemapController@sitemap')->name('sitemap');
Route::get('/ping', function () {
die(
json_encode([

Loading…
Cancel
Save