基于dede系统制作sitemap的xml文件
最近在尝试着做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目录下面。添加完成以后打开后台就可以看到我们自己的这项功能了。
二、功能代码实现
下面介绍如何在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,所以有些地方考虑的还不是很全面,希望大家提出好的建议,谢谢!
相关文章
使用 PHP MySQLi 函数获取最后插入的 ID
发布时间:2023/05/09 浏览次数:85 分类:MySQL
-
本篇文章简要介绍了 PHP mysqli() 函数并演示了如何使用它从 MySQL 数据库中获取最后插入的 ID。它是一个名为 mysqli 的 MySQL 驱动程序扩展版本,
在 PHP 中使用 MongoDB 作为文件存储
发布时间:2023/04/20 浏览次数:133 分类:MongoDB
-
在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。
如何在 PHP 中获取时间差的分钟数
发布时间:2023/03/29 浏览次数:183 分类:PHP
-
本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。