分类: WordPress

  • wordpress数据库完美导入合并

    wordpress数据库完美导入合并

    这个源于历史遗留问题,几年前就在本地搭建了博客,并写了一段时间,去年又在线上重新来过写了一段时间,内容本身不重要一开始没打算合并的,但觉得这个知识点还是有必要学习一下,特别是尝试了wordpress自带的导入导出工具插件后,实在忍不住要解决这个问题。

    通过官方的导入导出工具,媒体部分总是导入失败,于是直接将wp-content\uploads文件夹传到服务器,可是媒体页面不显示,即时导入成功好像也不显示,真是让人难受,必须拿下。

    特别强调:数据备份,操作前一定要备份。

    首先要了解wordpress数据库及各表的结构,可参照官方文档:

    https://codex.wordpress.org/zh-cn:%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%8F%E8%BF%B0

    因为现在访问官网及其不稳定,可以自行搜索。而且官方文档好像没怎么更新一样,截个图如下:

    再截图现在的数据库对比一下,大概一致有一些小出入,如下:

    可以一一打开看一下,我觉得涉及到重要数据的几个表就是posts、postmeta、terms、term_taxonomy、term_relationships,省略了表前缀,这几个表直接都是互相依赖的,根据名字就可以看个大概。post是文章及媒体相关的,term是文章分类、标签等,必须一一对应。

    然后就是分析这几个表,如何将他们合二为一,新数据库里面已经存在一部分数据,所以不能直接导入进去,直接导入要么被完全覆盖,要么追加更新。

    • 完全覆盖肯定是不行,失去意义了。
    • 追加更新为什么也不行,是因为追加是随机的,数据是进去了,但之前说过几个表直接是依赖的,如果id不对应,就会乱套,照样不会解决问题。

    大概思路就是这样,首先导入文章及媒体库,post两个表。

    • 首先posts表中的id是关键,由它关联到postmeta表,形成对应;
    • 将posts表通过navicat导出向导导出excel数据;
    • 默认选择全部字段,下一步(不截图了)
    • 选中“包含列的标题”和“追加”
    • “遇到错误时继续”可以默认选中,我一般不选,没有出错才是最完整的数据。
    • 然后打开这个表,将第一列id号统一加一个数字,这个数字必须大于新数据库(被导入)中posts表中的id,并且请记住这个数字,后面还有用的哦。
    • 通过同样的方法,导出数据表postmeta,这个表中的meta_id不需要删除掉,导出时可以不选中,或者导出后删除excel文件中的对应列,同样的,文件中的pos_id列统一加入之前的数字,必须一样才能对应。
    • 将导出并修改好的wp_posts.xlsx及wp_postmeta.xlsx两个文件导入到新数据库。
    • 新数据库选中对应表,执行导入向导,导入类型excel文件;
    • 选中对应的excel文件源,全选表,默认四个下一步,导入模式默认追加,下一步,开始,完成。
    • 同样的方法执行两次导入,两个表的数据就被合并到新的数据库了。

    此时,在新的网站后台打开媒体页面及所有文章页面就可以看到媒体及文章都显示出来了,特别是媒体页面显示正常了最为直观。这算是最重要的两个数据表。

    接下来同样的方法,导出及导入term相关三个表,只是三个表中的依赖关系也一定要正确了。

    • terms表中的id最为关键,也是统一增加一个数字,同样这个数字同样大于新数据库中terms的id。
    • terms表中增加后的id与term_taxonomy中增加后的term_id一样,才能一一对应;
    • term_relationships表中的term_taxonomy_id与前表中的term_id及id对应。
    • term_relationships表中的第一列object_id与posts中的id不一定对应,但修改时增加的数字必须一样。

    归纳一下关键,旧数据库导出的数据要修改的部分:

    • _posts.xlsx文件中的id += 1000(假设的固定数字,新表中的id最大值,可以大不能小)
    • _postmeta.xlsx文件中的post_id += 1000,删掉meta_id列。
    • _terms.xlsx文件中的term_id += 88(假设的第二个固定数字,同样与新表对应,只能大不能小)
    • _term_taxonomy.xlsx中的term_taxonomy_id = (term_id += 88)
    • _term_relationships.xlsx文件中term_taxonomy_id += 88;object_id += 1000

    大概就是这样了,完美导入所有数据。对于数据只要仔细一点,还是很容易解决的。


    扩展,在数据中直接批量修改id语句:

    UPDATE table_name SET id = id +1000

    补充:

    1、04-30,发现老文章特色图片有问题,匹配不上,大概看了下可能与postmeta表有关,因为当时正好也忽略了meta_ID,但因为过了一段时间了,不想再测试了,手动修改一下好了。

  • 解决:可选的模组zip未被安装或已被禁用

    解决:可选的模组zip未被安装或已被禁用

    wordpress升级到5.4版本发现加入了站点健康提示,可以直观的发现一些问题,看到了就想去解决掉。

    缺少一个或多个推荐的模组

    ……
    警告 可选的模组imagick未被安装或已被禁用。
    警告 可选的模组zip未被安装或已被禁用。

    第一个警告很好解决,yum安装后重启一下php-fpm就可以了,刷新页面就只有一个缺少模组ZIP提示了。命令如下:

    # yum install php-imagick

    主要是第二个zip扩展,有点麻烦,需要自己下载编译安装,主要存在依赖包的问题及一些未知麻烦,咱一步步来。

    # wget http://pecl.php.net/get/zip-1.18.2.tgz
    # tar -zxvf zip-1.18.2.tgz
    # cd zip-1.18.2
    # /usr/bin/phpize
    # ./configure --with-php-config=/usr/bin/php-config
    # make
    # make install
    # make test
    # vim /etc/php.ini //zip安装成功后在php.ini中加入一行:
    extension=zip.so

    备注:以上目录可能会不一样,根据php安装路径来的,而且/usr/bin/phpize要在刚才解压的目录下运行,所以它的上一步是切换到解压的目录。后面这几个命令如果没有任何错误,算人品极好了。

    错误1:

    ./configure的时候可能会出现错误:configure: error: Please reinstall the libzip distribution

    这个错误是因为系统中的libzip版本太低,或者根本不存在。

    # yum remove libzip
    # wget https://libzip.org/download/libzip-1.6.1.tar.gz
    # tar -zxvf libzip-1.6.1.tar.gz
    # cd libzip-1.6.1
    # mkdir build && cd build && cmake .. && make && make install

    错误2:

    cmake: command not found或者cmake版本太低。

    首先通过yum安装一下看是否满足版本需求,不行就卸载后继续下载编译安装。这一步除了下载很慢没有出现其它的未知错误。

    # yum install cmake
    # yum remove cmake
    # wget https://github.com/Kitware/CMake/releases/download/v3.17.0/cmake-3.17.0.tar.gz
    # tar -zxvf cmake-3.17.0.tar.gz
    # cd cmake-3.17.0
    # ./bootstrap
    # make && make install
    # cmake --version
    make && make install
    cmake –version

    cmake安装好后,回过头去再装libzip,再装ZIP,依赖关系都解决了,中途没再出现什么问题,最后make test完成,修改/etc/php.ini文件,加入一句extension=zip.so保存重启php-fpm,理论上到此结束,如果还是不行大概率是下面错误3中的问题,zip.so没有加载成。

    错误3:

    -have your system administrator add LIBDIR to `/etc/ld.so.conf’
    ……
    Warning: PHP Startup: Unable to load dynamic library ‘zip.so’ (tried: /root/zip-1.18.2/modules/zip.so (libzip.so.5: cannot open shared object file: No such file or directory), /root/zip-1.18.2/modules/zip.so.so (/root/zip-1.18.2/modules/zip.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

    make test 中的错误提示

    Bug #72434: ZipArchive class Use After Free Vulnerability in PHP’s GC algorithm and unserialize [tests/bug72434.phpt]

    make test中的错误提示

    PHP Warning: PHP Startup: Unable to load dynamic library ‘zip.so’ (tried: /usr/lib64/php/modules/zip.so

    执行php -v的错误提示

    通过错误提示可大概知道虽然ZIP已经安装了,但配置还是有问题,php加载zip不成功,通过phpinfo页面也看不到zip扩展,wordpress中的提示依旧在。

    # vim /etc/ld.so.conf //添加以下四行保存:
    /usr/lib64
    /usr/lib
    /usr/local/lib
    /usr/local/lib64
    # ldconfig -v //同步动态库
    # systemctl restart php-fpm nginx
    # php -v //再无错误
    # php -m //最下面出现ZIP,也可以看phpinfo页面出现zip模块

    补充:

    虽然安装好了,但回想起来,要是yum能直接安装就方便多了,搜索了一下,原来也可以:

    根据版本先查找一下是否带了zip包

    yum search php73|grep zip

    其实一般都能搜索到,如果有就直接安装

    yum -y install php73-php-pecl-zip.x86_64