From 712d2b2161371c4251c63df93b55e5b0dbbecae8 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Wed, 24 Jun 2026 19:20:33 +0200 Subject: [PATCH 1/2] SEO Time --- app/Console/Commands/GenerateSitemap.php | 71 ++++ app/Http/Controllers/Controller.php | 8 +- app/Http/Controllers/EntryController.php | 13 + app/Http/Controllers/HomeController.php | 3 + app/Http/Controllers/ModCPController.php | 6 + app/Http/Controllers/NewsController.php | 13 + app/Http/Controllers/QueueController.php | 2 + app/Http/Controllers/ReviewController.php | 2 + app/Http/Controllers/SubmissionController.php | 4 + app/Http/Controllers/ToolsController.php | 5 +- composer.json | 4 +- composer.lock | 356 +++++++++++++++++- config/seotools.php | 69 ++++ resources/views/layouts/app.blade.php | 2 +- 14 files changed, 553 insertions(+), 5 deletions(-) create mode 100644 app/Console/Commands/GenerateSitemap.php create mode 100644 config/seotools.php diff --git a/app/Console/Commands/GenerateSitemap.php b/app/Console/Commands/GenerateSitemap.php new file mode 100644 index 0000000..2d3692c --- /dev/null +++ b/app/Console/Commands/GenerateSitemap.php @@ -0,0 +1,71 @@ +add(Url::create('/')->setPriority(1.0)->setChangeFrequency(Url::CHANGE_FREQUENCY_DAILY)) + ->add(Url::create('/database')->setPriority(0.8)->setChangeFrequency(Url::CHANGE_FREQUENCY_DAILY)) + ->add(Url::create('/news')->setPriority(0.7)->setChangeFrequency(Url::CHANGE_FREQUENCY_DAILY)) + ->add(Url::create(route('tools.patcher'))->setPriority(0.2)->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY) ) + ->add(Url::create(route('tools.hash'))->setPriority(0.2)->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY) ) + ; + + Entry::cursor()->each(function (Entry $entry) use ($sitemap) { + + if (empty($entry->type) || empty($entry->slug)) { + return; + } + + try { + $url = route('entries.show', [ + 'section' => $entry->type, + 'entry' => $entry->slug + ]); + + $sitemap->add( + Url::create($url) + ->setLastModificationDate($entry->updated_at) + ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY) + ->setPriority(0.8) + ); + } catch (\Exception $e) { + logger()->error("Sitemap error for entry : {$entry->id}: " . $e->getMessage()); + } + }); + + News::cursor()->each(function (News $entry) use ($sitemap) { + + if (empty($entry->type) || empty($entry->slug)) { + return; + } + + try { + $url = route('news.show', ['news' => $entry]); + + $sitemap->add( + Url::create($url) + ->setLastModificationDate($entry->updated_at) + ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY) + ->setPriority(0.8) + ); + } catch (\Exception $e) { + logger()->error("Sitemap error for news : {$entry->id}: " . $e->getMessage()); + } + }); + + $sitemap->writeToFile(public_path('sitemap.xml')); + $this->info('Generated sitemap'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 8677cd5..ce00972 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,7 +2,13 @@ namespace App\Http\Controllers; +use Artesaos\SEOTools\Facades\SEOTools; + abstract class Controller { - // + protected function seoNoIndex(): void + { + SEOTools::metatags()->setRobots('noindex, nofollow'); + } + } diff --git a/app/Http/Controllers/EntryController.php b/app/Http/Controllers/EntryController.php index dcb5c84..8e00b7f 100644 --- a/app/Http/Controllers/EntryController.php +++ b/app/Http/Controllers/EntryController.php @@ -5,8 +5,11 @@ namespace App\Http\Controllers; use App\Helpers\EntryHelpers; use App\Models\Entry; use App\Models\News; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use Illuminate\View\View; class EntryController extends Controller @@ -16,6 +19,7 @@ class EntryController extends Controller public function index(): View { + SEOTools::setTitle('Database'); return view('entries.index'); } @@ -26,6 +30,7 @@ class EntryController extends Controller public function show(string $section, Entry $entry): View { + if (!in_array($section, self::SECTION_TYPES)) abort(404); @@ -52,6 +57,13 @@ class EntryController extends Controller $comments = EntryHelpers::getLatestComments($entry); $reviews = $entry->reviews()->orderBy('created_at', 'desc')->limit(10)->get(); + SEOTools::setTitle($entry->complete_title ?? $entry->title); + SEOTools::setDescription( Str::limit( $entry->description, 150) ); + SEOTools::opengraph()->addProperty('type', 'article'); + if( $entry->main_image ){ + SEOTools::opengraph()->addImage( url( Storage::url( $entry->main_image ) ) ); + } + return view('entries.show', compact('entry', 'section', 'comments', 'reviews')); } @@ -69,6 +81,7 @@ class EntryController extends Controller ->orderBy('updated_at', 'desc') ->paginate(20); + SEOTools::setTitle('My Drafts'); return view('entries.drafts', compact('drafts', 'newsDrafts')); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index eafa41e..a418497 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Models\Entry; use App\Services\ActivityService; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; use Illuminate\View\View; use App\Models\News; @@ -15,6 +16,8 @@ class HomeController extends Controller public function index( Request $request ): View { + SEOTools::setTitle('A Romhack community where you can share your creations with the world.'); + $filters = [ 'entries', 'news', 'messages', 'threads', 'clubs', 'reviews' ]; $cookie = $request->cookie('activity_filters'); diff --git a/app/Http/Controllers/ModCPController.php b/app/Http/Controllers/ModCPController.php index bf75df0..008d5a4 100644 --- a/app/Http/Controllers/ModCPController.php +++ b/app/Http/Controllers/ModCPController.php @@ -4,10 +4,16 @@ namespace App\Http\Controllers; use App\Jobs\RestoreXenForoCommentsThread; use App\Models\Entry; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; class ModCPController extends Controller { + public function __construct() + { + SEOTools::setTitle('ModCP'); + } + public function index() { $stats = [ diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php index 23bb429..52c2c42 100644 --- a/app/Http/Controllers/NewsController.php +++ b/app/Http/Controllers/NewsController.php @@ -11,14 +11,18 @@ use App\Http\Requests\StoreNewsRequest; use App\Jobs\DeleteXenForoCommentsThread; use App\Models\News; use App\Services\NewsService; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; class NewsController extends Controller { public function index() { + SEOTools::setTitle('News'); return view('news.index'); } @@ -43,6 +47,13 @@ class NewsController extends Controller $comments = EntryHelpers::getLatestComments($news); + SEOTools::setTitle($news->title); + SEOTools::setDescription( Str::limit( $news->description , 150 ) ); + SEOTools::opengraph()->addProperty('type', 'article'); + if( $news->gallery->first() ){ + SEOTools::opengraph()->addImage( url( Storage::url( $news->gallery->first()->image ) ) ); + } + return view('news.show', compact('news', 'comments')); } @@ -54,6 +65,7 @@ class NewsController extends Controller 'oldCategory' => old('category') ? [ old('category') ] : [] ]; + SEOTools::setTitle('Submit News'); return view ('news.create', $data); } @@ -65,6 +77,7 @@ class NewsController extends Controller 'oldCategory' => old('category', $news->category_id) ? [ old('category', $news->category_id) ] : [] ]; + SEOTools::setTitle('Edit News'); return view ('news.edit', $data); } diff --git a/app/Http/Controllers/QueueController.php b/app/Http/Controllers/QueueController.php index 7b5d037..71da9a5 100644 --- a/app/Http/Controllers/QueueController.php +++ b/app/Http/Controllers/QueueController.php @@ -6,6 +6,7 @@ use App\Helpers\XenForoHelpers; use App\Models\Entry; use App\Models\News; use App\Services\XenforoService; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; class QueueController extends Controller { @@ -35,6 +36,7 @@ class QueueController extends Controller return $a->created_at <=> $b->created_at; })->values(); + SEOTools::setTitle('Submissions Queue'); return view('queue.index', compact('entries')); } diff --git a/app/Http/Controllers/ReviewController.php b/app/Http/Controllers/ReviewController.php index 7ee1898..2b8b47b 100644 --- a/app/Http/Controllers/ReviewController.php +++ b/app/Http/Controllers/ReviewController.php @@ -6,6 +6,7 @@ use App\Exceptions\SubmissionException; use App\Http\Requests\StoreReviewRequest; use App\Models\Entry; use App\Services\ReviewsService; +use Artesaos\SEOTools\SEOTools; use Illuminate\Http\Request; class ReviewController extends Controller @@ -15,6 +16,7 @@ class ReviewController extends Controller public function index(){ + SEOTools::setTitle('Reviews'); return view('reviews.index'); } diff --git a/app/Http/Controllers/SubmissionController.php b/app/Http/Controllers/SubmissionController.php index ebc7c4b..904a58d 100644 --- a/app/Http/Controllers/SubmissionController.php +++ b/app/Http/Controllers/SubmissionController.php @@ -22,6 +22,7 @@ use App\Models\Status; use App\Models\System; use App\Services\SubmissionsService; use App\Services\XenforoApiService; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Storage; @@ -86,6 +87,7 @@ class SubmissionController extends Controller 'border' => '#eed6c540', ] ]; + SEOTools::setTitle('Submit'); return view('submissions.index', compact('entryTypes')); } @@ -119,6 +121,7 @@ class SubmissionController extends Controller $data['levels'] = Level::orderBy('id')->get(); } + SEOTools::setTitle( $data['words']['page_title'] ); return view('submissions.create', $data); } @@ -156,6 +159,7 @@ class SubmissionController extends Controller $data['levels'] = Level::orderBy('id')->get(); } + SEOTools::setTitle( $data['words']['page_title'] ); return view('submissions.edit', $data); } diff --git a/app/Http/Controllers/ToolsController.php b/app/Http/Controllers/ToolsController.php index f1b5e9b..9a99404 100644 --- a/app/Http/Controllers/ToolsController.php +++ b/app/Http/Controllers/ToolsController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Models\Entry; use App\Models\EntryFile; use App\Services\FileServersService; +use Artesaos\SEOTools\Facades\SEOTools; use Illuminate\Http\Request; class ToolsController extends Controller @@ -31,7 +32,7 @@ class ToolsController extends Controller ]; - + SEOTools::setTitle('ROM Patcher'); return view('tools.patcher', compact('patches')); } @@ -59,11 +60,13 @@ class ToolsController extends Controller 'outputName' => $file->filename ]; + SEOTools::setTitle('Play online'); return view('tools.play', compact('patches', 'emuConfig')); } public function hasher( Request $request ) { + SEOTools::setTitle('Play online'); return view('tools.hasher'); } diff --git a/composer.json b/composer.json index 69a58be..a142f35 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "ext-pdo": "*", "ext-simplexml": "*", "ext-xmlreader": "*", + "artesaos/seotools": "^1.4", "diglactic/laravel-breadcrumbs": "^10.1", "filament/filament": "^5.6", "laravel/framework": "^13.7", @@ -18,7 +19,8 @@ "league/html-to-markdown": "^5.1", "livewire/livewire": "^4.3", "predis/predis": "^3.4", - "spatie/laravel-activitylog": "^5.0" + "spatie/laravel-activitylog": "^5.0", + "spatie/laravel-sitemap": "*" }, "require-dev": { "barryvdh/laravel-debugbar": "^4.2", diff --git a/composer.lock b/composer.lock index a4a2542..cf9bca2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,79 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ea9258b1759d46665d2487b066c686ee", + "content-hash": "6ebcacd70675cd6b17a9428bb0050a51", "packages": [ + { + "name": "artesaos/seotools", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/artesaos/seotools.git", + "reference": "c92d09f0ad4491181863850a3ab2e1534361409b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artesaos/seotools/zipball/c92d09f0ad4491181863850a3ab2e1534361409b", + "reference": "c92d09f0ad4491181863850a3ab2e1534361409b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/config": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^9.0 || ^10.0 || ^11.5.3" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "SEO": "Artesaos\\SEOTools\\Facades\\SEOTools", + "JsonLd": "Artesaos\\SEOTools\\Facades\\JsonLd", + "SEOMeta": "Artesaos\\SEOTools\\Facades\\SEOMeta", + "Twitter": "Artesaos\\SEOTools\\Facades\\TwitterCard", + "OpenGraph": "Artesaos\\SEOTools\\Facades\\OpenGraph" + }, + "providers": [ + "Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Artesaos\\SEOTools\\": "src/SEOTools/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Vinicius", + "email": "luiz.vinicius73@gmail.com" + } + ], + "description": "SEO Tools for Laravel and Lumen", + "keywords": [ + "JSON-LD", + "laravel", + "lumen", + "metatags", + "opengraph", + "seo", + "seotools", + "webmaster" + ], + "support": { + "issues": "https://github.com/artesaos/seotools/issues", + "source": "https://github.com/artesaos/seotools" + }, + "time": "2026-03-28T12:37:33+00:00" + }, { "name": "blade-ui-kit/blade-heroicons", "version": "2.7.0", @@ -5303,6 +5374,85 @@ ], "time": "2022-12-17T21:53:22+00:00" }, + { + "name": "spatie/crawler", + "version": "9.3.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/crawler.git", + "reference": "3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/crawler/zipball/3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e", + "reference": "3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.3", + "guzzlehttp/psr7": "^2.0", + "php": "^8.4", + "spatie/robots-txt": "^2.0", + "symfony/css-selector": "^7.0|^8.0", + "symfony/dom-crawler": "^7.0|^8.0" + }, + "require-dev": { + "pestphp/pest": "^4.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "spatie/invade": "^2.1", + "spatie/ray": "^1.37" + }, + "suggest": { + "spatie/browsershot": "Required for JavaScript rendering with BrowsershotRenderer (^5.0.5)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-v9": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Crawler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be" + } + ], + "description": "Crawl all internal links found on a website", + "homepage": "https://github.com/spatie/crawler", + "keywords": [ + "crawler", + "link", + "spatie", + "website" + ], + "support": { + "issues": "https://github.com/spatie/crawler/issues", + "source": "https://github.com/spatie/crawler/tree/9.3.2" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-06-12T15:45:15+00:00" + }, { "name": "spatie/invade", "version": "2.1.0", @@ -5516,6 +5666,140 @@ ], "time": "2026-02-21T12:49:54+00:00" }, + { + "name": "spatie/laravel-sitemap", + "version": "8.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-sitemap.git", + "reference": "51f52030ab22abf5e95ed037fea5f8073114e784" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-sitemap/zipball/51f52030ab22abf5e95ed037fea5f8073114e784", + "reference": "51f52030ab22abf5e95ed037fea5f8073114e784", + "shasum": "" + }, + "require": { + "illuminate/support": "^12.0|^13.0", + "nesbot/carbon": "^2.71|^3.0", + "php": "^8.4", + "spatie/crawler": "^9.0", + "spatie/laravel-package-tools": "^1.16.1" + }, + "require-dev": { + "larastan/larastan": "^3.0", + "laravel/pint": "^1.13", + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^4.0", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/temporary-directory": "^2.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Sitemap\\SitemapServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Sitemap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Create and generate sitemaps with ease", + "homepage": "https://github.com/spatie/laravel-sitemap", + "keywords": [ + "laravel-sitemap", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/laravel-sitemap/tree/8.2.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2026-06-24T07:59:14+00:00" + }, + { + "name": "spatie/robots-txt", + "version": "2.5.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/robots-txt.git", + "reference": "a8dd35d0a94e863f52509a366a634978e9c1db03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/robots-txt/zipball/a8dd35d0a94e863f52509a366a634978e9c1db03", + "reference": "a8dd35d0a94e863f52509a366a634978e9c1db03", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Robots\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Roose", + "email": "brent@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Determine if a page may be crawled from robots.txt and robots meta tags", + "homepage": "https://github.com/spatie/robots-txt", + "keywords": [ + "robots-txt", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/robots-txt/issues", + "source": "https://github.com/spatie/robots-txt/tree/2.5.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-25T07:59:20+00:00" + }, { "name": "spatie/shiki-php", "version": "2.4.0", @@ -5888,6 +6172,76 @@ ], "time": "2026-04-13T15:52:40+00:00" }, + { + "name": "symfony/dom-crawler", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/77ca351474ea018daba5f2e473cbf1b9b8e72ac6", + "reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "symfony/css-selector": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, { "name": "symfony/error-handler", "version": "v8.0.8", diff --git a/config/seotools.php b/config/seotools.php new file mode 100644 index 0000000..dfa5745 --- /dev/null +++ b/config/seotools.php @@ -0,0 +1,69 @@ + env('SEO_TOOLS_INERTIA', false), + 'meta' => [ + /* + * The default configurations to be used by the meta generator. + */ + 'defaults' => [ + 'title' => "Romhack Plaza", // set false to total remove + 'titleBefore' => false, // Put defaults.title before page title, like 'It's Over 9000! - Dashboard' + 'description' => 'A Romhack community where you can share your creations with the world.', // set false to total remove + 'separator' => ' - ', + 'keywords' => [], + 'canonical' => 'current', // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove + 'robots' => 'index, follow', // Set to 'all', 'none' or any combination of index/noindex and follow/nofollow + ], + /* + * Webmaster tags are always added. + */ + 'webmaster_tags' => [ + 'google' => null, + 'bing' => null, + 'alexa' => null, + 'pinterest' => null, + 'yandex' => null, + 'norton' => null, + ], + + 'add_notranslate_class' => false, + ], + 'opengraph' => [ + /* + * The default configurations to be used by the opengraph generator. + */ + 'defaults' => [ + 'title' => 'Romhack Plaza', // set false to total remove + 'description' => 'A Romhack community where you can share your creations with the world.', // set false to total remove + 'url' => null, // Set null for using Url::current(), set false to total remove + 'type' => 'website', + 'site_name' => 'Romhack Plaza', + 'images' => [ 'logo/plaza-logo.png' ], + ], + ], + 'twitter' => [ + /* + * The default values to be used by the twitter cards generator. + */ + 'defaults' => [ + 'card' => 'summary_large_image', + 'site' => '@romhackplaza' + ], + ], + 'json-ld' => [ + /* + * The default configurations to be used by the json-ld generator. + */ + 'defaults' => [ + 'title' => 'Romhack Plaza', // set false to total remove + 'description' => 'A Romhack community where you can share your creations with the world.', // set false to total remove + 'url' => 'current', // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove + 'type' => 'WebPage', + 'images' => [ 'logo/plaza-logo.png' ], + ], + ], +]; diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5bbc68c..79e2d1a 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -3,11 +3,11 @@ + {!! SEO::generate() !!} @include('meta') @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles @stack('styles') - @yield('page-title', 'Romhack Plaza') -- 2.39.5 From 0fae5bbcd76c8a2e878e7fd39677129fedac4001 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 25 Jun 2026 13:06:14 +0200 Subject: [PATCH 2/2] Fix commands --- app/Console/Commands/MigrateUsersExecute.php | 4 ++-- app/Services/XenforoApiService.php | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/Console/Commands/MigrateUsersExecute.php b/app/Console/Commands/MigrateUsersExecute.php index 6160e1d..e37f0ef 100644 --- a/app/Console/Commands/MigrateUsersExecute.php +++ b/app/Console/Commands/MigrateUsersExecute.php @@ -87,10 +87,10 @@ class MigrateUsersExecute extends Command ->leftJoin('usermeta as m2', fn( $j ) => $j->on('users.ID', '=', 'm2.user_id')->where('m2.meta_key', '=', 'wp_capabilities') ) ->leftJoin('usermeta as m3', fn( $j ) => $j->on('users.ID', '=', 'm3.user_id')->where('m3.meta_key', '=', 'simple_local_avatar') ) ->where('users.ID', '=', $plan->wp_user_id ) - ->select('m1.meta_value as description', 'm2.meta_value as capabilities', 'm3.meta_value as avatar_meta', 'users.user_url as website', 'users.user_pass as password', 'users.user_registred' ) + ->select('m1.meta_value as description', 'm2.meta_value as capabilities', 'm3.meta_value as avatar_meta', 'users.user_url as website', 'users.user_pass as password', 'users.user_registered' ) ->first(); - $infos['register_date'] = $wp->user_registred ? strtotime($wp->user_registred) : null; + $infos['register_date'] = $wp->user_registered ? strtotime($wp->user_registered) : null; $infos['profile']['about'] = $wp->description; $infos['profile']['website'] = $wp->website; $role = $this->extractWpRole($wp->capabilities); diff --git a/app/Services/XenforoApiService.php b/app/Services/XenforoApiService.php index 7de52ff..591d477 100644 --- a/app/Services/XenforoApiService.php +++ b/app/Services/XenforoApiService.php @@ -29,8 +29,10 @@ class XenforoApiService { 'XF-Api-User' => $customUserId ?? $this->superUserId, ])->get("{$this->apiUrl}/{$endpoint}"); - if( !$response->ok() ) + if( !$response->ok() ) { + \Illuminate\Support\Facades\Log::error("XF API error [{$response->status()}] on {$endpoint}: " . $response->body()); return null; + } return $response->json(); } @@ -42,8 +44,10 @@ class XenforoApiService { 'XF-Api-User' => $customUserId ?? $this->superUserId, ])->post("{$this->apiUrl}/{$endpoint}", $data); - if( !$response->ok() ) + if( !$response->ok() ) { + \Illuminate\Support\Facades\Log::error("XF API error [{$response->status()}] on {$endpoint}: " . $response->body()); return null; + } return $response->json(); } @@ -55,8 +59,10 @@ class XenforoApiService { 'XF-Api-User' => $customUserId ?? $this->superUserId, ])->delete("{$this->apiUrl}/{$endpoint}", $data); - if( !$response->ok() ) + if( !$response->ok() ) { + \Illuminate\Support\Facades\Log::error("XF API error [{$response->status()}] on {$endpoint}: " . $response->body()); return null; + } return $response->json(); } -- 2.39.5