第一种方法:
<?php
class Sitemap extends CController{
protected $webSiteTitle = '';
protected $changefreq = '';
protected $content = '';
protected $priority = '';
protected $blogItems = array();
protected $tagItems = array();
protected $categoryItems = array();
protected $items = array();
/**
* 添加基本信息
* @param string $title
* @param string $link
* @param string $description
*/
public function __construct() {
$this->webSiteTitle = 'http://'.$_SERVER['SERVER_NAME'];
$this->changefreq = 'daily';//always hourly daily weekly monthly yearly never
$this->priority = 0.5;
}
/**
* 分类
*/
private function categorySitemap(){
$criteria = new CDbCriteria();
$criteria->condition = 'category=:category';
$criteria->params = array(':category'=>'blog');
$criteria->order = 'create_date DESC';
$result = Type::model()->findAll($criteria);
foreach($result as $k=>$v){
$this->categoryItems[] = array(
'url'=>$this->webSiteTitle.'/category/'.urlencode($v->name),
'date'=>date(DATE_W3C, strtotime($v->update_date))
);
}
}
/**
* 文章
*/
private function blogSitemap(){
$criteria = new CDbCriteria();
$criteria->condition = 'is_lock=0 and is_delete=0';
$criteria->select = 'id, tag, update_date';
$criteria->order = 'create_date DESC';
$model = Blog::model()->findAll($criteria);
foreach($model as $k=>$v){
$this->blogItems[] = array(
'url'=>$this->webSiteTitle.'/blog/'.$v->id,
'date'=>date(DATE_W3C, strtotime($v->update_date))
);
$tagArr = preg_split('#,|,#i', $v->tag);
if(!empty($tagArr)){
foreach($tagArr as $k=>$v){
if(!in_array($v,$this->tagItems)){
$this->tagItems[] = $v;
}
}
}
}
//创建临时函数数组
$tmp = array();
$tmp = $this->tagItems;
$this->tagItems = array();
foreach($tmp as $k=>$v){
$this->tagItems[] = array(
'url'=>$this->webSiteTitle.'/tag/'.urlencode($v),
'date'=>date(DATE_W3C, time())
);
}
unset($tmp);
}
/**
* 构建xml元素
*/
public function buildSitemap() {
$blogitem = '';
foreach($this->blogItems as $k=>$v){
$blogitem .= <<<BLOG
<url>\r\n
<loc>{$v['url']}</loc>\r\n
<lastmod>{$v['date']}</lastmod>\r\n
<changefreq>{$this->changefreq}</changefreq>\r\n
<priority>{$this->priority}</priority>\r\n
</url>\r\n
BLOG;
}
$categoryitem = '';
foreach($this->categoryItems as $k=>$v){
$categoryitem .= <<<BLOG
<url>\r\n
<loc>{$v['url']}</loc>\r\n
<lastmod>{$v['date']}</lastmod>\r\n
<changefreq>{$this->changefreq}</changefreq>\r\n
<priority>{$this->priority}</priority>\r\n
</url>\r\n
BLOG;
}
$tagitem = '';
foreach($this->tagItems as $k=>$v){
$tagitem .= <<<BLOG
<url>\r\n
<loc>{$v['url']}</loc>\r\n
<lastmod>{$v['date']}</lastmod>\r\n
<changefreq>{$this->changefreq}</changefreq>\r\n
<priority>{$this->priority}</priority>\r\n
</url>\r\n
BLOG;
}
$this->content = <<<SITEMAP
<?xml version='1.0' encoding='UTF-8'?>\r\n
<?xml-stylesheet type="text/xsl" href="{$this->webSiteTitle}/sitemap.xsl"?>
<!-- generator="GoWhich/1.0" -->
<!-- sitemap-generator-url="{$this->webSiteTitle}" sitemap-generator-version="1.0.0" -->
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r\n
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"\r\n
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\r\n
{$blogitem}
{$categoryitem}
{$tagitem}
</urlset>\r\n
SITEMAP;
}
/**
* 输出sitemap内容
*/
function show() {
$this->blogSitemap();
$this->categorySitemap();
if (empty($this->content)) {
$this->buildSitemap();
}
return $this->content;
}
/**
* 将rss保存为文件
* @param String $fname
* @return boolean
*/
function saveToFile($fname) {
$handle = fopen($fname, 'wb');
if ($handle === false){
return false;
}
fwrite($handle, $this->content);
fclose($handle);
}
/**
* 获取文件的内容
* @param String $fname
* @return boolean
*/
function getFile($fname) {
$handle = fopen($fname, 'r');
if ($handle === false){
return false;
}
while(!feof($handle)){
echo fgets($handle);
}
fclose($handle);
}
}
?>
Controller中我建立了两个action
/**
* sitemap列表
*/
public function actionSitemap(){
//rss创建
$obj = new Sitemap();
$this->render('sitemap',array('rss'=>$obj->show()));
}
public function actionSitemapXsl(){
$this->render('sitemapxsl');
}
View的两个文件的代码如下
sitemap.php
<?php
/* @var $this FeedController */
header("Content-Type: text/xml; charset=utf-8");
echo $rss;
exit;
?>
sitemapxsl.php
<?php
header("Content-Type: text/xml; charset=utf-8");
?>
<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XML Sitemap</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body {
font-family:"Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana;
font-size:13px;
}
#intro {
background-color:#CFEBF7;
border:1px #2580B2 solid;
padding:5px 13px 5px 13px;
margin:10px;
}
#intro p {
line-height: 16.8667px;
}
td {
font-size:11px;
}
th {
text-align:left;
padding-right:30px;
font-size:11px;
}
tr.high {
background-color:whitesmoke;
}
#footer {
padding:2px;
margin:10px;
font-size:8pt;
color:gray;
}
#footer a {
color:gray;
}
a {
color:black;
}
</style>
</head>
<body>
<h1>XML Sitemap</h1>
<div id="intro">
<p>
This is a XML Sitemap which is supposed to be processed by search engines like <a href="http://shouce.ren">Google</a>, <a href="http://search.msn.com">MSN Search</a> and <a href="http://www.yahoo.com">YAHOO</a>.<br />
It was generated using the Blogging-Software <a href="http://gowhich.com/">GoWhich</a> and the <a href="http://www.gowhich.com/sitemap.xml" title="Google Sitemap Generator Plugin for GoWhich">Google Sitemap Generator Plugin</a> by <a href="http://www.gowhich.com/">GoWhich</a>.<br />
You can find more information about XML sitemaps on <a href="http://sitemaps.org">sitemaps.org</a> and Google's <a href="http://code.google.com/sm_thirdparty.html">list of sitemap programs</a>.
</p>
</div>
<div id="content">
<table cellpadding="5">
<tr style="border-bottom:1px black solid;">
<th>URL</th>
<th>Priority</th>
<th>Change Frequency</th>
<th>LastChange (GMT)</th>
</tr>
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:for-each select="sitemap:urlset/sitemap:url">
<tr>
<xsl:if test="position() mod 2 != 1">
<xsl:attribute name="class">high</xsl:attribute>
</xsl:if>
<td>
<xsl:variable name="itemURL">
<xsl:value-of select="sitemap:loc"/>
</xsl:variable>
<a href="{\$itemURL}">
<xsl:value-of select="sitemap:loc"/>
</a>
</td>
<td>
<xsl:value-of select="concat(sitemap:priority*100,'%')"/>
</td>
<td>
<xsl:value-of select="concat(translate(substring(sitemap:changefreq, 1, 1),concat(\$lower, \$upper),concat(\$upper, \$lower)),substring(sitemap:changefreq, 2))"/>
</td>
<td>
<xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))"/>
</td>
</tr>
</xsl:for-each>
</table>
</div>
<div id="footer">
Generated with <a href="http://www.gowhich.com/sitemap.xml" title="Google Sitemap Generator Plugin for GoWhich">Google Sitemap Generator Plugin for GoWhich</a> by <a href="http://www.gowhich.com/">GoWhich</a>. This XSLT template is released under GPL.
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML;
echo $xml;
exit;
?>为了使得url看起来好看一点。
我做了一下路由设置
'sitemap.xsl'=>'site/sitemapxsl', 'sitemap.xml'=>'site/sitemap',
第二种方法:
yii-sitemap-generator 是一个生成网站 sitemap 的 Yii 框架 扩展
如何使用
1. 下载文件解压到 /protected/extensions 文件夹下
2. 修改配置文件 /protected/config/main.php, 如下
'components'=>array(
...
'sitemap'=>array(
'class'=>'ext.yii-sitemap-generator.Sitemap',
'basePath'=>dirname(__DIR__).'/www',
'urls'=>array(
array('site/index','frequency'=>'always','priority'=>'1.0'),
array('site/page','view'=>'about','frequency'=>'always','priority'=>'1.0'),
array('site/contact','frequency'=>'weekly','priority'=>'0.2'),
array('model'=>'Post','url'=>array('post/view','id'=>'id'),'frequency'=>'daily','priority'=>'0.2'),
)
),
...
)其中,urls 的格式分为两种
1). 基于模型的 URL,如上面的
array('model'=>'Post','url'=>array('post/view','id'=>'id'),'frequency'=>'daily','priority'=>'0.2')
model 表示模型的类名; url 构建 URL,数组第一位相当与 yii 的 route,后面的参数使用 K=>V 值对,K表示参数名,V表示模型中的 V 属性值,如上面的 V id 指的是 Post 模型实例化对象的 id 属性值;frequency 表示更新频次,与sitemap语法中的changefreq 相同;priority 表示权重,与 sitemap 中的 priority 相同。2). 基本 URL 如上面的
array('site/page','view'=>'about','frequency'=>'always','priority'=>'1.0')
frequency 和 priority 与上面相同,注意的是,数组第一项必须为 yii 的 route
3. 在 consloe 中生成
创建 protected/commands/SitemapCommand.php
<?php
class SitemapCommand extends CConsoleCommand {
public function actionIndex() {
$sitemap = Yii::app()->sitemap;
$sitemap->generate();
}
}运行命令 yiic sitemap 就可以生成站点 Sitemap 了,你可以创建一个cron job 定时执行这个命令,达到定时更新 sitemap 的目的
在 Controller 中生成的使用方法也是一样,直接使用 Yii::app()->sitemap 就可以返回 Sitemap 类了。
yii-sitemap-generator 下载