CodeIgniter 动态生成 XML Sitemap 站点地图的完整实现
在构建基于 CodeIgniter 的内容管理系统时,自动生成标准化的 XML Sitemap(站点地图)是提升 SEO 效率的关键步骤。本方法利用框架原生的 Model-View-Controller (MVC) 模式,从数据库实时拉取数据并渲染为符合 W3C 标准的 XML 格式,有效解决因服务器配置或权限限制导致的静态文件生成难题。
结果与目标
我们需要一个能够通过访问特定 URL 自动返回标准 sitemap.xml 内容或生成本地文件的接口。该接口需包含首页、分类列表页、文章详情页及留言板等关键页面的 <url> 标签,且包含 loc、lastmod、changefreq 和 priority 属性。
准备条件
- 已安装并配置好 CodeIgniter 基础环境。
- 数据库中存在存储文章的表(如
posts)和存储分类的表(如category)。 - 具备基本的 PHP 操作知识及 CodeIgniter 路由规则理解能力。
真实操作顺序
第一步:建立 Sitemap 控制器 (Controller)
目的:创建接收请求并协调数据获取与视图渲染的中心入口。
入口:application/controllers/Sitemap.php
动作:
新建名为 Sitemap 的控制器类,继承自 CI_Controller。在构造函数中加载对应的模型以准备数据源。定义 index 方法用于处理默认访问请求,从模型层获取文章数据和分类数据,并传递给视图模板进行最终渲染。
<?php
if (!defined('BASEPATH'))
exit ('No direct script access allowed');
class Sitemap extends CI_Controller{
public function __construct() {
parent::__construct();
$this->load->model('sitemapxml');
}
function index(){
$data['posts']=$this->sitemapxml->getArticle();
$data['categorys']=$this->sitemapxml->getCategory();
$this->load->view('sitemap.php',$data);
}
}
第二步:创建数据查询模型 (Model)
目的:封装数据库查询逻辑,解耦业务逻辑与数据存储。
入口:application/models/Sitemapxml.php
动作:
新建名为 Sitemapxml 的模型类。实现两个核心方法:
1. getArticle():查询文章表,按发布日期降序排列,提取 ID、发布时间和标题/别名。
2. getCategory():查询分类表,提取分类名称或别名。
这两个数组将提供给视图层遍历生成 XML。
<?php
class Sitemapxml extends CI_Model{
public function __construct() {
parent :: __construct();
$this->load->database();
}
public function getArticle(){
$this->db->select('ID,post_date,post_name');
$this->db->order_by('post_date', 'desc');
$result=$this->db->get('posts');
return $result->result_array();
}
public function getCategory(){
$this->db->select('c_sname');
$result=$this->db->get('category');
return $result->result_array();
}
}
第三步:构建 XML 模板视图 (View)
目的:按照标准 XML Sitemap 语法,结合 PHP 循环结构输出最终的 XML 代码。
入口:application/views/sitemap.php
动作:
创建一个 PHP 脚本作为视图文件。首先输出 XML 声明和根节点 <urlset>。接着分别针对以下四类页面生成 <url> 块:
1. **首页**:设定最高优先级和每日更新频率。
2. **分类页**:遍历模型传来的分类数据,构造对应链接。
3. **文章页**:遍历文章数据,使用实际发布日期作为最后修改时间。
4. **留言板/其他页**:如需固定展示的非动态页面,硬编码其信息。
注意:必须使用 htmlspecialchars() 对输出的 HTML/XML 实体字符进行转义,防止注入或解析错误;同时手动控制换行以确保生成的文本可读性。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sitemap</title>
</head>
<body>
<?php
echo htmlspecialchars('<?xml version="1.0" encoding="utf-8"?>').'<br/>';
echo htmlspecialchars('<urlset>').'<br/>';
//首页单独写一个url
echo htmlspecialchars('<url>').'<br/>';
echo htmlspecialchars(' <loc>').'http://aa.sinaapp.com'.htmlspecialchars('</loc>').'<br/>';
echo htmlspecialchars('<lastmod>').date('Y-m-d',time()).htmlspecialchars('</lastmod>').'<br/>';
echo htmlspecialchars('<changefreq>').'daily'.htmlspecialchars('</changefreq>').'<br/>';
echo htmlspecialchars('<priority>').'1'.htmlspecialchars('</priority>').'<br/>';
echo htmlspecialchars('</url>').'<br/>';
//类别页
foreach ($categorys as $category){
echo htmlspecialchars('<url>').'<br/>';
echo htmlspecialchars(' <loc>').'http://aa.sinaapp.com/index.php/home/cat/'.$category['c_sname'].htmlspecialchars('</loc>').'<br/>';
echo htmlspecialchars('<lastmod>').date('Y-m-d',time()).htmlspecialchars('</lastmod>').'<br/>';
echo htmlspecialchars('<changefreq>').'weekly'.htmlspecialchars('</changefreq>').'<br/>';
echo htmlspecialchars('<priority>').'0.8'.htmlspecialchars('</priority>').'<br/>';
echo htmlspecialchars('</url>').'<br/>';
}
//文章页
foreach ($posts as $post){
echo htmlspecialchars('<url>').'<br/>';
echo htmlspecialchars(' <loc>').'http://aa.sinaapp.com/index.php/home/details/'.$post['post_name'].htmlspecialchars('</loc>').'<br/>';
echo htmlspecialchars('<lastmod>').date('Y-m-d',strtotime($post['post_date'])).htmlspecialchars('</lastmod>').'<br/>';
echo htmlspecialchars('<changefreq>').'weekly'.htmlspecialchars('</changefreq>').'<br/>';
echo htmlspecialchars('<priority>').'0.6'.htmlspecialchars('</priority>').'<br/>';
echo htmlspecialchars('</url>').'<br/>';
}
//留言板
echo htmlspecialchars('<url>').'<br/>';
echo htmlspecialchars(' <loc>').'http://aa.sinaapp.com/index.php/guest'.htmlspecialchars('</loc>').'<br/>';
echo htmlspecialchars('<lastmod>').date('Y-m-d',time()).htmlspecialchars('</lastmod>').'<br/>';
echo htmlspecialchars('<changefreq>').'weekly'.htmlspecialchars('</changefreq>').'<br/>';
echo htmlspecialchars('<priority>').'0.5'.htmlspecialchars('</priority>').'<br/>';
echo htmlspecialchars('</url>').'<br/>';
echo htmlspecialchars('</urlset>');
?>
</body>
</html>
完成判断
当在浏览器中访问配置的 Sitemap 控制器地址(通常为 /sitemap 或类似路由)时,页面源代码应呈现完整的 XML 结构,包含 <?xml...> 开头和 </urlset> 结尾,中间包含所有动态数据填充的 <url> 标签。
若服务器环境限制直接执行 PHP 文件下载(例如部分云平台 SAE 部署),可将上述生成的 HTML/文本源码复制并保存为 sitemap.xml 文件,随后上传至网站根目录即可被搜索引擎抓取。
简要总结
以上就是基于 CodeIgniter 框架生成网站 sitemap 地图的详细内容,更多关于 PHP 网站建设与 SEO 优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









