Laravel Sitemap v8 发布:自动分割,XSL 样式表及 crawler v9

11 2026-03-16 14:25:00

Laravel Sitemap v8 版本发布。这个包可以通过爬取整个网站或手动添加网址来生成站点地图。此版本将底层爬虫升级到 v9,增加了一些不错的新功能,并清理了内部结构。

接下来将详细介绍这包的功能以及 v8 版本中的新特性。

通过爬取生成 Sitemap

使用该包最简单的方法是将其指向你的网站,并让它抓取每个页面。

use Spatie\Sitemap\SitemapGenerator;

SitemapGenerator::create('https://example.com')->writeToFile($path);

就是这样。生成器会跟踪所有内部链接,并生成一个完整的 sitemap.xml。你可以使用 shouldCrawl 回调函数来过滤哪些网址最终会出现在站点地图中。

SitemapGenerator::create('https://example.com')
    ->shouldCrawl(function (string $url) {
        return ! str_contains(parse_url($url, PHP_URL_PATH) ?? '', '/admin');
    })
    ->writeToFile($path);

手动生成 Sitemap

如果你更希望拥有完全的控制权,你可以自己构建站点地图。

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(Url::create('/contact'))
    ->writeToFile($path);

你也可以将这两种方法结合起来:让爬虫完成繁重的工作,然后再添加额外的网址。

SitemapGenerator::create('https://example.com')
    ->getSitemap()
    ->add(Url::create('/extra-page'))
    ->writeToFile($path);

直接添加模型

如果你的模型实现了 Sitemapable 接口,你可以直接将其添加到 Sitemap 中。

use Spatie\Sitemap\Contracts\Sitemapable;
use Spatie\Sitemap\Tags\Url;

class Post extends Model implements Sitemapable
{
    public function toSitemapTag(): Url | string | array
    {
        return route('blog.post.show', $this);
    }
}

现在,你可以传递单个模型或整个集合。

Sitemap::create()
    ->add($post)
    ->add(Post::all())
    ->writeToFile($path);

Sitemap 自动分割

大型网站很容易超过站点地图协议对每个文件所允许的 50,000 个 URL 的限制。在 v8 版本中新增了一项功能,你可以在站点地图上调用 maxTagsPerSitemap(),该包将自动将其拆分为多个包含站点地图索引的文件。

Sitemap::create()
    ->maxTagsPerSitemap(10000)
    ->add($allUrls)
    ->writeToFile(public_path('sitemap.xml'));

如果你的站点地图(Sitemap)包含的网址超过 10,000 个,那么它将生成 sitemap_1.xmlsitemap_2.xml 等文件,以及一个引用所有这些文件的 sitemap.xml 索引文件。如果你的站点地图未超过限制,则它会像往常一样只生成一个文件。

XSL 样式表支持

站点地图是 XML 文件,在浏览器中打开时看起来相当粗糙。在 v8 版本中新增了一项功能,你可以附加一个 XSL 样式表,使它们变得易于阅读。

Sitemap::create()
    ->setStylesheet('/sitemap.xsl')
    ->add(Post::all())
    ->writeToFile(public_path('sitemap.xml'));

这在 SitemapSitemapIndex 上都有效。当与 maxTagsPerSitemap() 函数结合使用时,样式表会自动应用于所有拆分的文件和索引。

小结

在幕后,该包已升级为使用 spatie/crawler v9 版本。

该软件包已在 GitHub 上发布。
 

下一篇