SEOTools é um pacote para Laravel 5.8+ e Lumen que fornece ajudantes para algumas técnicas comuns de SEO.
Status atual da compilação
Estatísticas
Para obter informações sobre licença, verifique o arquivo LICENSE.
O primeiro passo é usar o compositor para instalar o pacote e atualizar automaticamente seu arquivo composer.json
, você pode fazer isso executando:
composer require artesaos/seotools
Nota : Se você estiver usando o Laravel 5.5, as etapas 2 e 3, para provedores e aliases, são desnecessárias. SEOTools suporta a nova descoberta de pacotes do Laravel.
Você precisa atualizar a configuração da sua aplicação para registrar o pacote para que ele possa ser carregado pelo Laravel, basta atualizar seu arquivo config/app.php
adicionando o seguinte código no final da seção 'providers'
:
config/app.php
<?php
return [
// ...
' providers ' => [
Artesaos SEOTools Providers SEOToolsServiceProvider::class,
// ...
],
// ...
];
Vá para o arquivo /bootstrap/app.php
e adicione esta linha:
<?php
// ...
$ app = new Laravel Lumen Application (
dirname ( __DIR__ )
);
// ...
$ app -> register ( Artesaos SEOTools Providers SEOToolsServiceProvider::class);
// ...
return $ app ;
Nota: fachadas não são suportadas no Lumen.
Você pode obter acesso aos serviços da ferramenta SEO usando as seguintes fachadas:
ArtesaosSEOToolsFacadesSEOMeta
ArtesaosSEOToolsFacadesOpenGraph
ArtesaosSEOToolsFacadesTwitterCard
ArtesaosSEOToolsFacadesJsonLd
ArtesaosSEOToolsFacadesJsonLdMulti
ArtesaosSEOToolsFacadesSEOTools
Você pode configurar aliases de versão curta para essas fachadas em seu arquivo config/app.php
. Por exemplo:
<?php
return [
// ...
' aliases ' => [
' SEOMeta ' => Artesaos SEOTools Facades SEOMeta::class,
' OpenGraph ' => Artesaos SEOTools Facades OpenGraph::class,
' Twitter ' => Artesaos SEOTools Facades TwitterCard::class,
' JsonLd ' => Artesaos SEOTools Facades JsonLd::class,
' JsonLdMulti ' => Artesaos SEOTools Facades JsonLdMulti::class,
// or
' SEO ' => Artesaos SEOTools Facades SEOTools::class,
// ...
],
// ...
];
No seu tipo de terminal
php artisan vendor:publish
ou
php artisan vendor:publish --provider= " ArtesaosSEOToolsProvidersSEOToolsServiceProvider "
O Lumen não suporta este comando, para isso você deve copiar o arquivo
src/resources/config/seotools.php
paraconfig/seotools.php
do seu projeto
No arquivo de configuração seotools.php
você pode determinar as propriedades dos valores padrão e alguns comportamentos.
defaults
- Quais valores serão exibidos caso não seja especificado nenhum valor para exibição da página. Se o valor for false
, nada será exibido.webmaster
- São as configurações de valores de tags para as principais ferramentas para webmasters. Se você for null
nada será exibido.defaults
- São as propriedades que sempre serão exibidas e quando nenhum outro valor for definido. Você pode adicionar tags adicionais que não estão incluídas no arquivo de configuração original.defaults
- São as propriedades que sempre serão exibidas e quando nenhum outro valor for definido. Você pode adicionar tags adicionais que não estão incluídas no arquivo de configuração original.defaults
- São as propriedades que sempre serão exibidas e quando nenhum outro valor for definido. Você pode adicionar tags adicionais que não estão incluídas no arquivo de configuração original. Nota: fachadas não são suportadas no Lumen.
<?php
$ seotools = app ( ' seotools ' );
$ metatags = app ( ' seotools.metatags ' );
$ twitter = app ( ' seotools.twitter ' );
$ opengraph = app ( ' seotools.opengraph ' );
$ jsonld = app ( ' seotools.json-ld ' );
$ jsonldMulti = app ( ' seotools.json-ld-multi ' );
// The behavior is the same as the facade
echo app ( ' seotools ' )-> generate ();
Com SEOMeta você pode criar meta tags para o head
Com o OpenGraph você pode criar tags OpenGraph no head
Com o Twitter você pode criar tags OpenGraph na head
<?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 ' ));
}
}
<?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 ' ));
}
}
Dica profissional : passe o parâmetro
true
para obter código minificado e reduzir o tamanho do arquivo.
< 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 >
< html >
< head >
< title > Title - Over 9000 Thousand! </ title >
< meta name =' description ' itemprop =' description ' content =' description... ' >
< meta name =' keywords ' content =' key1, key2, key3 ' >
< meta property =' article:published_time ' content =' 2015-01-31T20:30:11-02:00 ' >
< meta property =' article:section ' content =' news ' >
< meta property =" og:description " content =" description... " >
< meta property =" og:title " content =" Title " >
< meta property =" og:url " content =" http://current.url.com " >
< meta property =" og:type " content =" article " >
< meta property =" og:locale " content =" pt-br " >
< meta property =" og:locale:alternate " content =" pt-pt " >
< meta property =" og:locale:alternate " content =" en-us " >
< meta property =" og:site_name " content =" name " >
< meta property =" og:image " content =" http://image.url.com/cover.jpg " >
< meta property =" og:image " content =" http://image.url.com/img1.jpg " >
< meta property =" og:image " content =" http://image.url.com/img2.jpg " >
< meta property =" og:image " content =" http://image.url.com/img3.jpg " >
< meta property =" og:image:url " content =" http://image.url.com/cover.jpg " >
< meta property =" og:image:size " content =" 300 " >
< meta name =" twitter:card " content =" summary " >
< meta name =" twitter:title " content =" Title " >
< meta name =" twitter:site " content =" @LuizVinicius73 " >
< script type =" application/ld+json " > { "@context" : "https://schema.org" , "@type" : "Article" , "name" : "Title - Over 9000 Thousand!" } </ script >
<!-- OR with multi -->
< script type =" application/ld+json " > { "@context" : "https://schema.org" , "@type" : "Article" , "name" : "Title - Over 9000 Thousand!" } </ script >
< script type =" application/ld+json " > { "@context" : "https://schema.org" , "@type" : "WebPage" , "name" : "Title - Over 9000 Thousand!" } </ script >
</ head >
< body >
</ body >
</ html >
Usar o mesmo código em vários lugares pode ser entediante, e é por isso que este pacote inclui uma característica Macroable. Esta característica permite que funcionalidades adicionais sejam adicionadas a uma classe que não foi definida na definição da classe, usando uma característica simples.
Por exemplo, imagine que você precisa adicionar metatítulos e descrições às suas páginas. Você pode adicionar suas funções Macroable no AppServiceProvider ou criar um arquivo dedicado para essa finalidade e definir sua função conforme mostrado no trecho de código:
SEOTools:: macro ( ' webPage ' , function ( string $ title , string $ description ) {
SEOMeta:: setTitle ( $ title );
SEOMeta:: setDescription ( $ description );
SEOMeta:: setCanonical ( ' http://current.url.com ' );
OpenGraph:: setDescription ( $ description );
OpenGraph:: setTitle ( $ title );
OpenGraph:: setUrl ( ' http://current.url.com ' );
OpenGraph:: addProperty ( ' type ' , ' webpage ' );
});
No seu controlador, você pode usar o seguinte código para utilizar a função:
SEOTools:: webPage ( ' Page title ' , ' Page description ' );
<?php
use Artesaos SEOTools Facades SEOMeta ;
SEOMeta:: addKeyword ( $ keyword );
SEOMeta:: addMeta ( $ meta , $ value = null , $ name = ' name ' );
SEOMeta:: addAlternateLanguage ( $ lang , $ url );
SEOMeta:: addAlternateLanguages (array $ languages );
SEOMeta:: setAlternateLanguage ( $ lang , $ url );
SEOMeta:: setAlternateLanguages (array $ languages );
SEOMeta:: setTitleSeparator ( $ separator );
SEOMeta:: setTitle ( $ title );
SEOMeta:: setTitleDefault ( $ default );
SEOMeta:: setDescription ( $ description );
SEOMeta:: setKeywords ( $ keywords );
SEOMeta:: setRobots ( $ robots );
SEOMeta:: setCanonical ( $ url );
SEOMeta:: setPrev ( $ url );
SEOMeta:: setNext ( $ url );
SEOMeta:: removeMeta ( $ key );
// You can chain methods
SEOMeta:: setTitle ( $ title )
-> setDescription ( $ description )
-> setKeywords ( $ keywords )
-> addKeyword ( $ keyword )
-> addMeta ( $ meta , $ value );
// Retrieving data
SEOMeta:: getTitle ();
SEOMeta:: getTitleSession ();
SEOMeta:: getTitleSeparator ();
SEOMeta:: getKeywords ();
SEOMeta:: getDescription ();
SEOMeta:: getCanonical ( $ url );
SEOMeta:: getPrev ( $ url );
SEOMeta:: getNext ( $ url );
SEOMeta:: getRobots ();
SEOMeta:: reset ();
SEOMeta:: generate ();
<?php
use Artesaos SEOTools Facades OpenGraph ;
OpenGraph:: addProperty ( $ key , $ value ); // value can be string or array
OpenGraph:: addImage ( $ url ); // add image url
OpenGraph:: addImages ( $ url ); // add an array of url images
OpenGraph:: setTitle ( $ title ); // define title
OpenGraph:: setDescription ( $ description ); // define description
OpenGraph:: setUrl ( $ url ); // define url
OpenGraph:: setSiteName ( $ name ); //define site_name
// You can chain methods
OpenGraph:: addProperty ( $ key , $ value )
-> addImage ( $ url )
-> addImages ( $ url )
-> setTitle ( $ title )
-> setDescription ( $ description )
-> setUrl ( $ url )
-> setSiteName ( $ name );
// Generate html tags
OpenGraph:: generate ();
<?php
use Artesaos SEOTools Facades TwitterCard ;
TwitterCard:: addValue ( $ key , $ value ); // value can be string or array
TwitterCard:: setType ( $ type ); // type of twitter card tag
TwitterCard:: setTitle ( $ type ); // title of twitter card tag
TwitterCard:: setSite ( $ type ); // site of twitter card tag
TwitterCard:: setDescription ( $ type ); // description of twitter card tag
TwitterCard:: setUrl ( $ type ); // url of twitter card tag
TwitterCard:: setImage ( $ url ); // add image url
// You can chain methods
TwitterCard:: addValue ( $ key , $ value )
-> setType ( $ type )
-> setImage ( $ url )
-> setTitle ( $ title )
-> setDescription ( $ description )
-> setUrl ( $ url )
-> setSite ( $ name );
// Generate html tags
TwitterCard:: generate ();
<?php
use Artesaos SEOTools Facades JsonLd ;
JsonLd:: addValue ( $ key , $ value ); // value can be string or array
JsonLd:: setType ( $ type ); // type of twitter card tag
JsonLd:: setTitle ( $ type ); // title of twitter card tag
JsonLd:: setSite ( $ type ); // site of twitter card tag
JsonLd:: setDescription ( $ type ); // description of twitter card tag
JsonLd:: setUrl ( $ type ); // url of twitter card tag
JsonLd:: setImage ( $ url ); // add image url
// You can chain methods
JsonLd:: addValue ( $ key , $ value )
-> setType ( $ type )
-> setImage ( $ url )
-> setTitle ( $ title )
-> setDescription ( $ description )
-> setUrl ( $ url )
-> setSite ( $ name );
// Generate html tags
JsonLd:: generate ();
<?php
use Artesaos SEOTools Facades JsonLdMulti ;
JsonLdMulti:: newJsonLd (); // create a new JsonLd group
JsonLdMulti:: isEmpty (); // check if the current JsonLd group is empty
JsonLdMulti:: select ( $ index ); // choose the JsonLd group that will be edited by the methods below
JsonLdMulti:: addValue ( $ key , $ value ); // value can be string or array
JsonLdMulti:: setType ( $ type ); // type of twitter card tag
JsonLdMulti:: setTitle ( $ type ); // title of twitter card tag
JsonLdMulti:: setSite ( $ type ); // site of twitter card tag
JsonLdMulti:: setDescription ( $ type ); // description of twitter card tag
JsonLdMulti:: setUrl ( $ type ); // url of twitter card tag
JsonLdMulti:: setImage ( $ url ); // add image url
// You can chain methods
JsonLdMulti:: addValue ( $ key , $ value )
-> setType ( $ type )
-> setImage ( $ url )
-> setTitle ( $ title )
-> setDescription ( $ description )
-> setUrl ( $ url )
-> setSite ( $ name );
// You can add an other group
if (! JsonLdMulti:: isEmpty ()) {
JsonLdMulti:: newJsonLd ()
-> setType ( $ type )
-> setImage ( $ url )
-> setTitle ( $ title )
-> setDescription ( $ description )
-> setUrl ( $ url )
-> setSite ( $ name );
}
// Generate html tags
JsonLdMulti:: generate ();
// You will have retrieve <script content="application/ld+json"/>
Facilita o acesso a todos os provedores de SEO
<?php
use Artesaos SEOTools Facades SEOTools ;
SEOTools:: metatags ();
SEOTools:: twitter ();
SEOTools:: opengraph ();
SEOTools:: jsonLd ();
SEOTools:: setTitle ( $ title );
SEOTools:: getTitle ( $ session = false );
SEOTools:: setDescription ( $ description );
SEOTools:: setCanonical ( $ url );
SEOTools:: addImages ( $ urls );
Existem muitos recursos relacionados ao SEO que você pode precisar para o seu projeto. Embora este pacote forneça suporte para os básicos, outros estão fora do seu escopo. Você terá que usar pacotes separados para sua integração.
Este pacote não oferece suporte à geração de arquivos de mapa de site. Por favor, considere usar um dos seguintes pacotes para isso:
laravélio/mapa do site
mapa do site spatie/laravel
Este pacote não lida com a consistência de URL, independentemente da ausência ou presença do símbolo de barra no final. Considere usar um dos seguintes pacotes se precisar:
iluminach/barra final de URL
fsasvari/laravel-trailing-slash
Este pacote fornece a geração da marcação HTML de microdados. Se você precisar criar HTML como o seguinte:
< div itemscope >
< p > My name is
< span itemprop =" name " > Elizabeth </ span > . </ p >
</ div >
você precisará cuidar disso sozinho.
Nota: hoje em dia a marcação de microdados é considerada desatualizada. Em vez disso, é recomendado usar JSON Linked Data, que é compatível com esta extensão.
Este pacote não oferece suporte à geração de feeds RSS ou à composição de metadados relacionados. Por favor, considere usar um dos seguintes pacotes para isso: