[织梦DEDE迁移]读取织梦MySQL生成所有文章链接

广告:本人承接迁移织梦到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。

转载请注明来源:织梦dede迁移读取织梦mysql生成所有文章链接

 

网站从织梦DEDECMS迁移到WordPress过程以及URL重定向方法

广告:本人承接迁移织梦到wordpress的业务.

前一段时间自己的程序员求职网www.51projob.com被人挂了黑链,我打开首页顶部出现了大片大片的广告图片,我在后台各种地方找黑链代码,改了几个地方不行,然后把代码下载下来采用搜索等方法找,过程中竟然发现了好多个类似sys.cmd这种木马入口文件,然而黑链却一直没有被删掉。

无奈之下想采用最彻底的解决方法:将程序员求职网从织梦直接迁移到wordpress,因为wordpress是全球著名博客系统,官方对博客系统经常进行升级以修补漏洞,因此安全性很有保障,而织梦作为国内CMS老大,由其衍生了一大批的垃圾站点,各种被入侵各种被挂马,然而官方却对很多漏洞视而不见,修补非常缓慢。考虑到这些,我准备进行迁移。

迁移过程

迁移过程网上很多文章,大致是这样的:

1、在网上找生成织梦全站RSS文件的方法,然后将代码上传,生成全站文章的rss文件;

2、在wordpress中将生成的rss导入进去,这时候已经在wp上看到所有文章了,但是没有内容

这时候需要修改dede_articleaddon表,增加title字段并填充值:

UPDATE dede_addonarticle,dede_archives SET dede_addonarticle.title=dede_archives.title WHERE dede_addonarticle.aid=dede_archives.id;

3、进入织梦数据库,将dede_articleaddon数据表导出来

4、将第3步的数据表导入到wp数据库

5、写一条SQL,大致是这样的

UPDATE wp_posts,dede_addonarticle SET wp_posts.post_content=dede_addonarticle.body WHERE wp_posts.post_title=dede_addonarticle.title;

将wp_posts表和dede_articleaddon根据文章的title作join

然后采用update将wp_posts的content字段设定为join后dede_articleaddon表的内容body字段

6、这时候发现文章已经有内容了,但是图片不对

7、将织梦的uploads目录上传到wordpress的根目录

8、发现文章和图片全部OK了

链接规则变化导致百度收录为0

迁移完成后,感觉松了一口气,wordpress终于能够显示织梦之前所有的文章了,并且现在我能够使用windows live write写文章,感觉非常的方便。

然而过了几天我发现,百度收录网站链接几乎变成了0,看了一下是因为URL规则变化了,原来是这样的链接:

http://www.51projob.com/a/weiruan/20120826/449.html

现在变成了这样:

http://www.51projob.com/?p=2343

百度收录的650篇文章,全部是第一种格式的URL,于是用户链接进来全部是404页面,找不到文章了。

这可是个大事,辛辛苦苦2年积攒的页面权重,就这样没了,岂不是前功尽弃,如果百度因此惩罚我的网站永不收录,那我该哭了。

采用301进行URL的redirect能拯救网页权重

对于用户不能访问的问题,我开始是做了一个漂亮点的404页面,上面列出了所有的网站分类,希望用户看到该页面后,能在网站上停留一会:

20130926213412

然而发现也还是不乐观,用户貌似不会继续点其他链接,直接就离开了网站。

今天看了一篇文章“百度搜索引擎优化指南2.0[官方版]”,里面提到这么一段话

301
• 301返回码的含义是“Moved Permanently”,百度会认为网页当前跳转至新url。当遇到站点迁移,域名更换、站点改版的情况时,推荐使用301返回码,尽量减少改版带来的流量损失。虽然百度spider现在对301跳转的响应周期较长,但我们还是推荐大家这么做。

由此我看到了希望,这样做首先用户访问网站能跳转到所需的页面,其次搜索引擎也能进行权重的转移,是一个较为完美的方案。

查找织梦DEDE和wordpress的URL的映射关系

要实现301跳转,需要先找到织梦和wordpress两者URL之间的对应关系,然后才能设定跳转。

而他们两者之间不变的对应项,用文章标题来做最合适不过。

1、获取织梦DEDE的文章标题和链接的对应关系

由于织梦采用静态文件生成的方法提供URL,因此我先把原先备份的网站目录的“a”目录复制过来,得到如下的一个文章目录结果:

20130926214253

其中每一个html就是一个文章页面,而其目录访问结构“/a/alibaba/20120828/481.html”就是文章的具体链接子地址,加上www.51projob.com作为开头,就形成了http://www.51projob.com/a/alibaba/20120828/481.html作为正式的访问链接。

然后用python递归遍历的方法,可以得到每个文件的链接以及文章标题

[面试经验] [阿里巴巴]笔试面试全过程(精华)    www.51projob.com/a/alibaba/20120828/493.html
阿里巴巴笔试题    www.51projob.com/a/alibaba/20120828/494.html
[阿里巴巴]面试失败经历    www.51projob.com/a/alibaba/20120828/495.html
阿里巴巴常用面试题    www.51projob.com/a/alibaba/20120828/496.html
《分享面试经历—阿里巴巴》    www.51projob.com/a/alibaba/20120828/497.html
阿里巴巴面试总结    www.51projob.com/a/alibaba/20120828/498.html
阿里巴巴面试经历    www.51projob.com/a/alibaba/20120828/499.html
淘宝网2010春季校园招聘笔试题    www.51projob.com/a/alibaba/20120829/519.html
淘宝2011.9.23校园招聘会面试题    www.51projob.com/a/alibaba/20120830/540.html
阿里云2011.9.17招聘会笔试题    www.51projob.com/a/alibaba/20120903/589.html

2、获取wordpress每个文章的链接地址和标题

这个比较简单,我直接进数据库,将wp_posts数据表的(id,post_title)两列导出就可以了,然后根据id可以构造每个文章的链接,比如http://www.51projob.com/?p=2482,这样,我就得到了wordpress的文章标题和URL的对应关系:

[百度] Web笔试分享(下)    http://www.51projob.com/?p=2477
百度笔试题:malloc/free与new/delete的区别    http://www.51projob.com/?p=2473
百度技术研发笔试题目    http://www.51projob.com/?p=2435
百度2012招聘测试工程师实习生笔试题    http://www.51projob.com/?p=2425
百度2011招聘笔试题和答案解析    http://www.51projob.com/?p=2424
百度2010校园招聘算法题之编译模块    http://www.51projob.com/?p=2423
百度研发笔试题    http://www.51projob.com/?p=2408
百度的前端面试经历    http://www.51projob.com/?p=2380
百度面试全攻略    http://www.51projob.com/?p=2340
百度面试题2012年8月28日    http://www.51projob.com/?p=2327
2011百度校园招聘笔试题 C++类-附原创答案    http://www.51projob.com/?p=2264
百度面试题集锦    http://www.51projob.com/?p=2256
百度2012校招笔试题之位数和编码    http://www.51projob.com/?p=2214
百度笔试题目分享    http://www.51projob.com/?p=2151

3、实现两类URL的映射

这就很简单了,由于前两步已经得到了(title, dede_url)和(title,wp_url)两份数据,现在根据title作下join,就得到了(dede_url,wp_url)即织梦DED的URL和wordpress的对应文章URL的对应关系表:

www.51projob.com/a/baidu/20120813/302.html    http://www.51projob.com/?p=2480
www.51projob.com/a/baidu/20120813/304.html    http://www.51projob.com/?p=2478
www.51projob.com/a/baidu/20120813/305.html    http://www.51projob.com/?p=2477
www.51projob.com/a/baidu/20120813/309.html    http://www.51projob.com/?p=2473
www.51projob.com/a/baidu/20120814/352.html    http://www.51projob.com/?p=2435

批量生成apache的301 redirect重置命令

可以修改网站根目录下的.htaccess文件来进行URL的转向,但是URL映射关系太多,所以我们可以用程序自动生成一下(在文本文件中批量替换也能实现),最终得到下面的重定向规则:

Redirect 301 /a/alibaba/20120903/591.html http://www.51projob.com/?p=2209
Redirect 301 /a/alibaba/20120908/636.html http://www.51projob.com/?p=2176
Redirect 301 /a/alibaba/20120908/642.html http://www.51projob.com/?p=2170
Redirect 301 /a/alibaba/20120911/652.html http://www.51projob.com/?p=2160
Redirect 301 /a/baidu/20120329/150.html http://www.51projob.com/?p=2604
Redirect 301 /a/baidu/20120504/222.html http://www.51projob.com/?p=2543
Redirect 301 /a/baidu/20120505/223.html http://www.51projob.com/?p=2542
Redirect 301 /a/baidu/20120505/225.html http://www.51projob.com/?p=2540
Redirect 301 /a/baidu/20120715/285.html http://www.51projob.com/?p=2495
Redirect 301 /a/baidu/20120813/300.html http://www.51projob.com/?p=2482
Redirect 301 /a/baidu/20120813/301.html http://www.51projob.com/?p=2481

测试,大功告成

将上面生成的命令全部贴到.htaccess中后,可以测试一下,在网页输入旧链接

20130926215752

回车后发现自动跳转到了新链接

20130926215933

用fifefox的httpfox插件看一下状态转移:

20130926220121

发现经过两次301页面转移,链接从原来的织梦dede错误地址转到了新的wordpress新地址。

本次代码地址:http://pan.baidu.com/s/1DrBF6

用到了BeautifulSoup开源库用来在python中提取文章的标题。

织梦DEDECMS简洁蓝色模板免费下载(资讯文章类)

模板信息:该模板是我为另一个网站程序员求职网设计的模板,主要分为首页、文章列表页和文章内容页三个模板

主要基调:蓝色,简洁,朴素

文章页需要安装两个插件:无觅相关文章插件和多说文章评论插件。

可以用于:文章站、资讯站、门户站、图片站

适用版本:织梦DEDECMS 5.7版本、编码是UTF-8

使用方法:将压缩包解压后,另起一个名字,上传到templets目录下面,进织梦后台系统设置,在模板默认风格设置的地方写上模板名字,然后更新全站就可以了。需要安装无觅和多说两个插件。这两个插件我用的很好,极力推荐。

下载地址:http://pan.baidu.com/share/link?shareid=122080&uk=1376935646

继续阅读织梦DEDECMS简洁蓝色模板免费下载(资讯文章类)

Dedecms备份还原网站有效方法

Dedecms备份还原方法为您提供3个,其实这3个dedecms网站备份恢复还原都很有效,所以不管你选择哪种,都能成功备份dedecms网站,以及dedecms网站恢复还原成功!

Dedecms网站备份还原技巧1:

1、首先在旧站后台备份数据库。
2、上旧站FTP下载三个文件夹:

  • data文件夹下面的backup_data文件(只下载backup_data文件夹就行了,这是数据库备份),
  • uploads文件夹(存放图片、附件之类的),
  • templets文件夹(旧站模版,如果不想要可以不要)

3、在新站安装与旧站一样版本的dede,网站后台密码还有数据库密码与旧站一样
4、上传下载好的旧站三个文件替换新旧的三个文件夹
5、到新站后台数据库还原
6、更新下网站内容就行了。

Dedecms备份还原注意:
在新的空间安装一个新的dedecms系统(记得编码要选原来的一样)
这 是非常重要的一步,在/data/backup_data找到tables_struct开头的这个txt文件,然后用记事本或者editplus打开, 然后找到DEFAULT CHARSET=utf8或者DEFAULT CHARSET=gbk,全部把它们去掉。不然后果相当的严重。
把/data/backup_data目录下的备份的数据库文件FTP上传到相应的目录下。
进入新安装的系统里后台–>系统管理–>数据库还原,全选所有备份文件,并且勾选还原表结构信,然后单击开始还源数据便可以恢复了。
还原后重新登录后台,然后生成HTML就可以了。

Dedecms网站备份还原技巧2:

 Dedecms备份

1、登陆网站后台,进入系统——数据库备份/还原;
2、选择页面上列出的所有的表,点击提交即可;
3、在ftp中将所有文件下载到本地(尤其是/data/backupdata/目录以及templets目录);

Dedecms恢复

当网站出现问题需要转移恢复数据的时候按照以下步骤进行:

1、将所有文件上传到服务器;
2、删除install目录下的install_lock.txt,并将index.php.bak更名为:index.php;
3、运行http://你的新网址/install重新安装dedecms;
4、进入后台,系统——数据库备份/还原,点击右上角的数据还原进行恢复即可;

Dedecms网站备份还原技巧3:(适合空间换了)

dedecms从旧空间迁移到新空间。

1.备份数据;

先在旧空间的后台备份数据

2.把程序与数据传到新空间;

然后,在新的空间上重新安装DEDECMS,再就用FTP软件把旧空间的程序和数据上传到新空间, 注意包括模板风格也上传,把上传的程序覆盖新安装的程序。

3.修改数据库配置文件;

这步很重要,用FTP软件到新空间站点根目录下的数据库配置文件:dedecms/common.inc.php用记事本打开。

要修改的地方有如下几处:

$dbhost = ‘localhost’; // 数据库服务器(一般不必改)

$dbuser = ‘root’; // 数据库用户名

$dbpw = ’sohu’; // 数据库密码

$dbname = ‘vc’; // 数据库名

4. 还原数据

直接从后台还原

最后更新dedecms网站缓存就可以了,到此,dedecms备份还原完毕!