DEDECMS是最优秀的中文开源CMS系统之一了,不过,DEDE系统也不是尽善尽美的,存在许多待改善的地方,且不说它那基本广受诟病的安全问题,今天跟版网就找其中一个细节说说它的问题,那就是它的tag标签问题。
DEDECMS中的tag功能设计得不合理,正确的方式是:如果一篇文章被加了A,B,C三个标签,程序应该按照从A到C的顺序,顺次去匹配标签,所以我们可以把与文章与贴近的长尾词标签放在A位置,把一些热词放在C位置,这样文章既可以匹配出非常贴近的相关文章,而且整个相关文章数也能够用足。
而DEDECMS源代码中的匹配原则是这样的:如果你添加了A,B,C三个标签,在保存标签的时候会将按照第一次A,B,C的顺序保存下来,并按照id排序输出:但是以后修改只是修改了标签的内容就不能修改标签的顺序了。也就是说如果首先添加了A,C(图1-1),在想添加B按照A,B,C(图1-2)的顺序修改的时候,原先的A,C标签已存在id小于后添加的标签id,就会无法按照A,B,C的顺序保存,而是按照A,C,B进行排序,不能达到预期的效果。
一般来说,热词会比较早地进入数据库,所以想插入或者添加新的热词保存标签的时候就会按照最早的顺序进行保存,调取相关文章的时候就不能调取出与输入顺序相似的结果。
Dedecms tag问题的程序修改说明:
(1)、当前程序的实现原理
Dedecms操作标签的文件是/include/helpers目录下archive.helper.php,保存标签的函数是在文件下方的InsertOneTag函数,主要保存文章对应标签的过程如图:
通过上图可以看出代码中没有对于文章对应表(dede_taglist)标签排序的设置,然后在文件中GetTags($aid)读取文章对应标签的时候没有对读取排序进行操作,默认为按照tid的顺序读取,如下图:
输出的结果和上文所叙述的结果相同,这个tid即等于根据进入标签数据表的顺序,所以标签的tid会比较大。
(2)、建立一个表存储某篇文章标签顺序
如果要让文章标签按照用户输入的顺序进行保存,就必须记录用户输入保存标签是的顺序所以我们要修改文章标签表dede_taglist。在表中添加一个字段作为记录用户输入是排序的字段,修改表的方式如下:
ALTER TABLE `dede_taglist` ADD `order` INT( 3 ) NOT NULL COMMENT '序号' AFTER `tag`
将sql语句复制,用管理员用户登录dede后台左侧树栏“系统”->"sql命令行工具" 粘贴在文本框中,点击“确定”(sql语句中的“dede_taglist”的表前缀根据你的数据库中设置的表前缀)。
(3)、修改匹配标签的函数
然后修改操作文章标签的方法,首先修改添加标签的函数。在原函数中添加了一个参数作为序号的记录function InsertOneTag ($tag, $aid,$i),$i是添加时的序号该函数主要修改了文章标签添加的部分,加入对`order`排序信息的添加。修改后如图:
然后修改InsertOneTag相关的函数InsertTags
这样在添加标签的时候就会记录用户输入标签是的排列顺序,然后修改获取标签的数序函数GetTags($id)中的获取标签的属性按照`order`的顺序读取,修改后的代码如下图:
以上修改的是标签添加到读取的过程,还要修改编辑标签的方式,编辑标签的函数也是在同文件中,UpIndexKey($id, $arcrank, $typeid, $sortrank=0, $tags='')函数,该函数分为两次循环进行对标签的操作,第一次循环,判断用户修改的标签时候以存在,不存在的话进行添加。第二次循环,判断已存在的标签是否和用户输入的标签相同,如果已存在的标签中有但是用户输入的标签中没有,将该标签删除,如果都存在那么根据用户输入的标签顺序重新排序。代码如下:
这个函数修改后,用户在编辑标签并保存以后,系统就按照用户标记的顺序进行输出了。
跟版网的程序员已经通过修改源代码修改了这个问题,如果需要相应源代码的朋友,可以点击链接下载。
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!