WP笔记

如何将WordPress站点从本地移植到服务器

在本地测试环境调试WordPress不但速度快,也不用担心装了不安全的插件或者主题黑了自己的服务器。唯一的问题就是整个网站做好了,内容也加了,如何能移植到在线服务器,并且保证功能不出错,图片等地址正确呢?今天就来解决将WordPress从本地测试环境向服务器移植的问题。

Note:本教程仅适用于Linux主机(在线服务器的操作系统)

准备工作

你应该了解以下工具:

  • FTP或Cpanel File Manager工具,用来上传文件,会用SFTP或者SSH更好;
  • 知道如何创建数据库,如何用phpmyadmin或者你的服务器提供的数据库操作界面上传数据库;
  • 会用代码编辑器进行查找/替换操作,推荐Notepad++,这个轻量级的编辑器能快速打开体积大的文本,用记事本很可能让电脑罢工。

开始移植

1. 将你的网站文件上传到在线服务器,我们假设域名是www.yourdomain.com。更改wp-config.php,将数据库信息更新

/** WordPress 数据库的名称 */
define('DB_NAME', 'sola_wordpress');

/** MySQL 数据库用户名 */
define('DB_USER', 'username');

/** MySQL 数据库密码 */
define('DB_PASSWORD', 'password');

/** MySQL 主机 */
define('DB_HOST', 'localhost');

2. 访问管理员界面,导出数据库之前需要检查一些内容,后面会解释原因。

小工具:查看小工具的设置选项中是否有涉及到域名的设置,如果有,将域名更新为你的在线地址

主题选项:检查主题选项是否有涉及到域名的设置,如果有,将域名更新为你的在线地址

插件选项:同上

3. 导出数据库,如果你本地测试环境是wampserver,访问http://localhost/phpmyadmin,找到要导出的数据库,选择保存为文件导出。

导出数据库图解

4. 用Notepad++打开刚刚保存的sql文件,查找你的本地测试地址例如localhost/wordpress,全部替换成在线地址www.yourdomain.com

用Notepad++替换地址

5. 将改好的sql文件上传到服务器,这时候你就需要访问phpmyadmin了,进去以后找到import(导入)选项,直接选择文件上传导入即可。

import-database

导入失败可能的原因:

1) 数据库文件超出服务器允许的最大体积,上图红色方框中显示的数值就是允许上传的最大文件尺寸,614kKiB=614MB,这是Sola本地的配置,服务器一般都比较低,有的可能只有2M,如果是这样,需要修改post_max_size和upload_max_filesize的值,通常可以通过php.ini来修改,如果你找不到这个文件,最好的方法就是联系服务器提供商,每个服务器的配置都不同,修改方法也不同。

2) 数据库存在错误字段,如果mysql文件本身有错误(向mysql数据库直接存储html代码常常引起数据库字段出错),会导致上传被中止,这时候应该先在本地修复数据库,再重复步骤3和4。

修复数据库

6. 现在文件和数据库都放好了,直接访问首页应该可以显示网站,如果你开启过固定链接,那么访问其它页面会出现404错误,因为.htaccess还保持着测试地址,访问后台->设置->固定链接,什么都不用改直接点击保存更改,wordpress就会自动更新.htaccess,这时候就没有404错误了。

7. 如果你没认真做好步骤2,可能出现的情况是你的widget小工具都消失了,谁叫你偷懒了。去外观->小工具,往下看找到未使用的小工具,就能找到你丢失的小工具了。把他们重新摆回去,更新地址,移植结束。

小工具消失的原因

某些小工具带有配置选项,这些选项存储在wp_options表中,WordPress用一种序列化的方式存储字符串,不但记录字符串,还要记录字符串的长度,当字符串的实际长度与记录的长度不相等时,WordPress就会读取失败,所以你的小工具WordPress不认识了。

序列化字符串长什么样?

s:5:"title";

这就是一个序列化的字符串,s表示类型是string(字符串),5表示字符串的长度是5个字符,title就是这个字符串的内容了,确实是5个字母。

那么存储域名会发生什么情况?

s:26:"http://localhost/wordpress"

全文替换域名以后,就变成了

s:26:"http://www.yourdomain.com"

实际长度是25,但数据库里还写着26,错误就发生了。

同样的概念可以应用到所有用wp_options存储数据的模块,例如主题选项,例如插件选项。

聪明的你一定想到了避免的方法了:保证测试地址和在线地址长度一样就没问题了。例如Sola的域名和测试地址分别是

www.solagirl.net
localhost/solabk

长度相同,这样我可以随意移动,只需要全文替换地址,什么都不会丢,是不是很方便。

移植后可能出现的问题

1. 小工具消失是最常见的问题,上面已经解释了

2. 无法上传图片

检查uploads文件夹权限,如果你的服务器没安装suPHP,那你可能要把文件夹权限改成777了。777通常是不安全的,解决的方法就是用脚本重新创建uploads文件夹,然后把文件都移动过去。这个问题的根源就是文件夹的拥有者是用户,而程序的拥有者是apache,直接导致apache无法写入,用程序创建的文件夹拥有者是apache,不存在这个问题。

3. 出现404错误

一种可能是.htaccess没更新,还有一种可能是主题硬编码了一些东西,测试的时候最好关闭wampserver或者其它测试环境,看看是不是还有的脚本正在努力的访问localhost。

23条评论

    1. 服务器: localhost
      错误

      SQL 查询:


      — 数据库: `qlqblb_wordpress`

      — ——————————————————–

      — 表的结构 `wp_34thjk_commentmeta`

      CREATE TABLE IF NOT EXISTS `wp_34thjk_commentmeta` (
      `meta_id` bigint( 20 ) unsigned NOT NULL AUTO_INCREMENT ,
      `comment_id` bigint( 20 ) unsigned NOT NULL DEFAULT ‘0’,
      `meta_key` varchar( 255 ) DEFAULT NULL ,
      `meta_value` longtext,
      PRIMARY KEY ( `meta_id` ) ,
      KEY `comment_id` ( `comment_id` ) ,
      KEY `meta_key` ( `meta_key` )
      ) ENGINE = MYISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT =1;

      MySQL 返回:文档
      #1046 – No database selected

    2. 可能是mysql没装好,这个貌似很常见,你搜一下Access denied for user ‘root’@’localhost’ to database这个错误,应该有不少解决方法。

  1. 我是小白,可以告诉我哪里出错了吗? 服务器: localhost
    错误

    SQL 查询:


    — 数据库: `information_schema`

    CREATE DATABASE `information_schema` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    MySQL 返回:文档
    #1044 – Access denied for user ‘root’@’localhost’ to database ‘information_schema’

    1. 错误

      SQL 查询:


      — 导出表中的数据 `wp_commentmeta`

      INSERT INTO `wp_commentmeta` ( `meta_id` , `comment_id` , `meta_key` , `meta_value` )
      VALUES ( 1, 1, ‘_wp_trash_meta_status’, ‘1’ ) , ( 2, 1, ‘_wp_trash_meta_time’, ‘1404960732’ ) ;

      MySQL 返回:文档
      #1062 – Duplicate entry ‘1’ for key ‘PRIMARY’

    2. 错误

      SQL 查询:


      — 数据库: `wordpress`

      — ——————————————————–

      — 表的结构 `wp_commentmeta`

      CREATE TABLE IF NOT EXISTS `wp_commentmeta` (
      `meta_id` bigint( 20 ) unsigned NOT NULL AUTO_INCREMENT ,
      `comment_id` bigint( 20 ) unsigned NOT NULL DEFAULT ‘0’,
      `meta_key` varchar( 255 ) DEFAULT NULL ,
      `meta_value` longtext,
      PRIMARY KEY ( `meta_id` ) ,
      KEY `comment_id` ( `comment_id` ) ,
      KEY `meta_key` ( `meta_key` )
      ) ENGINE = MYISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT =3;

      MySQL 返回:文档
      #1046 – No database selected

  2. 除了存储字符串还存储字符串的长度,保证测试地址和在线地址长度一样就没问题了。————-是不是在本地建站的地址的长度要和以后移植到的网上主机的域名长度要一样, 那这样不是很麻烦吗?包含wp3.6以上版本的有没有改善?
    能不能在本地就象网上一样访问? http://www.a.com 而不是 localhost/a ,
    一开始在本地就改到和以后移植的一样域名,那移植时就不用改,也不会有这问题出现了。

    1. 不用保证长度一样,用什么名字都行,只要你的数据库通过wp migrate db这个插件导出就没问题。
      具体方法看这篇文章https://www.solagirl.net/wp-migrate-db.html

      1. 不想用插件。是不是就要域名保证长度一致?
        如果要保证长度,那倒不如在本地就改到和以后移植到空间一样的域名,那移植后就不用改域名,也不会有长度问题出现。

        1. 插件没啥不好啊,这种插件就是开发阶段用下,上线了直接删除就行,即不影响性能,还能节省时间,有什么理由不用呢?

        2. 移植到网上主机很多地方要改,域名,主题,小工具,插件等牵涉到域名的就要改,
          如果能完整并不遗漏不出错的更改,wp migrate db这个插件就很好。
          本地要安装wp migrate db ,主机又再安装wp migrate db, 用完就卸载?

  3. 我移植了wordpress后,应该是数据库有问题,站点的头部和底部显示不出来,后台也无法登陆,导出数据库后替换了相应的链接,请问博主遇到过这种情况吗?

    1. 我遇到过数据库有问题的情况,但具体表现和你的不大一样。建议你用WP Migrate DB来移植数据库,这个可以保证wp_options数据表中的数据正确移植,用替换的方法容易出错。

      1. 我没adroid手机没法测试了。不过这个直接在网页上评论跟用什么设备没关系吧?多说有出安卓应用了?!

评论已关闭。