Este pacote pode gerar um mapa do site sem que você precise adicionar URLs manualmente. Isso funciona rastreando todo o seu site.
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
Você também pode criar seu mapa do site manualmente:
use Carbon Carbon ;
use Spatie Sitemap Sitemap ;
use Spatie Sitemap Tags Url ;
Sitemap:: create ()
-> add (Url:: create ( ' /home ' )
-> setLastModificationDate (Carbon:: yesterday ())
-> setChangeFrequency (Url:: CHANGE_FREQUENCY_YEARLY )
-> setPriority ( 0.1 ))
-> add (...)
-> writeToFile ( $ path );
Ou você pode ter o melhor dos dois mundos gerando um mapa do site e adicionando mais links a ele:
SitemapGenerator:: create ( ' https://example.com ' )
-> getSitemap ()
-> add (Url:: create ( ' /extra-page ' )
-> setLastModificationDate (Carbon:: yesterday ())
-> setChangeFrequency (Url:: CHANGE_FREQUENCY_YEARLY )
-> setPriority ( 0.1 ))
-> add (...)
-> writeToFile ( $ path );
Você também pode controlar a profundidade máxima do mapa do site:
SitemapGenerator:: create ( ' https://example.com ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> setMaximumDepth ( 3 );
})
-> writeToFile ( $ path );
O gerador tem a capacidade de executar JavaScript em cada página para que os links injetados no domínio por JavaScript também sejam rastreados.
Você também pode usar um dos discos do sistema de arquivos disponíveis para gravar o mapa do site.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' );
Pode ser necessário definir a visibilidade do arquivo em um de seus sitemaps. Por exemplo, se você estiver escrevendo um mapa do site para S3 que deseja que esteja disponível publicamente. Você pode definir o terceiro parâmetro como true
para torná-lo público. Nota: Isso só pode ser usado no método ->writeToDisk()
.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' , true );
Você também pode adicionar seus modelos diretamente implementando a interface SpatieSitemapContractsSitemapable
.
use Spatie Sitemap Contracts Sitemapable ;
use Spatie Sitemap Tags Url ;
class Post extends Model implements Sitemapable
{
public function toSitemapTag (): Url | string | array
{
// Simple return :
return route ( ' blog.post.show ' , $ this );
// Return with fine - grained control :
return Url:: create ( route ( ' blog.post.show ' , $ this ))
-> setLastModificationDate (Carbon:: create ( $ this -> updated_at ))
-> setChangeFrequency (Url:: CHANGE_FREQUENCY_YEARLY )
-> setPriority ( 0.1 );
}
}
Agora você pode adicionar um único modelo de postagem ao mapa do site ou até mesmo uma coleção inteira.
use Spatie Sitemap Sitemap ;
Sitemap:: create ()
-> add ( $ post )
-> add (Post:: all ());
Dessa forma, você pode adicionar todas as suas páginas muito rapidamente, sem a necessidade de rastreá-las todas.
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Primeiro, instale o pacote via compositor:
composer require spatie/laravel-sitemap
O pacote será registrado automaticamente.
Se quiser atualizar o mapa do site de forma automática e frequente, você precisará executar algumas etapas extras.
Você pode substituir as opções padrão do rastreador. Primeiro publique a configuração:
php artisan vendor:publish --provider= " SpatieSitemapSitemapServiceProvider " --tag=sitemap-config
Isso copiará a configuração padrão para config/sitemap.php
onde você pode editá-la.
use GuzzleHttp RequestOptions ;
use Spatie Sitemap Crawler Profile ;
return [
/ *
* These options will be passed to GuzzleHttp Client when it is created .
* For in - depth information on all options see the Guzzle docs :
*
* http : // docs . guzzlephp . org / en / stable / request - options . html
* /
' guzzle_options ' => [
/ *
* Whether or not cookies are used in a request .
* /
RequestOptions:: COOKIES => true ,
/ *
* The number of seconds to wait while trying to connect to a server .
* Use 0 to wait indefinitely .
* /
RequestOptions:: CONNECT_TIMEOUT => 10 ,
/ *
* The timeout of the request in seconds . Use 0 to wait indefinitely .
* /
RequestOptions:: TIMEOUT => 10 ,
/ *
* Describes the redirect behavior of a request .
* /
RequestOptions:: ALLOW_REDIRECTS => false ,
],
/ *
* The sitemap generator can execute JavaScript on each page so it will
* discover links that are generated by your JS scripts . This feature
* is powered by headless Chrome .
* /
' execute_javascript ' => false ,
/ *
* The package will make an educated guess as to where Google Chrome is installed .
* You can also manually pass it ' s location here .
* /
' chrome_binary_path ' => '' ,
/ *
* The sitemap generator uses a CrawlProfile implementation to determine
* which urls should be crawled for the sitemap .
* /
' crawl_profile ' => Profile::class,
];
A maneira mais fácil é rastrear o domínio fornecido e gerar um mapa do site com todos os links encontrados. O destino do mapa do site deve ser especificado por $path
.
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
O mapa do site gerado será semelhante a este:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< urlset xmlns = " http://www.sitemaps.org/schemas/sitemap/0.9 " >
< url >
< loc >https://example.com</ loc >
< lastmod >2016-01-01T00:00:00+00:00</ lastmod >
< changefreq >daily</ changefreq >
< priority >0.8</ priority >
</ url >
< url >
< loc >https://example.com/page</ loc >
< lastmod >2016-01-01T00:00:00+00:00</ lastmod >
< changefreq >daily</ changefreq >
< priority >0.8</ priority >
</ url >
...
</ urlset >
Você pode criar um perfil de rastreamento personalizado implementando a interface SpatieCrawlerCrawlProfilesCrawlProfile
e personalizando o método shouldCrawl()
para controle total sobre qual URL/domínio/subdomínio deve ser rastreado:
use Spatie Crawler CrawlProfiles CrawlProfile ;
use Psr Http Message UriInterface ;
class CustomCrawlProfile extends CrawlProfile
{
public function shouldCrawl ( UriInterface $ url ): bool
{
if ( $ url -> getHost () !== ' localhost ' ) {
return false ;
}
return $ url -> getPath () === ' / ' ;
}
}
e registre seu CustomCrawlProfile::class
em config/sitemap.php
.
return [
...
/ *
* The sitemap generator uses a CrawlProfile implementation to determine
* which urls should be crawled for the sitemap .
* /
' crawl_profile ' => CustomCrawlProfile:: class ,
];
Para alterar lastmod
, changefreq
e priority
da página de contato:
use Carbon Carbon ;
use Spatie Sitemap SitemapGenerator ;
use Spatie Sitemap Tags Url ;
SitemapGenerator:: create ( ' https://example.com ' )
-> hasCrawled ( function ( Url $ url ) {
if ( $ url -> segment ( 1 ) === ' contact ' ) {
$ url -> setPriority ( 0.9 )
-> setLastModificationDate (Carbon:: create ( ' 2016 ' , ' 1 ' , ' 1 ' ));
}
return $ url ;
})
-> writeToFile ( $ sitemapPath );
Se você não deseja que um link rastreado apareça no mapa do site, apenas não o retorne no callable que você passa para hasCrawled
.
use Spatie Sitemap SitemapGenerator ;
use Spatie Sitemap Tags Url ;
SitemapGenerator:: create ( ' https://example.com ' )
-> hasCrawled ( function ( Url $ url ) {
if ( $ url -> segment ( 1 ) === ' contact ' ) {
return ;
}
return $ url ;
})
-> writeToFile ( $ sitemapPath );
Você também pode instruir o rastreador subjacente a não rastrear algumas páginas, passando um callable
para shouldCrawl
.
Observação: shouldCrawl
funcionará apenas com o Profile
de rastreamento padrão ou perfis de rastreamento personalizados que implementam um método shouldCrawlCallback
.
use Spatie Sitemap SitemapGenerator ;
use Psr Http Message UriInterface ;
SitemapGenerator:: create ( ' https://example.com ' )
-> shouldCrawl ( function ( UriInterface $ url ) {
// All pages will be crawled , except the contact page .
// Links present on the contact page won ' t be added to the
// sitemap unless they are present on a crawlable page .
return strpos ( $ url -> getPath (), ' /contact ' ) === false ;
})
-> writeToFile ( $ sitemapPath );
O próprio rastreador pode ser configurado para fazer algumas coisas diferentes.
Você pode configurar o rastreador usado pelo gerador de mapa do site, por exemplo: para ignorar as verificações do robô; assim.
SitemapGenerator:: create ( ' http://localhost:4020 ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> ignoreRobots ();
})
-> writeToFile ( $ file );
Você pode limitar a quantidade de páginas rastreadas chamando setMaximumCrawlCount
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> setMaximumCrawlCount ( 500 ) // only the 500 first pages will be crawled
. . .
O gerador de mapa de site pode executar JavaScript em cada página para descobrir links gerados por seus scripts JS. Você pode ativar esse recurso definindo execute_javascript
no arquivo de configuração como true
.
Nos bastidores, o Chrome sem cabeça é usado para executar JavaScript. Aqui estão algumas dicas sobre como instalá-lo em seu sistema.
O pacote fará uma estimativa fundamentada de onde o Chrome está instalado em seu sistema. Você também pode passar manualmente a localização do binário do Chrome para executeJavaScript()
.
Você pode adicionar links manualmente a um mapa do site:
use Spatie Sitemap SitemapGenerator ;
use Spatie Sitemap Tags Url ;
SitemapGenerator:: create ( ' https://example.com ' )
-> getSitemap ()
// here we add one extra link , but you can add as many as you ' d like
-> add (Url:: create ( ' /extra-page ' )-> setPriority ( 0.5 ))
-> writeToFile ( $ sitemapPath );
Sites multilíngues podem ter diversas versões alternativas da mesma página (uma por idioma). Com base no exemplo anterior, a adição de uma alternativa pode ser feita da seguinte forma:
use Spatie Sitemap SitemapGenerator ;
use Spatie Sitemap Tags Url ;
SitemapGenerator:: create ( ' https://example.com ' )
-> getSitemap ()
// here we add one extra link , but you can add as many as you ' d like
-> add (Url:: create ( ' /extra-page ' )-> setPriority ( 0.5 )-> addAlternate ( ' /extra-pagina ' , ' nl ' ))
-> writeToFile ( $ sitemapPath );
Observe a função addAlternate
que usa uma URL alternativa e o local ao qual ela pertence.
URLs também podem ter imagens. Consulte também https://developers.google.com/search/docs/advanced/sitemaps/image-sitemaps
use Spatie Sitemap Sitemap ;
use Spatie Sitemap Tags Url ;
Sitemap:: create ()
// here we add an image to a URL
-> add (Url:: create ( ' https://example.com ' )-> addImage ( ' https://example.com/images/home.jpg ' , ' Home page image ' ))
-> writeToFile ( $ sitemapPath );
Assim como as imagens, os vídeos podem ser agrupados por tags de URL. Consulte https://developers.google.com/search/docs/crawling-indexing/sitemaps/video-sitemaps
Você pode definir atributos obrigatórios da seguinte forma:
use Spatie Sitemap Sitemap ;
use Spatie Sitemap Tags Url ;
Sitemap:: create ()
-> add (
Url:: create ( ' https://example.com ' )
-> addVideo ( ' https://example.com/images/thumbnail.jpg ' , ' Video title ' , ' Video Description ' , ' https://example.com/videos/source.mp4 ' , ' https://example.com/video/123 ' )
)
-> writeToFile ( $ sitemapPath );
Se você quiser passar parâmetros opcionais como family_friendly
, live
ou platform
:
use Spatie Sitemap Sitemap ;
use Spatie Sitemap Tags Url ;
use Spatie Sitemap Tags Video ;
$ options = [ ' family_friendly ' => Video:: OPTION_YES , ' live ' => Video:: OPTION_NO ];
$ allowOptions = [ ' platform ' => Video:: OPTION_PLATFORM_MOBILE ];
$ denyOptions = [ ' restriction ' => ' CA ' ];
Sitemap:: create ()
-> add (
Url:: create ( ' https://example.com ' )
-> addVideo ( ' https://example.com/images/thumbnail.jpg ' , ' Video title ' , ' Video Description ' , ' https://example.com/videos/source.mp4 ' , ' https://example.com/video/123 ' , $ options , $ allowOptions , $ denyOptions )
)
-> writeToFile ( $ sitemapPath );
Você também pode criar um mapa do site totalmente manual:
use Carbon Carbon ;
Sitemap:: create ()
-> add ( ' /page1 ' )
-> add ( ' /page2 ' )
-> add (Url:: create ( ' /page3 ' )-> setLastModificationDate (Carbon:: create ( ' 2016 ' , ' 1 ' , ' 1 ' )))
-> writeToFile ( $ sitemapPath );
Você pode criar um índice de mapa do site:
use Spatie Sitemap SitemapIndex ;
SitemapIndex:: create ()
-> add ( ' /pages_sitemap.xml ' )
-> add ( ' /posts_sitemap.xml ' )
-> writeToFile ( $ sitemapIndexPath );
Você pode passar um objeto SpatieSitemapTagsSitemap
para definir manualmente a propriedade lastModificationDate
.
use Spatie Sitemap SitemapIndex ;
use Spatie Sitemap Tags Sitemap ;
SitemapIndex:: create ()
-> add ( ' /pages_sitemap.xml ' )
-> add (Sitemap:: create ( ' /posts_sitemap.xml ' )
-> setLastModificationDate (Carbon:: yesterday ()))
-> writeToFile ( $ sitemapIndexPath );
o índice do mapa do site gerado será semelhante a este:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< sitemapindex xmlns = " http://www.sitemaps.org/schemas/sitemap/0.9 " >
< sitemap >
< loc >http://www.example.com/pages_sitemap.xml</ loc >
< lastmod >2016-01-01T00:00:00+00:00</ lastmod >
</ sitemap >
< sitemap >
< loc >http://www.example.com/posts_sitemap.xml</ loc >
< lastmod >2015-12-31T00:00:00+00:00</ lastmod >
</ sitemap >
</ sitemapindex >
Você pode chamar o método maxTagsPerSitemap
para gerar um mapa do site que contenha apenas uma determinada quantidade de tags
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> maxTagsPerSitemap ( 20000 )
-> writeToFile ( public_path ( ' sitemap.xml ' ));
Seu site provavelmente será atualizado de tempos em tempos. Para permitir que o mapa do seu site reflita essas alterações, você pode executar o gerador periodicamente. A maneira mais fácil de fazer isso é usar os recursos de agendamento padrão do Laravel.
Você poderia configurar um comando de artesão muito parecido com este:
namespace App Console Commands ;
use Illuminate Console Command ;
use Spatie Sitemap SitemapGenerator ;
class GenerateSitemap extends Command
{
/ * *
* The console command name .
*
* @ var string
* /
protected $ signature = ' sitemap:generate ' ;
/ * *
* The console command description .
*
* @ var string
* /
protected $ description = ' Generate the sitemap. ' ;
/ * *
* Execute the console command .
*
* @ return mixed
* /
public function handle ()
{
// modify this to your own needs
SitemapGenerator:: create ( config ( ' app.url ' ))
-> writeToFile ( public_path ( ' sitemap.xml ' ));
}
}
Esse comando deve então ser agendado no kernel do console.
// app / Console / Kernel . php
protected function schedule ( Schedule $ schedule )
{
. . .
$ schedule -> command ( ' sitemap:generate ' )-> daily ();
. . .
}
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Primeiro inicie o servidor de teste em uma sessão de terminal separada:
cd tests/server
./start_server.sh
Com o servidor rodando você pode executar os testes:
$ composer test
Consulte CONTRIBUINDO para obter detalhes.
Se você encontrou um bug relacionado à segurança, envie um email para [email protected] em vez de usar o rastreador de problemas.
Spatie é uma agência de webdesign com sede em Antuérpia, Bélgica. Você encontrará uma visão geral de todos os nossos projetos de código aberto em nosso site.
O seu negócio depende das nossas contribuições? Entre em contato e nos apoie no Patreon. Todas as promessas serão dedicadas à alocação de força de trabalho para manutenção e novidades incríveis.
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.