Этот пакет может генерировать карту сайта без необходимости добавлять к ней URL-адреса вручную. Это работает путем сканирования всего вашего сайта.
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
Вы также можете создать карту сайта вручную:
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 );
Или вы можете воспользоваться преимуществами обоих миров, создав карту сайта и добавив к ней дополнительные ссылки:
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 );
Вы также можете контролировать максимальную глубину карты сайта:
SitemapGenerator:: create ( ' https://example.com ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> setMaximumDepth ( 3 );
})
-> writeToFile ( $ path );
Генератор имеет возможность выполнять JavaScript на каждой странице, поэтому ссылки, введенные в домен с помощью JavaScript, также будут сканироваться.
Вы также можете использовать один из доступных дисков файловой системы для записи карты сайта.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' );
Возможно, вам придется настроить видимость файла на одной из ваших карт сайта. Например, если вы пишете карту сайта для S3, которую хотите сделать общедоступной. Вы можете установить для третьего параметра значение true
чтобы сделать его общедоступным. Примечание. Это можно использовать только в методе ->writeToDisk()
.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' , true );
Вы также можете добавлять свои модели напрямую, реализовав интерфейс 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 );
}
}
Теперь вы можете добавить в карту сайта одну модель поста или даже целую коллекцию.
use Spatie Sitemap Sitemap ;
Sitemap:: create ()
-> add ( $ post )
-> add (Post:: all ());
Таким образом, вы сможете очень быстро добавлять все свои страницы без необходимости их всех сканировать.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Сначала установите пакет через композитор:
composer require spatie/laravel-sitemap
Пакет автоматически зарегистрируется.
Если вы хотите часто и автоматически обновлять карту сайта, вам необходимо выполнить некоторые дополнительные действия.
Вы можете переопределить параметры по умолчанию для сканера. Сначала опубликуйте конфигурацию:
php artisan vendor:publish --provider= " SpatieSitemapSitemapServiceProvider " --tag=sitemap-config
Это скопирует конфигурацию по умолчанию в config/sitemap.php
, где вы сможете ее редактировать.
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,
];
Самый простой способ — просканировать данный домен и создать карту сайта со всеми найденными ссылками. Назначение карты сайта должно быть указано в $path
.
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
Сгенерированная карта сайта будет выглядеть примерно так:
<? 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 >
Вы можете создать собственный профиль сканирования, реализовав интерфейс SpatieCrawlerCrawlProfilesCrawlProfile
и настроив метод shouldCrawl()
для полного контроля над тем, какой URL/домен/поддомен следует сканировать:
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 () === ' / ' ;
}
}
и зарегистрируйте свой CustomCrawlProfile::class
в 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 ,
];
Чтобы изменить lastmod
, changefreq
и priority
страницы контактов:
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 );
Если вы не хотите, чтобы просканированная ссылка отображалась в карте сайта, просто не возвращайте ее в вызываемом объекте, который вы передаете 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 );
Вы также можете указать базовому сканеру не сканировать некоторые страницы, передав callable
метод shouldCrawl
.
Примечание. shouldCrawl
будет работать только с Profile
сканирования по умолчанию или с пользовательскими профилями сканирования, реализующими метод 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 );
Сам сканер можно настроить на выполнение нескольких разных задач.
Вы можете настроить сканер, используемый генератором карты сайта, например: игнорировать проверки робота; вот так.
SitemapGenerator:: create ( ' http://localhost:4020 ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> ignoreRobots ();
})
-> writeToFile ( $ file );
Вы можете ограничить количество сканируемых страниц, вызвав setMaximumCrawlCount
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> setMaximumCrawlCount ( 500 ) // only the 500 first pages will be crawled
. . .
Генератор карты сайта может выполнять JavaScript на каждой странице, чтобы обнаруживать ссылки, созданные вашими JS-скриптами. Вы можете включить эту функцию, установив для execute_javascript
в файле конфигурации значение true
.
Под капотом для выполнения JavaScript используется headless Chrome. Вот несколько советов о том, как установить его в вашей системе.
Пакет сделает обоснованное предположение о том, где установлен Chrome в вашей системе. Вы также можете вручную передать расположение двоичного файла Chrome для executeJavaScript()
.
Вы можете вручную добавить ссылки в карту сайта:
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 );
Многоязычные сайты могут иметь несколько альтернативных версий одной и той же страницы (по одной на каждый язык). На основе предыдущего примера добавление альтернативы можно выполнить следующим образом:
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 );
Обратите внимание на функцию addAlternate
, которая принимает альтернативный URL-адрес и локаль, к которой он принадлежит.
URL-адреса также могут содержать изображения. См. также 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 );
Как и изображения, видео можно обернуть тегами URL. См. https://developers.google.com/search/docs/crawling-indexing/sitemaps/video-sitemaps.
Вы можете установить необходимые атрибуты следующим образом:
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 );
Если вы хотите передать необязательные параметры, такие как family_friendly
, live
или 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 );
Вы также можете создать карту сайта полностью вручную:
use Carbon Carbon ;
Sitemap:: create ()
-> add ( ' /page1 ' )
-> add ( ' /page2 ' )
-> add (Url:: create ( ' /page3 ' )-> setLastModificationDate (Carbon:: create ( ' 2016 ' , ' 1 ' , ' 1 ' )))
-> writeToFile ( $ sitemapPath );
Вы можете создать индекс карты сайта:
use Spatie Sitemap SitemapIndex ;
SitemapIndex:: create ()
-> add ( ' /pages_sitemap.xml ' )
-> add ( ' /posts_sitemap.xml ' )
-> writeToFile ( $ sitemapIndexPath );
Вы можете передать объект SpatieSitemapTagsSitemap
, чтобы вручную установить свойство 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 );
сгенерированный индекс карты сайта будет выглядеть примерно так:
<? 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 >
Вы можете вызвать метод maxTagsPerSitemap
, чтобы создать карту сайта, содержащую только заданное количество тегов.
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> maxTagsPerSitemap ( 20000 )
-> writeToFile ( public_path ( ' sitemap.xml ' ));
Вероятно, ваш сайт будет время от времени обновляться. Чтобы ваша карта сайта отражала эти изменения, вы можете периодически запускать генератор. Самый простой способ сделать это — использовать возможности планирования Laravel по умолчанию.
Вы можете настроить ремесленную команду примерно так:
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 ' ));
}
}
Затем эту команду следует запланировать в ядре консоли.
// app / Console / Kernel . php
protected function schedule ( Schedule $ schedule )
{
. . .
$ schedule -> command ( ' sitemap:generate ' )-> daily ();
. . .
}
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Сначала запустите тестовый сервер в отдельном терминальном сеансе:
cd tests/server
./start_server.sh
При работающем сервере вы можете выполнить тесты:
$ composer test
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Spatie — агентство веб-дизайна, базирующееся в Антверпене, Бельгия. На нашем сайте вы найдете обзор всех наших проектов с открытым исходным кодом.
Зависит ли ваш бизнес от нашего вклада? Свяжитесь с нами и поддержите нас на Patreon. Все взносы будут направлены на выделение рабочей силы для обслуживания и создания новых интересных вещей.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.