このパッケージは、手動で 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 によって dom に挿入されたリンクもクロールされます。
使用可能なファイル システム ディスクの 1 つを使用してサイトマップを書き込むこともできます。
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' );
サイトマップの 1 つでファイルの公開設定を設定する必要がある場合があります。たとえば、一般公開したいサイトマップを S3 に書き込んでいる場合です。 3 番目のパラメータを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 経由でパッケージをインストールします。
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
インターフェイスを実装し、クロールする URL/ドメイン/サブドメインを完全に制御するためにshouldCrawl()
メソッドをカスタマイズします。
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
に設定します。
内部では、ヘッドレス Chrome が JavaScript の実行に使用されます。システムにインストールする方法については、次のようなヒントがあります。
パッケージは、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 );
多言語サイトには、同じページの代替バージョンが複数ある場合があります (言語ごとに 1 つ)。前の例に基づいて、代替の追加は次のように実行できます。
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 );
代替 URL とそれが属するロケールを取得するaddAlternate
関数に注目してください。
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 は、ベルギーのアントワープに拠点を置くウェブデザイン会社です。当社のすべてのオープンソース プロジェクトの概要は、当社の Web サイトでご覧いただけます。
あなたのビジネスは私たちの貢献に依存していますか? Patreon で私たちをサポートしてください。すべての誓約は、メンテナンスと新しい素晴らしいものに人員を割り当てることに専念します。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。