广告:本人承接迁移织梦到wordpress的业务.
本文阐述了从织梦的Mysql数据库读取数据表,生成所有文章链接的方法。
本文中使用了封装了Mysql常用函数的一个模块DBUtil,代码见链接
1、确认链接的组成结构
这个信息记录在dede的分类表dede_arctype的namerule字段中;
执行SQL语句:SELECT namerule FROM dede_arctype;
会看到返回结果都是一个值(一般都没有修改):{typedir}/{Y}/{M}{D}/{aid}.html
这意思是,链接由以下字段组成:{typedir}:类型的目录,来源于dede_arctype的typedir字段;
{Y}{M}{D}:文章发布的时间,来源于dede_archives表的pubdate字段;
{aid}:文章ID,来源于dede_archives的ID字段;
2、读取Mysql,拼凑URL
大致过程:读取mysql的dede_arctype表和dede_archives,得到所有链接信息(包括文章ID、类型名称、类型目录、标题、发布日期、自定义文件名)
对于每一个链接,根据第1步骤的介绍装备链接;
至此已经拿到了所有的链接ID、链接标题和链接URL。# -*- encoding:utf8 -*-
from common import DBUtil
import pprint
import datetime
dbUtil = DBUtil.DB('127.0.0.1',3306,'root','','oiayafnq_lwqn')
site_home_url = "http://crazyant.net"
class Link():
def __init__(self, p_linkid, p_title, p_linkurl):
self.linkid=p_linkid
self.title=p_title
self.linkurl=p_linkurl
def __str__(self):
strv="%s\n%s\n%s\n"%(self.linkid,self.title,self.linkurl)
return strv
class DedeLinks():
def __init__(self):
self.allLinks=[]
def getDbArticlesInfo(self):
'''
获取数据库中链接的信息以及对应的分类
'''
rs = dbUtil.query('''
SELECT
dede_archives.id,dede_arctype.typename,dede_arctype.typedir,typeid,title,pubdate,filename
FROM
dede_archives,dede_arctype
WHERE dede_archives.typeid=dede_arctype.id;
''')
return rs
def equipLink(self, typedir, urldate, filename, linkid):
'''
根据分类目录、发布文章日期、自定义连接名(可以为空),链接ID,拼接成一个URL
'''
article_date=str(datetime.date.fromtimestamp(urldate)).replace("-","")
#print filename
link_dir = "%s/%s/%s"%(typedir,article_date[:4],article_date[4:])
if filename.strip()!="":
link = "%s/%s.html"%(link_dir,filename)
else:
link = "%s/%s.html"%(link_dir,linkid)
link = link.replace("{cmspath}",site_home_url)
return link
def getAllDedeLinks(self):
rs = self.getDbArticlesInfo()
for row in rs:
(linkid,typename,typedir,typeid,title,pubdate,filename) = row
linkurl =self.equipLink(typedir, pubdate, filename, linkid)
linkNode = Link(linkid, title, linkurl)
self.allLinks.append(linkNode)
def process(self):
self.getAllDedeLinks()
if __name__=="__main__":
dlinks = DedeLinks()
dlinks.process()
for linkNode in dlinks.allLinks:
print linkNode
其他模块可以访问该模块,采用dlinks.allLinks来访问所有的链接,其中的每个列表元素均包括链接ID、链接标题和链接URL。
相关推荐