这篇文章给大家分享的是有关怎么用laravel生成sitemap的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
之前用yaf和yii框架写过sitemap:思路是根据需求生成.xml文件保存到项目指定目录中。
用laravel换一个思路,生成.xml动态链接,而不是保存文件到目录
1.配置routes,生成xml访问链接
2.根据项目逻辑生成sitemap
上代码:
配置routes
//sitemap
Route::get('/sitemap/m/{type}.xml', 'SitemapController@siteMap');
核心代码
<?php
namespace App\Http\Controllers\M;
use App\Http\Controllers\BaseController;
use App\Model\Bbs\Article;
use App\Model\Bbs\Ask;
use App\Model\Bbs\Thread;
use App\Model\Main\Video;
use App\Model\Garage\SeriesInfoModel;
//todo 补充其他模块
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;
class SitemapController extends BaseController
{
//todo 写一个汇总文件
public function siteMap($type)
{
$cacheKey = "site-" . $type;
//2小时缓存 保证加载速度
if (Cache::has($cacheKey)) {
$siteMap = Cache::get($cacheKey);
} else {
$siteMap = $this->buildSiteMap($type);
Cache::add($cacheKey, $siteMap, 120);
}
return response($siteMap)
->header('Content-type', 'text/xml');
}
/**
* Build the Site Map
*/
protected function buildSiteMap($type)
{
$sitemapInfo = [];
switch ($type) {
case 'video':
$sitemapInfo = $this->getVideoInfo();
break;
case 'article':
$sitemapInfo = $this->getArticleInfo();
break;
case 'bbs':
$sitemapInfo = $this->getBbsInfo();
break;
case 'ask':
$sitemapInfo = $this->getAskInfo();
break;
case 'series':
$sitemapInfo = $this->getSeriesInfo();//车型库
break;
}
$lastmod = $sitemapInfo[0]['pub_time'];
$xml = [];
$xml[] = '<?xml version="1.0" encoding="UTF-8"?' . '>';
$xml[] = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">';
$xml[] = ' <url>';
$xml[] = " <loc>https://m.xxx.com</loc>";
$xml[] = " <lastmod>$lastmod</lastmod>";
$xml[] = ' <changefreq>daily</changefreq>';
$xml[] = ' <priority>0.8</priority>';
$xml[] = ' </url>';
foreach ($sitemapInfo as $sitemap) {
$xml[] = ' <url>';
$xml[] = " <loc>{$sitemap['url']}</loc>";
$xml[] = " <mobile:mobile type=\"mobile\"/>";
$xml[] = " <lastmod>{$sitemap['pub_time']}</lastmod>";
$xml[] = " </url>";
}
$xml[] = '</urlset>';
return join("\n", $xml);
}
/**
* Return all the posts as $url => $date
*/
protected function getVideoInfo()
{
$videos = Video::where('pub_time', '<=', Carbon::now())
->where('published', 2)
->where('is_del', 0)
->orderBy('id', 'desc')
->pluck('pub_time', 'id')
->all();
$res = $article = [];
foreach ($videos as $id => $pub_time) {
$article['id'] = $id;
$article['pub_time'] = substr($pub_time, 0, 10);
$article['url'] = "https://m.xxx.com/video_" . $id . ".html";
$res[] = $article;
}
return $res;
}
protected function getArticleInfo()
{
$articles = Article::where('pub_time', '<=', Carbon::now())
->where('published', 2)
->where('is_del', 0)
->orderBy('id', 'desc')
->pluck('pub_time', 'id')
->take(5000)
->all();
$res = $article = [];
foreach ($articles as $id => $pub_time) {
$article['id'] = $id;
$article['pub_time'] = substr($pub_time, 0, 10);
$article['url'] = "https://m.xxx.com/news/article_" . $id . ".html";
$res[] = $article;
}
return $res;
}
protected function getBbsInfo()
{
$articles = Thread::where('visible', 1)
->where('is_del', 0)
->orderBy('id', 'desc')
->pluck('dateline', 'id')
->take(10000)
->all();
$res = $article = [];
foreach ($articles as $id => $pub_time) {
$article['id'] = $id;
$article['pub_time'] = substr($pub_time, 0, 10);
$article['url'] = "https://m.xxx.com/bbs/thread_" . $id . ".html";
$res[] = $article;
}
return $res;
}
protected function getAskInfo()
{
$articles = Ask::where('state', 1)
->orderBy('id', 'desc')
->pluck('dateline', 'id')
->take(10000)
->all();
$res = $article = [];
foreach ($articles as $id => $pub_time) {
$article['id'] = $id;
$article['pub_time'] = substr($pub_time, 0, 10);
$article['url'] = "https://m.xxx.com/ask_" . $id . ".html";
$res[] = $article;
}
return $res;
}
//车型库
protected function getSeriesInfo()
{
$articles = SeriesInfoModel::where('status', 1)
->where('is_stop', 0)
->pluck('name', 'id')
->all();
$res = $article = [];
foreach ($articles as $id => $pub_time) {
$article['id'] = $id;
$article['pub_time'] = date('Y-m-d', time());
$article['url'] = "https://m.xxx.com/series/" . $id . "/details";
$res[] = $article;
}
return $res;
}
}
感谢各位的阅读!关于“怎么用laravel生成sitemap”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.xuebuyuan.com/3278388.html