MoonShine MoonShine
EN
← All plugins

Manager Seo

Made by the authors of MoonShine

Laravel SEO By URL - это пакет для управления SEO-метаданными в Laravel 9+ и PHP 8+, который позволяет легко сохранять и управлять SEO-информацией (заголовки, описания, ключевые слова, og-теги) для страниц сайта на основе их URL, с поддержкой кэширования и интеграцией с MoonShine админ-панелью.

Rating
Downloads
4562
Version
1.2.0
Last updated
31.12.2024
MoonShine version
v2
Github stars
19
Danil Shutsky
Author
Danil Shutsky

Laravel 9+ PHP 8+

Prolog

Seo data is stored in the database in the seo table and is linked to pages based on the url, the url is unique for websites, therefore, the seo in this package is built from it

  • Easy to use
  • Not tied to entities
  • All data is cached relative to url and reset by events on the model

Installation

composer require lee-to/laravel-seo-by-url
composer require lee-to/laravel-seo-by-url

Publish config

php artisan vendor:publish --provider="Leeto\Seo\Providers\SeoServiceProvider"
php artisan vendor:publish --provider="Leeto\Seo\Providers\SeoServiceProvider"
php artisan migrate
php artisan migrate

Are you a visual learner?

We've recorded a video on how to use this package. It's the best way to get started using media library

MoonShine

if you use the MoonShine, then publish the resource with this command

php artisan seo:moonshine
php artisan seo:moonshine

Get started

For starters, you can choose the best usage approach for you:

  • Facade
use Leeto\Seo\Seo;
 
// ...
 
Seo::title('Hello world')
use Leeto\Seo\Seo;
 
// ...
 
Seo::title('Hello world')
  • Helper
seo()->title('Hello world')
seo()->title('Hello world')
  • DI
use Leeto\Seo\SeoManager;
 
// ...
 
public function __invoke(SeoManager $seo)
{
//
}
use Leeto\Seo\SeoManager;
 
// ...
 
public function __invoke(SeoManager $seo)
{
//
}
  • Ok I prefer to use the helper

Blade directives

Render meta tags

title, descriptions, keywords, og

<html>
<head>
<!-- // ... -->
 
@seo
 
<!-- // ... -->
</head>
<html>
<head>
<!-- // ... -->
 
@seo
 
<!-- // ... -->
</head>

Render seo text

<div>
@seoText('Default text')
</div>
<div>
@seoText('Default text')
</div>

Set and save seo data

  • set
seo()->title('Im page title')
seo()->title('Im page title')
  • set and save in database
seo()->title('Im page title', true)
seo()->title('Im page title', true)
  • other tags
seo()->description('Im page description')
seo()->keywords('Im page description')
seo()->text('Im page description')
seo()->og(['image' => 'link to image'])
seo()->description('Im page description')
seo()->keywords('Im page description')
seo()->text('Im page description')
seo()->og(['image' => 'link to image'])
  • get value
seo()->meta()->title()
seo()->meta()->description()
seo()->meta()->keywords()
seo()->meta()->text()
seo()->meta()->og()
seo()->meta()->title()
seo()->meta()->description()
seo()->meta()->keywords()
seo()->meta()->text()
seo()->meta()->og()
  • get html tags
seo()->meta()->html()
seo()->meta()->html()
  • save by model
use Leeto\Seo\Models\Seo;
 
Seo::create([
'url' => '/',
'title' => 'Im title'
]);
use Leeto\Seo\Models\Seo;
 
Seo::create([
'url' => '/',
'title' => 'Im title'
]);

Default values

Set in seo config config/seo.php

return [
'default' => [
'title' => 'Im title'
]
]);
return [
'default' => [
'title' => 'Im title'
]
]);

Inertia

Use Shared Data

class HandleInertiaRequests extends Middleware
{
//
public function share(Request $request)
{
return array_merge(parent::share($request), [
// ...
 
'seo' => [
'title' => seo()->meta()->title(),
'description' => seo()->meta()->description(),
'keywords' => seo()->meta()->keywords(),
'og' => seo()->meta()->og(),
'text' => seo()->meta()->text(),
]
]);
}
//
}
class HandleInertiaRequests extends Middleware
{
//
public function share(Request $request)
{
return array_merge(parent::share($request), [
// ...
 
'seo' => [
'title' => seo()->meta()->title(),
'description' => seo()->meta()->description(),
'keywords' => seo()->meta()->keywords(),
'og' => seo()->meta()->og(),
'text' => seo()->meta()->text(),
]
]);
}
//
}
import { Head } from '@inertiajs/vue3'
 
<Head>
<title>{{ $page.props.seo.title }}</title>
<meta name="description" :content="$page.props.seo.description">
</Head>
import { Head } from '@inertiajs/vue3'
 
<Head>
<title>{{ $page.props.seo.title }}</title>
<meta name="description" :content="$page.props.seo.description">
</Head>