thinkphp5.1创建站点地图sitemap(适用于thinkphp3.2.3)
2020-07-05 网络
本程序是在thinkphp5.1环境下测试,同样也适用于thinkphp3.2.3版本;运行后的案例图如下:
首先在app/admin/common下创建Stemap.php类,代码如下:
/** * Sitemap输出和生成类 */ namespace app\admin\common; //类定义开始 class Sitemap { private $config = array( 'encoding' => 'UTF-8', 'ver' => '1.0' ); private $content = ''; // Items部分 private $items = array(); public function __get($name){ if(isset($this->config[$name])) { return $this->config[$name]; } return null; } public function __set($name,$value){ if(isset($this->config[$name])) { $this->config[$name] = $value; } } public function __isset($name){ return isset($this->config[$name]); } public function content($name){ if (empty($this->content)) $this->Build(); $this->content; } /** * 架构函数 * @access public * @param array $config 上传参数 */ public function __construct() { } /**************************************************************************/ // 函数名: AddItem // 功能: 添加一个节点 //$changefreq | always 经常,hourly 每小时,daily 每天,weekly 每周,monthly 每月,yearly 每年,never 从不 /**************************************************************************/ function AddItem($loc, $priority ,$times,$changefreq) { $arr = array( 1, 0.9, 0.8, 0.7, 0.6, 0.5 ); $this->items[] = array( 'loc' => $loc, 'priority' => $priority, 'lastmod' => date('c', $times), 'changefreq' => $changefreq ); } /**************************************************************************/ // 函数名: Build // 功能: 生成sitemap xml文件内容 /**************************************************************************/ function Build() { $s = "encoding}'?>\r\n"; /*$s .= "";*/ $s .= "\t\r\n"; // items for ($i=0;$iitems);$i++) { $s .= "\t\t\n"; $s .= "\t\t\t{$this->items[$i]['loc']}\r\n"; $s .= "\t\t\t{$this->items[$i]['priority']}\r\n"; $s .= "\t\t\t{$this->items[$i]['lastmod']}\r\n"; $s .= "\t\t\t{$this->items[$i]['changefreq']}\r\n"; $s .= "\t\t\n"; } // close $s .= "\t"; $this->content = $s; } /**************************************************************************/ // 函数名: Show // 功能: 将产生的sitemap内容直接打印输出 /**************************************************************************/ function Show() { header("Content-Type: text/xml; charset=utf-8"); if (empty($this->content)) $this->Build(); echo($this->content); } /**************************************************************************/ // 函数名: SaveToFile // 功能: 将产生的sitemap 内容保存到文件 // 参数: $fname 要保存的文件名 /**************************************************************************/ function SaveToFile($fname) { if (empty($this->content)) $this->Build(); $handle = fopen($fname, 'w+'); if ($handle === false) return false; fwrite($handle, $this->content); fclose($handle); } /**************************************************************************/ // 函数名: getFile // 功能: 从文件中获取输出 // 参数: $fname 文件名 /**************************************************************************/ function getFile($fname) { $handle = fopen($fname, 'r'); if ($handle === false) return false; while(!feof($handle)){ echo fgets($handle); } fclose($handle); } }
然后在后台的控制器中创建一个生成站点地图的控制器:Sitemap.php,代码如下:
namespace app\admin\controller; use think\Db; use app\admin\common\Sitemap as Site; class Sitemap extends Base{ public function index(){ $sitemap = new Site(); //首页 $sitemap->AddItem(config('WEBSITE_URL'), 1, time(), 'daily'); //栏目页 $catelist = Db::name('Category')->select(); foreach ($catelist as $val){ $sitemap->AddItem(config('WEBSITE_URL').'/'.$val['slug'], '0.8', time(), 'daily'); } //详情页 $postlist = Db::name('Post'))->order('id desc')->select(); foreach($postlist as $v){ $sitemap->AddItem(config('WEBSITE_URL').'/'.$v['cateslug'].'/'.$v['slug'].'.html', '0.5', $v['add_time'], 'weekly'); } $sitemap->SaveToFile('sitemap.xml'); //生成地址为项目根目录 if($sitemap){ $this->success('创建成功'); } else { $this->error('创建失败'); } } }