Skip to main content
Back to packages
3,349 GitHub stars

artesaos/seotools

View on GitHub

Description

SEOTools is a package for Laravel 5.8+ and Lumen that provides helpers for some common SEO techniques

In your controller

<?php
 
namespace App\Http\Controllers;
 
use Artesaos\SEOTools\Facades\SEOMeta;
use Artesaos\SEOTools\Facades\OpenGraph;
use Artesaos\SEOTools\Facades\TwitterCard;
use Artesaos\SEOTools\Facades\JsonLd;
// OR with multi
use Artesaos\SEOTools\Facades\JsonLdMulti;
 
// OR
use Artesaos\SEOTools\Facades\SEOTools;
 
class CommonController extends Controller
{
public function index()
{
SEOMeta::setTitle('Home');
SEOMeta::setDescription('This is my page description');
SEOMeta::setCanonical('https://codecasts.com.br/lesson');
 
OpenGraph::setDescription('This is my page description');
OpenGraph::setTitle('Home');
OpenGraph::setUrl('http://current.url.com');
OpenGraph::addProperty('type', 'articles');
 
TwitterCard::setTitle('Homepage');
TwitterCard::setSite('@LuizVinicius73');
 
JsonLd::setTitle('Homepage');
JsonLd::setDescription('This is my page description');
JsonLd::addImage('https://codecasts.com.br/img/logo.jpg');
 
// OR
 
SEOTools::setTitle('Home');
SEOTools::setDescription('This is my page description');
SEOTools::opengraph()->setUrl('http://current.url.com');
SEOTools::setCanonical('https://codecasts.com.br/lesson');
SEOTools::opengraph()->addProperty('type', 'articles');
SEOTools::twitter()->setSite('@LuizVinicius73');
SEOTools::jsonLd()->addImage('https://codecasts.com.br/img/logo.jpg');
 
$posts = Post::all();
 
return view('myindex', compact('posts'));
}
 
public function show($id)
{
$post = Post::find($id);
 
SEOMeta::setTitle($post->title);
SEOMeta::setDescription($post->resume);
SEOMeta::addMeta('article:published_time', $post->published_date->toW3CString(), 'property');
SEOMeta::addMeta('article:section', $post->category, 'property');
SEOMeta::addKeyword(['key1', 'key2', 'key3']);
 
OpenGraph::setDescription($post->resume);
OpenGraph::setTitle($post->title);
OpenGraph::setUrl('http://current.url.com');
OpenGraph::addProperty('type', 'article');
OpenGraph::addProperty('locale', 'pt-br');
OpenGraph::addProperty('locale:alternate', ['pt-pt', 'en-us']);
 
OpenGraph::addImage($post->cover->url);
OpenGraph::addImage($post->images->list('url'));
OpenGraph::addImage(['url' => 'http://image.url.com/cover.jpg', 'size' => 300]);
OpenGraph::addImage('http://image.url.com/cover.jpg', ['height' => 300, 'width' => 300]);
 
JsonLd::setTitle($post->title);
JsonLd::setDescription($post->resume);
JsonLd::setType('Article');
JsonLd::addImage($post->images->list('url'));
 
// OR with multi
 
JsonLdMulti::setTitle($post->title);
JsonLdMulti::setDescription($post->resume);
JsonLdMulti::setType('Article');
JsonLdMulti::addImage($post->images->list('url'));
if(! JsonLdMulti::isEmpty()) {
JsonLdMulti::newJsonLd();
JsonLdMulti::setType('WebPage');
JsonLdMulti::setTitle('Page Article - '.$post->title);
}
 
// Namespace URI: http://ogp.me/ns/article#
// article
OpenGraph::setTitle('Article')
->setDescription('Some Article')
->setType('article')
->setArticle([
'published_time' => 'datetime',
'modified_time' => 'datetime',
'expiration_time' => 'datetime',
'author' => 'profile / array',
'section' => 'string',
'tag' => 'string / array'
]);
 
// Namespace URI: http://ogp.me/ns/book#
// book
OpenGraph::setTitle('Book')
->setDescription('Some Book')
->setType('book')
->setBook([
'author' => 'profile / array',
'isbn' => 'string',
'release_date' => 'datetime',
'tag' => 'string / array'
]);
 
// Namespace URI: http://ogp.me/ns/profile#
// profile
OpenGraph::setTitle('Profile')
->setDescription('Some Person')
->setType('profile')
->setProfile([
'first_name' => 'string',
'last_name' => 'string',
'username' => 'string',
'gender' => 'enum(male, female)'
]);
 
// Namespace URI: http://ogp.me/ns/music#
// music.song
OpenGraph::setType('music.song')
->setMusicSong([
'duration' => 'integer',
'album' => 'array',
'album:disc' => 'integer',
'album:track' => 'integer',
'musician' => 'array'
]);
 
// music.album
OpenGraph::setType('music.album')
->setMusicAlbum([
'song' => 'music.song',
'song:disc' => 'integer',
'song:track' => 'integer',
'musician' => 'profile',
'release_date' => 'datetime'
]);
 
//music.playlist
OpenGraph::setType('music.playlist')
->setMusicPlaylist([
'song' => 'music.song',
'song:disc' => 'integer',
'song:track' => 'integer',
'creator' => 'profile'
]);
 
// music.radio_station
OpenGraph::setType('music.radio_station')
->setMusicRadioStation([
'creator' => 'profile'
]);
 
// Namespace URI: http://ogp.me/ns/video#
// video.movie
OpenGraph::setType('video.movie')
->setVideoMovie([
'actor' => 'profile / array',
'actor:role' => 'string',
'director' => 'profile /array',
'writer' => 'profile / array',
'duration' => 'integer',
'release_date' => 'datetime',
'tag' => 'string / array'
]);
 
// video.episode
OpenGraph::setType('video.episode')
->setVideoEpisode([
'actor' => 'profile / array',
'actor:role' => 'string',
'director' => 'profile /array',
'writer' => 'profile / array',
'duration' => 'integer',
'release_date' => 'datetime',
'tag' => 'string / array',
'series' => 'video.tv_show'
]);
 
// video.tv_show
OpenGraph::setType('video.tv_show')
->setVideoTVShow([
'actor' => 'profile / array',
'actor:role' => 'string',
'director' => 'profile /array',
'writer' => 'profile / array',
'duration' => 'integer',
'release_date' => 'datetime',
'tag' => 'string / array'
]);
 
// video.other
OpenGraph::setType('video.other')
->setVideoOther([
'actor' => 'profile / array',
'actor:role' => 'string',
'director' => 'profile /array',
'writer' => 'profile / array',
'duration' => 'integer',
'release_date' => 'datetime',
'tag' => 'string / array'
]);
 
// og:video
OpenGraph::addVideo('http://example.com/movie.swf', [
'secure_url' => 'https://example.com/movie.swf',
'type' => 'application/x-shockwave-flash',
'width' => 400,
'height' => 300
]);
 
// og:audio
OpenGraph::addAudio('http://example.com/sound.mp3', [
'secure_url' => 'https://secure.example.com/sound.mp3',
'type' => 'audio/mpeg'
]);
 
// og:place
OpenGraph::setTitle('Place')
->setDescription('Some Place')
->setType('place')
->setPlace([
'location:latitude' => 'float',
'location:longitude' => 'float',
]);
 
return view('myshow', compact('post'));
}
}

SEOTrait

<?php
 
namespace App\Http\Controllers;
 
use Artesaos\SEOTools\Traits\SEOTools as SEOToolsTrait;
 
class CommonController extends Controller
{
use SEOToolsTrait;
 
public function index()
{
$this->seo()->setTitle('Home');
$this->seo()->setDescription('This is my page description');
$this->seo()->opengraph()->setUrl('http://current.url.com');
$this->seo()->opengraph()->addProperty('type', 'articles');
$this->seo()->twitter()->setSite('@LuizVinicius73');
$this->seo()->jsonLd()->setType('Article');
 
$posts = Post::all();
 
return view('myindex', compact('posts'));
}
}

In Your View

Pro Tip: Pass the parameter true to get minified code and reduce filesize.

<html>
<head>
{!! SEOMeta::generate() !!}
{!! OpenGraph::generate() !!}
{!! Twitter::generate() !!}
{!! JsonLd::generate() !!}
// OR with multi
{!! JsonLdMulti::generate() !!}
 
<!-- OR -->
{!! SEO::generate() !!}
 
<!-- MINIFIED -->
{!! SEO::generate(true) !!}
 
<!-- LUMEN -->
{!! app('seotools')->generate() !!}
</head>
<body>
 
</body>
</html>

Related Content on Laravel Daily

Video

Recent Courses on Laravel Daily

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.