使用Laravel动态生成sitemap

简介: Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

什么是Sitemap?Sitemap的作用是什么?


Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

之前用yaf和yii框架写过sitemap:思路是根据需求生成.xml文件保存到项目指定目录中。


今天用laravel换一个思路实现:生成.xml动态链接,而不是保存文件到目录。

核心思路


  1. 配置routes,生成xml访问链接
  2. 根据项目逻辑生成sitemap


上代码:


  • 配置routes


//sitemap
    Route::get('/sitemap/m/{type}.xml', 'SitemapController@siteMap');


  • 核心代码


<?php
class SitemapController extends BaseController
{
    //写一个汇总文件
    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 = [];
        //多模块的sitemap分类使用Switch case分离
        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);
    }
    //根据需求取出需要的字段...
    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()
    {
        ...
    }
    protected function getBbsInfo()
    {
        ...
    }
    protected function getAskInfo()
    {
        ...
    }
    protected function getSeriesInfo()
    {
        ...
    }
}


相关文章
|
9月前
|
存储 缓存 前端开发
laravel5.8(十九)laravel 缓存cache
Laravel中的cache为我们提供了三种缓存机制。 Redis,memcache,以及框架的文件缓存。 这里主要看的是cache中的文件缓存。 一:访问多个缓存存储 使用 Cache 门面,你可以使用 store 方法访问不同的缓存存储器,传入 store 方法的键就是 cache 配置文件中 stores 配置数组里列出的相应的存储器: css 复制代码 $value = Cache::store('file')->get('foo'); Cache::store('redis')->put('bar', 'baz', 600); // 10分钟
113 0
|
JavaScript 前端开发 PHP
PHP - Laravel 视图模板(blade.php)导入JS、Css、素材文件并使用
PHP - Laravel 视图模板(blade.php)导入JS、Css、素材文件并使用
556 0
ThinkPHP6.0使用twig作为模板引擎及自定义过滤器
ThinkPHP6.0使用twig作为模板引擎及自定义过滤器
177 0
|
XML 前端开发 JavaScript
Docsify 动态生成文档网站
一个神奇的文档网站生成工具。 docsify 是一个动态生成文档网站的工具。不同于 GitBook、Hexo 的地方是它不会生成将 .md 转成 .html 文件,所有转换工作都是在运行时进行。 这将非常实用,如果只是需要快速的搭建一个小型的文档网站,或者不想因为生成的一堆 .html 文件“污染” commit 记录,只需要创建一个 index.html 就可以开始写文档而且直接部署在 GitHub Pages。 查看 快速开始了解详情。
321 0
|
前端开发 PHP
Laravel8 分页样式问题
一、问题:分页样式只显示上一页和下一页,中间的页码不显示
|
PHP
【laravel项目】@1 加载模板
【laravel项目】@1 加载模板
106 0
【laravel项目】@1 加载模板
|
PHP
laravel的样式加载
laravel的样式加载
122 0
laravel的样式加载
|
PHP
laravel加载样式文件
laravel加载样式文件
112 0
|
SQL XML 应用服务中间件
sitemap,zlbog php 版本写法,网站地图
sitemap,zlbog php 版本写法,网站地图,zblog版本,其他框架,请自行获取文章函数
425 0
sitemap,zlbog php 版本写法,网站地图