You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

spatie/laravel-sitemap新增URL时完全覆盖原有文件问题求助

问题根因

覆盖问题的核心是writeToFile()方法被放在了foreach循环内部,每遍历一个关键词就会执行一次写入操作,每次写入都会直接覆盖原有文件内容,最终文件中只会保留最后一次循环生成的2条URL。

解决方案

根据你的实际需求选择对应方案即可:

  • 方案1:本次需要生成包含所有关键词对应URL的全新sitemap
    只需把writeToFile()移到foreach循环外部,所有URL添加完成后再一次性写入文件:
    $keywords = Keyword::all();
    $sitemap =  SitemapGenerator::create(config('app.url'))
        ->getSitemap();
    $location = Location::where('id', $location_id)
        ->select('id', 'name', 'city_id')
        ->with('city:id,name')
        ->first();
    
    foreach ($keywords as $keyword) {
        $url  = Url::create("/toptechnicians/{$keyword->keyword}/{$location->city->name}/{$location->name}");
        $url2 = Url::create("/topbusinesses/{$keyword->keyword}/{$location->city->name}/{$location->name}");
        $sitemap
            ->add($url
                    ->setLastModificationDate(Carbon::yesterday())
                    ->setChangeFrequency(Url::CHANGE_FREQUENCY_YEARLY)
                    ->setPriority(0.1))
            ->add($url2
                    ->setLastModificationDate(Carbon::yesterday())
                    ->setChangeFrequency(Url::CHANGE_FREQUENCY_YEARLY)
                    ->setPriority(0.1));
    }
    
    // 所有URL添加完成后统一写入文件
    $sitemap->writeToFile(public_path('sitemap.xml'));
    
  • 方案2:需要在已有的旧sitemap.xml基础上追加新URL,不覆盖原有内容
    先读取已有sitemap的内容,追加新URL后再写入文件即可:
    // 读取已有sitemap文件
    $sitemap = Sitemap::read(public_path('sitemap.xml'));
    
    $location = Location::where('id', $location_id)
        ->select('id', 'name', 'city_id')
        ->with('city:id,name')
        ->first();
    $keywords = Keyword::all();
    
    foreach ($keywords as $keyword) {
        $url  = Url::create("/toptechnicians/{$keyword->keyword}/{$location->city->name}/{$location->name}");
        $url2 = Url::create("/topbusinesses/{$keyword->keyword}/{$location->city->name}/{$location->name}");
        $sitemap
            ->add($url
                    ->setLastModificationDate(Carbon::yesterday())
                    ->setChangeFrequency(Url::CHANGE_FREQUENCY_YEARLY)
                    ->setPriority(0.1))
            ->add($url2
                    ->setLastModificationDate(Carbon::yesterday())
                    ->setChangeFrequency(Url::CHANGE_FREQUENCY_YEARLY)
                    ->setPriority(0.1));
    }
    
    $sitemap->writeToFile(public_path('sitemap.xml'));
    

小提示:追加场景下可先判断URL是否已存在再执行添加,避免生成重复内容。

内容的提问来源于stack exchange,提问作者Udipta Gogoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:36:04