You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter中创建动态站点地图?XML输出异常求助

解决CodeIgniter生成XML站点地图异常的问题

让我们一步步排查并修复你遇到的问题:

1. 修复控制器中的数据赋值逻辑混乱

你的控制器里这段代码存在逻辑混淆:

$query= $this->db->query("SELECT url_slug FROM snippets UNION SELECT tag_name FROM tags");
$data = $query->result();
$data['items'] =$data;

这里$data = $query->result()已经把查询结果(对象数组)赋值给了$data,随后又把这个数组赋值给$data['items'],会导致$data变成一个嵌套数组,虽然视图可能还能拿到$items,但写法不规范,容易引发后续问题。应该改成:

$query = $this->db->query("SELECT url_slug AS slug, 'snippet' AS type FROM snippets UNION SELECT tag_name AS slug, 'tag' AS type FROM tags");
// 先将查询结果单独存储,再放入$data数组传递给视图
$items = $query->result();
$data['items'] = $items;

2. 修正UNION查询的字段一致性与URL路径错误

你的UNION查询中,第一个表取url_slug,第二个表取tag_name,查询结果的字段名会沿用第一个查询的url_slug,但标签记录的实际内容是标签名,而且标签对应的URL应该是tag/标签名而非item/标签名吧?

我们需要给字段统一别名,同时区分两种记录类型,这样视图里就能生成正确的URL:
修改查询语句为:

$query = $this->db->query("
    SELECT url_slug AS slug, 'snippet' AS type FROM snippets 
    UNION 
    SELECT tag_name AS slug, 'tag' AS type FROM tags
");

然后在视图里根据类型生成对应URL:

<?php foreach($items as $item) { ?>
<url>
    <loc><?php echo base_url() . ($item->type === 'snippet' ? 'item/' : 'tag/') . $item->slug ?></loc>
    <priority>0.5</priority>
    <changefreq>daily</changefreq>
</url>
<?php } ?>

3. 设置正确的HTTP响应头(关键修复)

这是导致XML显示异常的核心原因!你没有告诉浏览器输出的是XML内容,浏览器会默认按HTML解析,导致格式混乱。在控制器的index方法开头添加:

// 设置XML内容类型响应头
$this->output->set_content_type('application/xml');

4. 优化视图的XML声明格式

视图里的XML声明可以调整得更规范,避免不必要的空格:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

完整修复后的代码

控制器Sitemap.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Sitemap extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->database();
        $this->load->model('Constant_model');
        $this->load->helper('xml');
    }
    public function index() {
        // 设置XML响应头
        $this->output->set_content_type('application/xml');
        
        $query = $this->db->query("
            SELECT url_slug AS slug, 'snippet' AS type FROM snippets 
            UNION 
            SELECT tag_name AS slug, 'tag' AS type FROM tags
        ");
        $items = $query->result();
        $data['items'] = $items;
        
        $this->load->view('sitemap', $data);
    }
}

视图sitemap.php

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc><?php echo base_url();?></loc>
        <priority>1.0</priority>
        <changefreq>daily</changefreq>
    </url>
    <?php foreach($items as $item) { ?>
    <url>
        <loc><?php echo base_url() . ($item->type === 'snippet' ? 'item/' : 'tag/') . $item->slug ?></loc>
        <priority>0.5</priority>
        <changefreq>daily</changefreq>
    </url>
    <?php } ?>
</urlset>

现在访问你的sitemap控制器(比如http://your-domain.com/sitemap),应该就能看到格式正确的XML站点地图了。

内容的提问来源于stack exchange,提问作者Hitesh Chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:22:43