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
相关产品推荐
相关产品推荐

