Dieses Paket kann eine Sitemap generieren, ohne dass Sie URLs manuell hinzufügen müssen. Dies funktioniert durch das Crawlen Ihrer gesamten Website.
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
Sie können Ihre Sitemap auch manuell erstellen:
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 );
Oder Sie können das Beste aus beiden Welten nutzen, indem Sie eine Sitemap erstellen und dieser dann weitere Links hinzufügen:
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 );
Sie können auch die maximale Tiefe der Sitemap steuern:
SitemapGenerator:: create ( ' https://example.com ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> setMaximumDepth ( 3 );
})
-> writeToFile ( $ path );
Der Generator kann JavaScript auf jeder Seite ausführen, sodass von JavaScript in den Dom eingefügte Links ebenfalls gecrawlt werden.
Sie können die Sitemap auch auf eine Ihrer verfügbaren Dateisystemfestplatten schreiben.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' );
Möglicherweise müssen Sie die Dateisichtbarkeit auf einer Ihrer Sitemaps festlegen. Wenn Sie beispielsweise eine Sitemap für S3 schreiben, die öffentlich verfügbar sein soll. Sie können den dritten Parameter auf true
setzen, um ihn öffentlich zu machen. Hinweis: Dies kann nur für die Methode ->writeToDisk()
verwendet werden.
SitemapGenerator:: create ( ' https://example.com ' )-> getSitemap ()-> writeToDisk ( ' public ' , ' sitemap.xml ' , true );
Sie können Ihre Modelle auch direkt hinzufügen, indem Sie die Schnittstelle SpatieSitemapContractsSitemapable
implementieren.
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 );
}
}
Jetzt können Sie der Sitemap ein einzelnes Beitragsmodell oder sogar eine ganze Sammlung hinzufügen.
use Spatie Sitemap Sitemap ;
Sitemap:: create ()
-> add ( $ post )
-> add (Post:: all ());
Auf diese Weise können Sie alle Ihre Seiten superschnell hinzufügen, ohne sie alle crawlen zu müssen.
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Installieren Sie zunächst das Paket über Composer:
composer require spatie/laravel-sitemap
Das Paket registriert sich automatisch.
Wenn Sie Ihre Sitemap automatisch und häufig aktualisieren möchten, müssen Sie einige zusätzliche Schritte ausführen.
Sie können die Standardoptionen für den Crawler überschreiben. Veröffentlichen Sie zunächst die Konfiguration:
php artisan vendor:publish --provider= " SpatieSitemapSitemapServiceProvider " --tag=sitemap-config
Dadurch wird die Standardkonfiguration nach config/sitemap.php
kopiert, wo Sie sie bearbeiten können.
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,
];
Der einfachste Weg besteht darin, die angegebene Domain zu crawlen und eine Sitemap mit allen gefundenen Links zu erstellen. Das Ziel der Sitemap sollte durch $path
angegeben werden.
SitemapGenerator:: create ( ' https://example.com ' )-> writeToFile ( $ path );
Die generierte Sitemap sieht etwa so aus:
<? 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 >
Sie können ein benutzerdefiniertes Crawl-Profil erstellen, indem Sie die Schnittstelle SpatieCrawlerCrawlProfilesCrawlProfile
implementieren und die Methode shouldCrawl()
anpassen, um vollständige Kontrolle darüber zu erhalten, welche URL/Domain/Subdomain gecrawlt werden soll:
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 () === ' / ' ;
}
}
und registrieren Sie Ihre CustomCrawlProfile::class
in 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 ,
];
So ändern Sie lastmod
, changefreq
und priority
der Kontaktseite:
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 );
Wenn Sie nicht möchten, dass ein gecrawlter Link in der Sitemap angezeigt wird, geben Sie ihn einfach nicht in dem Callable zurück, das Sie an hasCrawled
übergeben.
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 );
Sie können den zugrunde liegenden Crawler auch anweisen, einige Seiten nicht zu crawlen, indem Sie einen callable
an shouldCrawl
übergeben.
Hinweis: shouldCrawl
funktioniert nur mit dem Standard-Crawl Profile
oder benutzerdefinierten Crawl-Profilen, die eine shouldCrawlCallback
-Methode implementieren.
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 );
Der Crawler selbst kann für verschiedene Aufgaben konfiguriert werden.
Sie können den vom Sitemap-Generator verwendeten Crawler beispielsweise so konfigurieren, dass er Roboterprüfungen ignoriert; so.
SitemapGenerator:: create ( ' http://localhost:4020 ' )
-> configureCrawler ( function ( Crawler $ crawler ) {
$ crawler -> ignoreRobots ();
})
-> writeToFile ( $ file );
Sie können die Anzahl der gecrawlten Seiten begrenzen, indem Sie setMaximumCrawlCount
aufrufen
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> setMaximumCrawlCount ( 500 ) // only the 500 first pages will be crawled
. . .
Der Sitemap-Generator kann JavaScript auf jeder Seite ausführen, sodass er Links erkennt, die von Ihren JS-Skripten generiert werden. Sie können diese Funktion aktivieren, indem Sie execute_javascript
in der Konfigurationsdatei auf true
setzen.
Unter der Haube wird Headless Chrome zur Ausführung von JavaScript verwendet. Hier finden Sie einige Hinweise zur Installation auf Ihrem System.
Das Paket erstellt eine fundierte Schätzung darüber, wo Chrome auf Ihrem System installiert ist. Sie können den Speicherort der Chrome-Binärdatei auch manuell an executeJavaScript()
übergeben.
Sie können Links manuell zu einer Sitemap hinzufügen:
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 );
Mehrsprachige Websites können mehrere alternative Versionen derselben Seite haben (eine pro Sprache). Basierend auf dem vorherigen Beispiel kann das Hinzufügen einer Alternative wie folgt erfolgen:
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 );
Beachten Sie die Funktion addAlternate
, die eine alternative URL und das Gebietsschema, zu dem sie gehört, akzeptiert.
URLs können auch Bilder enthalten. Siehe auch 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 );
Neben Bildern können auch Videos mit URL-Tags umschlossen werden. Siehe https://developers.google.com/search/docs/crawling-indexing/sitemaps/video-sitemaps
Sie können erforderliche Attribute wie folgt festlegen:
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 );
Wenn Sie optionale Parameter wie family_friendly
, live
oder platform
übergeben möchten:
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 );
Sie können eine Sitemap auch vollständig manuell erstellen:
use Carbon Carbon ;
Sitemap:: create ()
-> add ( ' /page1 ' )
-> add ( ' /page2 ' )
-> add (Url:: create ( ' /page3 ' )-> setLastModificationDate (Carbon:: create ( ' 2016 ' , ' 1 ' , ' 1 ' )))
-> writeToFile ( $ sitemapPath );
Sie können einen Sitemap-Index erstellen:
use Spatie Sitemap SitemapIndex ;
SitemapIndex:: create ()
-> add ( ' /pages_sitemap.xml ' )
-> add ( ' /posts_sitemap.xml ' )
-> writeToFile ( $ sitemapIndexPath );
Sie können ein SpatieSitemapTagsSitemap
Objekt übergeben, um die lastModificationDate
Eigenschaft manuell festzulegen.
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 );
Der generierte Sitemap-Index sieht etwa so aus:
<? 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 >
Sie können die Methode maxTagsPerSitemap
aufrufen, um eine Sitemap zu generieren, die nur die angegebene Anzahl an Tags enthält
use Spatie Sitemap SitemapGenerator ;
SitemapGenerator:: create ( ' https://example.com ' )
-> maxTagsPerSitemap ( 20000 )
-> writeToFile ( public_path ( ' sitemap.xml ' ));
Ihre Website wird wahrscheinlich von Zeit zu Zeit aktualisiert. Damit Ihre Sitemap diese Änderungen widerspiegelt, können Sie den Generator regelmäßig ausführen. Der einfachste Weg, dies zu tun, besteht darin, die Standardplanungsfunktionen von Laravel zu nutzen.
Sie könnten ein Handwerkerkommando wie dieses einrichten:
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 ' ));
}
}
Dieser Befehl sollte dann im Konsolenkernel geplant werden.
// app / Console / Kernel . php
protected function schedule ( Schedule $ schedule )
{
. . .
$ schedule -> command ( ' sitemap:generate ' )-> daily ();
. . .
}
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Starten Sie zunächst den Testserver in einer separaten Terminalsitzung:
cd tests/server
./start_server.sh
Bei laufendem Server können Sie die Tests ausführen:
$ composer test
Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie einen Sicherheitsfehler gefunden haben, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Spatie ist eine Webdesign-Agentur mit Sitz in Antwerpen, Belgien. Eine Übersicht aller unserer Open-Source-Projekte finden Sie auf unserer Website.
Ist Ihr Unternehmen auf unsere Beiträge angewiesen? Kontaktieren Sie uns und unterstützen Sie uns auf Patreon. Alle Zusagen dienen der Bereitstellung von Arbeitskräften für Wartung und neue tolle Dinge.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.