前言

PbootCms默认的sitemap是xml格式,对网站前端来说显示不够友好。毕竟这玩意是给搜索引擎看的。

我们来给网站增加一个sitemap.html页面。

方法有很多,你可以通过后台新建一个专题页,命名为sitemap来实现。

这个方法有些缺点,就是在标签循环过程中要手动去除该页面。

作为一个强迫症患者,这个不能忍。

今天我们就来动手PbootCMS增加一个sitemap.html功能页面

话不多说,上教程,以PbootCms v3.1.2示例,其他版本略微差异:

操作步骤

1、打开路由管理页面,路径:apps/common/route.php

大约在40行,注释内容是关于网站地图的前端路由,我们替换成以下内容:

  1.         // 前台及接口路径统一小写URL

  2.         // =======前台路由============

  3.         'home/sitemap.html' => 'home/Sitemap/index'// 站点地图1

  4.         'home/sitemap.xml' => 'home/Sitemap/xml'// 站点地图XML格式

  5.         'home/sitemap.txt' => 'home/Sitemap/linkTxt'// 站点地图TXT格式

  6.         //'home/sitemap' => 'home/Sitemap/xml', // 站点地图默认XML

2、打开sitemap管理控制器,路径:apps/home/controller/SitemapController.php

替换为:

  1. <?php

  2. /**

  3.  * @copyright (C)2016-2099 Hnaoyun Inc.

  4.  * @author XingMeng

  5.  * @email hnxsh@foxmail.com

  6.  * @date 2018年7月15日

  7.  *  生成sitemap文件

  8.  */

  9. namespace apphomecontroller;

  10.  

  11. use coreasicController;

  12. use apphomemodelSitemapModel;

  13. use coreasicUrl;

  14.  

  15. class SitemapController extends Controller

  16. {

  17.     protected $parser;

  18.     protected $htmldir;

  19.     protected $model;

  20.  

  21.     public function __construct()

  22.     {

  23.         $this->model = new SitemapModel();

  24.         $this->parser = new ParserController();

  25.         $this->htmldir = $this->config('tpl_html_dir') ? $this->config('tpl_html_dir') . '/' : '';

  26.     }

  27.  

  28.     public function index(){

  29.         $tpl='sitemap.html';

  30.         $content = parent::parser($this->htmldir . $tpl); // 框架标签解析

  31.         $content = $this->parser->parserBefore($content); // CMS公共标签前置解析

  32.         $content = str_replace('{pboot:pagetitle}','网站地图-{pboot:sitetitle}-{pboot:sitesubtitle}', $content);

  33.         $content = $this->parser->parserPositionLabel($content, 0, '网站地图', Url::home('sitemap')); // CMS当前位置标签解析

  34.         $content = $this->parser->parserSpecialPageSortLabel($content, - 1, '网站地图', Url::home('sitemap')); // 解析分类标签

  35.         $content = $this->parser->parserSearchLabel($content); // 搜索结果标签

  36.         $content = $this->parser->parserAfter($content); // CMS公共标签后置解析

  37.         echo $content; // 搜索页面不缓存

  38.         exit();

  39.     }

  40.  

  41.     public function xml()

  42.     {

  43.         header("Content-type:text/xml;charset=utf-8");

  44.         $str = '<?xml version="1.0" encoding="UTF-8"?>' . " ";

  45.         $str .= '<urlset>' . " ";

  46.         $str .= $this->makeNode('', date('Y-m-d'), '1.00', 'always'); // 根目录

  47.         

  48.         $sorts = $this->model->getSorts();

  49.         $Parser = new ParserController();

  50.         foreach ($sorts as $value) {

  51.             if ($value->outlink) {

  52.                 continue;

  53.             } elseif ($value->type == 1) {

  54.                 $link = $Parser->parserLink(1, $value->urlname, 'about', $value->scode, $value->filename);

  55.                 $str .= $this->makeNode($link, date('Y-m-d'), '0.80', 'daily');

  56.             } else {

  57.                 $link = $Parser->parserLink(2, $value->urlname, 'list', $value->scode, $value->filename);

  58.                 $str .= $this->makeNode($link, date('Y-m-d'), '0.80', 'daily');

  59.                 $contents = $this->model->getSortContent($value->scode);

  60.                 foreach ($contents as $value2) {

  61.                     if ($value2->outlink) { // 外链

  62.                         continue;

  63.                     } else {

  64.                         $link = $Parser->parserLink(2, $value2->urlname, 'content', $value2->scode, $value2->sortfilename, $value2->id, $value2->filename);

  65.                     }

  66.                     $str .= $this->makeNode($link, date('Y-m-d', strtotime($value2->date)), '0.60', 'daily');

  67.                 }

  68.             }

  69.         }

  70.         echo $str . " </urlset>";

  71.     }

  72.  

  73.     // 生成结点信息

  74.     private function makeNode($link, $date, $priority = 0.60, $changefreq = 'always')

  75.     {

  76.         $node = '

  77. <url>

  78.     <loc>' . get_http_url() . $link . '</loc>

  79.     <priority>' . $priority . '</priority>

  80.     <lastmod>' . $date . '</lastmod>

  81.     <changefreq>' . $changefreq . '</changefreq>

  82. </url>';

  83.         return $node;

  84.     }

  85.  

  86.     // 文本格式

  87.     public function linkTxt()

  88.     {

  89.         $sorts = $this->model->getSorts();

  90.         $Parser = new ParserController();

  91.         $str = get_http_url() . " ";

  92.         foreach ($sorts as $value) {

  93.             if ($value->outlink) {

  94.                 continue;

  95.             } elseif ($value->type == 1) {

  96.                 $link = $Parser->parserLink(1, $value->urlname, 'about', $value->scode, $value->filename);

  97.             } else {

  98.                 $link = $Parser->parserLink(2, $value->urlname, 'list', $value->scode, $value->filename);

  99.                 $str .= get_http_url() . $link . " ";

  100.                 $contents = $this->model->getSortContent($value->scode);

  101.                 foreach ($contents as $value2) {

  102.                     if ($value2->outlink) { // 外链

  103.                         continue;

  104.                     } else {

  105.                         $link = $Parser->parserLink(2, $value2->urlname, 'content', $value2->scode, $value2->sortfilename, $value2->id, $value2->filename);

  106.                     }

  107.                     $str .= get_http_url() . $link . " ";

  108.                 }

  109.             }

  110.         }

  111.         echo $str;

  112.     }

  113. }

3、在网站模板下新建一个sitemap.html页面,通常是在 template模板文件夹htmlsitemap.html

在该模板中引入公用文件后。在正文部分插入以下代码:

  1. <div class="sitemap">

  2.     {pboot:nav}

  3.     <dl>

  4.         <dt><a href="[nav:link]">[nav:name]</a></dt>

  5.         {pboot:if([nav:soncount]>0)}

  6.         <dd>

  7.         {pboot:2nav parent=[nav:scode]}

  8.         <a href="[2nav:link]">[2nav:name]</a>

  9.         {/pboot:2nav}

  10.         </dd>

  11.         {/pboot:if}

  12.     </dl>

  13.     {/pboot:nav}

  14. </div>

到此,html格式的网站地图制作完成。

效果可以看本站的网站地图:网站地图-PbootCMS建站博客