如何将门户网站从Joomla 1迁移到3
本文描述了如何将一个包含超过10000篇用西里尔字母和特殊字符撰写的网站从Joomla 1.x迁移到Joomla 3.x。
任务:将网站preminportal.com.mk从Joomla 1.x迁移到Joomla 3.x。该网站运行在Joomla 1.0.13上,数据库大小为320 MB,根目录大小为3.5 GB。
更详细地说,数据库包含
- jos_content = 15493行;
- jos_menu = 131行;
- jos_modules = 457行;
- jos_sections = 23行;
- jos_categories = 127行;
- jos_users = 402行。
为了避免对网站运行造成大的延迟,我的想法是在我的计算机上本地进行整个迁移,然后再将其移动到网站托管。我没有传输包含图像、音乐和其他文件的文件夹,因为我决定不改变它们的位置(例如,从images/stories到images/)并避免在所有文章中大量更改路径。
对于本地工作,我使用了USBWebServer。为了使其能够导入数据库,我必须将php.ini中的memory_limit、upload_max_filesize和post_max_size语句增加到400MB以上的值。
在USBWebServer根目录下,我创建了一个名为'oldsite'的文件夹,并在其中提取了旧preminportal.com.mk网站的文件夹(仅包含Joomla 1.0.x的核心文件夹)。在USBWebServer上,我创建了一个名为'oldsite'的数据库,当然,我将数据库校对设置为utf8-general-ci,因为该网站使用西里尔字母('oldsite'的数据库名称只是一个示例,在你的情况下你需要使用你真实数据库的名称)。
在configuration.php中,我更改了以下行
- $mosConfig_db = 'oldsite';
- $mosConfig_absolute_path = 'C:/USBWebserver-za-Premin\root' (路径需要是USBWebsrever的实际位置);
- $mosConfig_live_site = 'C:/USBWebserver-za-Premin\root' (路径需要是USBWebsrever的实际位置);
- $mosConfig_error_reporting = '0'(只有当值不为零时,以避免显示错误);
- $mosConfig_password = 'usbw'(USBWebserver的标准密码,如果已更改,则使用您的密码);
- $mosConfig_user = 'root'(USBWebserver的标准用户名,如果已更改,则使用您的用户名);
- $mosConfig_live_site = 'http://localhost:8080'(USBWebserver根目录的标准URL,对于网站所有部分的正确加载都是必需的)。
对于Joomla 1.0.x的本地工作,我使用了USBWebSerever版本8,它包含PHP 5.3.2。这是一个较老的版本,但在此情况下是必要的,因为它具有magic_quotes_gpc,并且需要在php.ini文件中将它们设置为On,以便网站可以打开。在PHP的新版本中,出于安全原因,这些语句不再使用。
现在网站已完全本地复制(文章中没有图片,但最终,当网站上传到服务器时,它们将找到它们的路径),迁移可以开始了。
我遵循了http://docs.joomla.org/J1.5:Migrating_from_1.0.x_to_1.5_Stable(是的,首先必须将网站迁移到Joomla 1.5.x,然后迁移到最新版本)。因为该网站是Joomla 1.0.13,我从http://forum.joomla.org/download/file.php?id=36573。下载了推荐的补丁。
为了节省您的时间:迁移后,我发现数据库的大小翻倍了,所以我又重新进行了迁移。在论坛中我发现问题可能是来自垃圾桶中的文章,所以我打开了Joomla 1.0版本的管理员,发现超过700篇文章和20个菜单在垃圾桶中,所以我清空了它。此外,在迁移之前,从旧网站中删除所有未发布的文章、类别和部分。完成这些后,我继续迁移过程。
Joomla 1.0没有按状态(已发布/未发布)排序文章,在如此大的数据库中,很难轻松找到所有未发布的项目。因此产生了修改一些代码的想法。
在文件 ./administrator/components/com_content/admin_content.php 行 145 中,该行指向状态的显示,并指示“显示所有等于或大于零”
"c.state >= 0"
其中0是未发布,1是已发布,所以稍作修改为
"c.state = 0"
现在我只显示未发布的文章,这样我就可以选择所有这些文章并将它们放入垃圾桶。
有830篇未发布的文章,其中近100篇是特色文章,所以这也可能是“重复”问题的原因。清理了所有不必要的文章后,我将admin_content.php中的行改回原始状态,现在文章管理器显示11296篇文章,其中3560篇是特色文章,2572篇是存档文章。
我还将所有未发布的类别、部分、菜单和子菜单放入垃圾桶。还有两个没有文章的部分和一个没有项的菜单,我也将它们放入垃圾桶。我还将所有未发布的模块(除了不能放入垃圾桶的核心模块,如登录)放入垃圾桶。
所有第三方mambots、模块和组件也被卸载或放入垃圾桶,以及它们在数据库中的相关表。所有禁用的用户也被删除,以及所有未使用的模板。
然后在垃圾桶管理器中清空了所有实例的垃圾桶。然后清除了缓存。接下来,在PHPMyAdmin中选择了所有有额外开销的表,并优化了它们。之后,所有表的开销都是0。
下一步是安装组件Migrator,它将数据库从Joomla 1.0迁移到1.5。此组件创建一个sql文件,该文件需要导入到Joomla 1.5的干净安装中。
现在我将Joomla 1.5.26的安装文件放入名为'oldsite15'的文件夹中,并创建一个名为'oldsite15'的新数据库,使用utf8-general-ci校对。
我在1.5.26安装过程中尝试了多次导入迁移文件。默认提供的编码ISO-8859-1无法正常工作。我尝试只使用utf-8编码,但总是出现以下错误
注意:iconv() [函数.iconv]: 在...\安装\安装程序\helper.php的第873行检测到输入字符串中的非法字符
helper.php文件中的第873行是
$buffer = iconv( $srcEncoding, 'utf-8//TRANSLIT', $buffer );
在论坛上对iconv函数如何工作以及该函数使用的参数进行了一点点调查后,我决定尝试使用
$buffer = iconv( $srcEncoding, 'utf-8//IGNORE', $buffer );
我这样做是因为通知中显示的第一个错误
第9行错误:INSERT INTO jos_migration_backlinks
VALUES(1,"Дома","index.php?option=com_frontpage&Itemid=1","component/option,com_frontpage/Itemid,1/","");
查询:## 使用Migrator 1.3为Joomla! 1.0创建
INSERT INTO jos_migration_backlinks VALUES(1,"�ома","index.php?option=com_frontpage&Itemid=1","component/option,com_frontpage/Itemid,1/","");
在第一行中,Joomla通常读取单词'Dома',但之后它变成了奇怪的字符'Ð�ома',所以我想这可能是转写的問題。
现在迁移通过,只有两个小通知,最后显示了成功迁移的消息。最后我能够在Joomla 1.5中查看网站,正常的西里尔字母,所有文本都可以阅读。
在1.5版本中,我安装了Akeeba备份3.4.6,并在这一点上进行了备份。
现在,在最新的USBWebServer 8.5版本上,我将尝试安装新的Joomla 3.3.6,并尝试将网站从1.5.26迁移过来。为了使其成为可能,您需要在同一服务器上拥有1.5.26和3.3.6数据库,因此我将从备份中安装1.5.26版本。
我创建了一个名为'newsite3'的新文件夹和一个名为'newsite3'的数据库,用于Joomla 3.3.6,其字符集为utf8-general-ci,以及一个名为'oldsite15'的数据库,用于Joomla 1.5.26,其字符集为utf8-general-ci。
在干净的Joomla 3.3.6安装中,我运行了redMigrator 组件。在他们的选项中,我选择只迁移oldsite15数据库。redMigrator在23%时停止,所以我尝试了几次,并对选项进行了一些更改,但同样的事情一直在发生。我尝试增加memory_limit,然后redMigrator成功迁移了11296篇文章中的3300篇,然后再次卡住。
接下来,我尝试了一个名为MigrateMe的组件,该组件导入1.5数据库并将其转换为版本3。MigrateMe导入数据库文件并开始分析,但后来卡住了。
我听说SPupgrade工作得很好,所以我尝试了它,始终从一个全新的Joomla 3安装开始。
安装SPUpgrade后,我将所有设置都保留为默认值。我将其连接到'oldsite15'数据库,并运行了超过两个小时。在这段时间里,在Firefox中,唯一可见的迹象是名称栏中的旋转图标。有时在PHPMyAdmin中检查数据库状态,我看到了行数的变化,这是一个好兆头。超过两个小时后,网站自动注销并显示登录页面。
我登录并看到了SPUpgrade的状态报告,其中说明了发生了什么,最终更改,底部是消息:“迁移成功”。所有菜单、分类、模块和文章都在其中。请注意,旧Joomla 1.0和1.5有部分和分类,而在Joomla 3中,部分=分类,分类=子分类。
现在在数据库中,包含文章版本的表ucm_history是316 MB。我清空了它,因为Joomla 1.0中的文章没有版本。版本控制是在Joomla 3中实现的。
Joomla 1.0 中的文章没有友好的URL,因此我决定进行修正:所有文章都将拥有友好的URL。请注意,在这种情况下,来自其他网站到您旧的不友好URL的所有旧链接都将丢失或需要更改。
首先,因为所有文章标题都是马其顿西里尔文,我需要安装马其顿语言并在网站管理部分激活它。这使Joomla能够自动将马其顿西里尔文标题转换为拉丁字符。为此,您需要打开一个文章进行编辑,删除旧的别名并保存文章。在保存过程中,Joomla将自动生成一个新的良好转写别名。但在我这个案例中,文章太多,所以我需要一个更快的解决方案。
在网上,我找到了使用批量按钮的建议。在数据库中的xyz_content表中,所有别名都被替换为空或无。然后创建一个新的临时分类,并使用批量按钮移除该新分类中的所选文章。当Joomla传输这些文章时,它会保存每个新文章,从而触发别名的自动生成。之后,只需再次使用批量按钮将文章重新转移到原始分类即可。当然,为了避免混乱的文章,这个过程需要按分类逐个进行。注意,所描述的过程不适用于菜单和分类别名 - 它们需要逐个打开和保存。
我为菜单和分类创建了新的别名。现在为文章。首先,通过PHPMyAdmin在xyz _content表中对所有文章的别名进行了更改
UPDATE `xyz_content` SET `alias`=''
并遵循上述建议。该过程有效但非常缓慢。为了防止文章版本,我禁用了版本控制。在临时分类中,批量处理非常缓慢,一次处理一篇文章。但从临时分类返回原始分类的速度很快。我得出结论,这种方法将花费太多时间,因此我决定在数据库中直接找到解决方案。
我在官方Joomla论坛上提出了问题:[http://forum.joomla.org/viewtopic.php?f=710&t=868696&sid=e10730d81ad7cbb61c2ed875d857e126](http://forum.joomla.org/viewtopic.php?f=710&t=868696&sid=e10730d81ad7cbb61c2ed875d857e126)。Manicakm建议我使用
SELECT `title`,replace(replace(lower (`title`),' ','-'),"'",'') FROM `xyz_content`
并检查这种类型的别名是否适合我的目的。检查显示,所有新的别名都将使用西里尔文。
之后,使用以下命令
UPDATE `xyz_content`
SET alias=replace(replace(lower (`title`),' ','-'),"'",'')
我将所有别名几乎都转换为友好的,但它们是西里尔文。这并不坏,但我能否更进一步,使所有别名都转写为拉丁字符?
pe7er建议使用
SELECT alias, COUNT(*) c FROM xyz_content GROUP BY alias HAVING c > 1
这个命令显示,许多别名包含不友好的字符,如+,.„“()!?"’蔑ћђ✣✤等。
现在,需要根据它们在标题中的位置和用法将它们替换为'-'或空或无。
我使用以下命令进行此操作
UPDATE xyz_content
SET alias = REPLACE(alias,'+','')
或
UPDATE xyz_content
SET alias = REPLACE(alias,'✤','-')
替换所有有问题字符后,我使用相同的方法将别名中的所有西里尔文字符替换为其拉丁转写。最终,我得到了好的拉丁转写友好的URL。
现在,我根据新Joomla 3.3.6网站根目录中的路径,复制了所有图片、音乐、Flash文件、PDF文件、演示文稿和其他文档。我安装了新的模板并对其进行了定制,安装了最新的Akeeba备份,在实时服务器上恢复了网站,并且网站完全可用。
在 Joomla 社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能并不代表 Joomla 项目的官方立场。
通过接受,您将访问 https://magazine.joomla.net.cn/ 外部的第三方服务提供的功能
评论