迹忆博客
当前位置: 主页 > 学无止境 > 编程语言 > 文章

基于dede系统制作sitemap的xml文件

发布时间: 2016-01-04 作者: 迹忆 浏览次数:

最近在尝试着做SEO,其中有一项为sitemap,百度称其为站点地图,文件中包含要优化的网站上的所有的链接。提交此文件以后有助于百度分析这个网站的所有网页,应该能在一定程度上加快百度收录。

(写这篇文章的目的,主要是想借助于写sitemap文件的过程,分享一下如何对dedecms进行二次开发,在后台添加我们自己想要的功能)

现在网上有很多软件可以直接生成sitemap文件,很是方便。但是自己作为一名程序员,觉得有必要自己实现此项功能。当下我们这个博客使用dedecms搭建的,所以在dedecms后台增加了一项功能,叫做“更新网站sitemap”。

因为百度针对sitemap向我们提供了三中方式,一是 txt格式的文件,二是xml格式的文件,三是sitemap索引格式(当然此种格式也是采用xml数据)。而我在这里选择了第三种方式。

实现过程如下:

一、在后台添加此项功能。

想加入自己的功能,首先要做的就是找到 左边功能列表的页面,在页面中加入自己的功能和实现此功能的文件链接。

此列表文件所在位置为 dede(默认使用的后台目录)/inc/inc_menu.php,我们可以修改此文件来添加我们自己的功能。我添加的功能代码如下:

<m:item name='更新网站地图' link='makehtml_map_guide.php' rank='sys_MakeHtml' target='main' />
<m:item name='更新网站sitemap' link='makexml_map.php' rank='sys_MakeXml' target='main' />
<m:item name='更新RSS文件' link='makehtml_rss.php' rank='sys_MakeHtml' target='main' />
<m:item name='获取JS文件' link='makehtml_js.php' rank='sys_MakeHtml' target='main' />

其中makexml_map.php 是我实现此功能的代码文件。

按照dede系统的文件架构,此php文件需要放在 dede目录下面。添加完成以后打开后台就可以看到我们自己的这项功能了。

更新网站sitemap图

二、功能代码实现

下面介绍如何在dede框架下面进行代码编写。首先引入配置文件 config.php,引入的代码如下所示

require_once(dirname(__FILE__)."/config.php");

如果我们需要操作数据库,这里可以使用一个全局变量 $dsql 只需在引入config.php下面加入

global $dsql;

接着就是此功能的实现逻辑了

第一步生成栏目列表页的url,将这些url按照百度规定的xml格式写入 channel_sitemap.xml文件中。实现代码如下:

$query = "SELECT id,typedir,namerule,namerule2 FROM `onmpw_arctype` WHERE id NOT IN(13) and topid!=4";
$dsql->SetQuery($query);
$dsql->Execute();
while($row = $dsql->GetArray()){
    $sql = "SELECT count(*) from `onmpw_archives` where typeid={$row['id']} or typeid in (select id from `onmpw_arctype` where topid={$row['id']})";
    $res = $dsql->GetOne($sql);
    if ($res['count(*)'] > 0) {
        if ($res['count(*)'] <= $everypage) {
            $typeurl = str_replace('{cmspath}', "http://" . $_SERVER['HTTP_HOST'], $row['typedir']) . "/index.html";
            $urls[]['url'] = $typeurl;
        } else {
            $pagenum = ceil($res['count(*)'] / $everypage);
            for ($i = 1; $i <= $pagenum; $i ++) {
                $typeurl = str_replace('{cmspath}', "http://" . $_SERVER['HTTP_HOST'], $row['typedir']);
                $typeurl = str_replace('{typedir}', $typeurl, str_replace('{tid}_{page}', $row['id'] . "_" . $i, $row['namerule2']));
                $urls[]['url'] = $typeurl;
            }
        }
    }
}
$xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$xml .= "<urlset>\n";
for($i=0;$i<count($urls);$i++){
    $xml .= "<url>\n";
    $xml .= "<loc>{$urls[$i]['url']}</loc>\n";
    $xml .= "</url>\n";
}
$xml .= "</urlset>";
$filename = "channel_sitemap.xml";
$f = fopen($sitemap_dir.$filename, "w");
fwrite($f, $xml);
fclose($f);
$filearr[] = $filename;

这里有一个地方需要注意,在我们写sql语句的时候,在dede中数据表名是带前缀的,所以表名的格式为 onmpw_名称   其中 #@_ 代表数据表名称的前缀,_名称 是数据表名的后半部分

第二步 生成内容页的url,同样将这些url写入 art_sitemap.xml文件中

(这里需要注意的是,因为百度规定一个xml文件所存放的url个数不能超过50000个,如果超过此限制,需将其截取存入多个文件。我这里设置每个文件不能超过5000个url地址)所以这里需先定义个变量用来存放 每个文件存放的url的个数

$everynum = 5000;

接着从数据库中取出所有的已经生成html 的文档,其中的判断条件就是在 archives表中有一个 arcrank字段,此字段的值为0 表示改文档已经生成了html,-2表示已经删除在内容回收站中,-1表示待审核 等等,所以sql语句中的判断条件之一就是使arcrank=0。然后查找文档的总数

$query = "SELECT count(*) FROM `onmpw_archives` a";
$query .= " LEFT JOIN `onmpw_arctype` t ON a.typeid=t.id WHERE t.id NOT IN(13) and topid!=4";
$total = $dsql->GetOne($query);
$total = $total['count(*)'];
 
计算出art_sitemap.xml文件的个数。
核心代码如下:

$num = ceil($total/$everynum);
    for($i=1;$i<=$num;$i++){
        $urls = array();
        $query = "SELECT a.id aid,a.pubdate,t.id tid,typedir,namerule,namerule2 FROM `onmpw_archives` a";
        $query .= " LEFT JOIN `onmpw_arctype` t ON a.typeid=t.id WHERE t.id NOT IN(13) and topid!=4 and arcrank=0 LIMIT ".($i-1)*$everynum.",{$everynum}";
        $dsql->SetQuery($query);
        $dsql->Execute();
        while($res = $dsql->GetArray()){
            $typeurl = str_replace('{cmspath}', "http://" . $_SERVER['HTTP_HOST'], $res['typedir']);
            $typeurl = str_replace('{typedir}', $typeurl, $res['namerule']);
            $typeurl = str_replace('{aid}', $res['aid'], $typeurl);
            $urls[]['url'] = $typeurl;
        }
        $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
        $xml .= "<urlset>\n";
        for($i=0;$i<count($urls);$i++){
            $xml .= "<url>\n";
            $xml .= "<loc>{$urls[$i]['url']}</loc>\n";
            $xml .= "</url>\n";
        }
        $xml .= "</urlset>";
        $filename = "art_sitemap_{$i}.xml";
        $f = fopen($sitemap_dir.$filename, "w");
        fwrite($f, $xml);
        fclose($f);
        $filearr[] = $filename;
        echo "art_sitemap_{$i}.xml successfully!<br />";

第三步 根据一、二两步生成的sitemap文件,生成sitemap索引文件 sitemap_index.xml

$xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$xml .= "<sitemapindex>\n";
for($i=0;$i<count($filearr);$i++){
    $xml .= "<sitemap>\n";
    $xml .= "<loc>{$sitemap_url}{$filearr[$i]}</loc>\n";
    $xml .= "</sitemap>\n";
}
$xml .= "</sitemapindex>\n";
$f = fopen($_SERVER['DOCUMENT_ROOT']."/data/sitemap_index.xml", "w");
fwrite($f, $xml);

三、提交sitemap索引文件,此索引文件的地址为绝对地址,我这里的地址为

http://www.onmpw.com/data/sitemap_index.xml

以上就是我做的sitempa,由于我刚开始接触seo,所以有些地方考虑的还不是很全面,希望大家提出好的建议,谢谢!

赞助
迹忆博客

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: