WordPress迁移:更换域名,修改固定链接结构

非必要,不要去换域名、更改固定链接结构;因为改完后,baidu/google/bing等外部链接,还是原来老的…

注意:是要操作数据库的

更换网站域名

以下内容专注站点本身的恢复,如果wordpress目录也有变化,也需要做调整表记录值。实际中,还得考虑搜索引擎的收录、外部链接更新等等。

在wordpress 6.7.2上成功。

SQL
-- DBeaver 动态参数
@set oldUrl = https://t725.cn
@set newUrl = https://blog.t725.cn

select * from wp_options o WHERE o.option_value LIKE '%${oldUrl}%';
-- UPDATE wp_options SET option_value = replace(option_value, '${oldUrl}', '${newUrl}') WHERE option_value LIKE '%${oldUrl}%';
select * from wp_posts p WHERE p.guid LIKE '%${oldUrl}%' ;
-- UPDATE wp_posts SET guid = replace(guid, '${oldUrl}', '${newUrl}') WHERE guid LIKE '%${oldUrl}%';
select * from wp_posts p WHERE p.post_content LIKE '%${oldUrl}%'; -- 正文里,上传的图片URL
-- UPDATE wp_posts SET post_content = replace(post_content, '${oldUrl}', '${newUrl}') WHERE post_content LIKE '%${oldUrl}%';
select * from wp_postmeta m WHERE m.meta_value LIKE '%${oldUrl}%';
-- UPDATE wp_postmeta SET meta_value = replace(meta_value, '${oldUrl}', '${newUrl}') WHERE meta_value LIKE '%${oldUrl}%';
select * from wp_usermeta u WHERE u.meta_value LIKE '%${oldUrl}%'; -- simple_local_avatar 插件,上传的头像URL
-- UPDATE wp_usermeta SET meta_value = replace(meta_value, '${oldUrl}', '${newUrl}') WHERE meta_value LIKE '%${oldUrl}%';

COMMIT;

修改固定链接结构

网上的WP Permalinks Migration插件,在插件商店里搜索不到了。还有Custom Permalinks、Permalink Manager Lite插件,不想装了。

思路:先安装插件 Redirection,再找出现有访问URI与文章ID(/p?=id)的关联关系,后批量插入到插件 Redirection中。

实战:原URI是 /%postname%/ ,在6.8.2上成功。

1、访问URI与文章ID(/p?=id)的关联

SQL
select p.id,p.post_name from wp_posts p WHERE p.post_type ='post' AND p.post_status='publish';

2、生成批量插入 wp_redirection_items 记录的示例SQL

SQL
INSERT INTO wordpress.wp_redirection_items
(url, match_url, match_data, regex, `position`, last_count, last_access, group_id, status, action_type, action_code, action_data, match_type, title)
VALUES('/{给人看的post_name,也就是原URI}/', '/{p.post_name,也就是原URI}', NULL, 0, {分组ID下记录序号,从0开始}, 0, '1970-01-01 00:00:00.000', {插件 Redirection的分组ID}, 'enabled', 'url', 301, '/?p={post_id}', 'url', NULL);
  • {xxx}代表变化的值
  • {给人看的post_name,也就是原URI}是值{p.post_name,也就是原URI}的,URL解码后的值。

3、将第一步的所有记录数据,加工成第二步数据记录。

  • Excel大法:要注意含数字的,在批量拖拉时,会变成自增长序号,而有字段是只能复制,比如301
  • Select 文本拼接大法:可使用行号,来解决{分组ID下记录序号,从0开始}值的生成。
SQL
-- 行号处理 mysql 自定义变量显示行号@rowno,简洁而实用
SELECT @rowno:=@rowno+1 as rowno,r.* from grade_table r ,(select @rowno:=0) t;

4、调整WordPress设置中,固定链接的结构为 /post/%postname%/

5、在数据库中执行第三步生成的SQL

6、手工增加一条正则表达式重定向,用来处理原来URI中分页与feed的访问。

^/(?!(post|page|category|tag))(.*)/(\d|feed)/$

$2引用(.*)

还有不建议使用的扩展版本,Nginx配置正则表达式:^/(?!(feed|page|post|tag|category|privacy-policy|contact-us|wp-json|wp-admin|wp-content|wp-includes|additional|autodiscover)).*/

  • 虽然可以命中不是以上列举的,开头的(非法URI)请求,但有缺点
    1. 存在会误杀 /? 开头的正常请求,比如:/?rest_route=/
    2. 使用以上列举开头,也不会命中,比如: /feedABC/
    3. URI开头 /.XXX 的请求,也不会命中,但可以为单独location解决
    4. 没有使得 / 结尾的请求,也不会命中
    5. 需要固定链接为 /post/ 开头
    6. 还有没有其他,正常请求URI?

7、检查原来老的URI(文章、页面、标签、分类),是否能正确重定向到文章里,而页面、标签、分类有没有影响。

  • 后续1~3,还得检查,看有没有404记录产生。

修改 wordpress 数据库的表名前缀

两种方法:使用插件 DB PREFIX,或手工调整。

手工方式有三步,目前看下来,只适合由安装自义值改回默认值(第三步从wp_改为其他值,会查找出其他记录)。

  1. wp-config.php 数据库前缀改回为 wp_ ,注意区分大小写
$table_prefix  = 'wp_';
  1. 改表名:收集所有表名,后批量修改表名。
SQL
show TABLES;  -- 收集表名
RENAME TABLE my_commentmeta TO wp_commentmeta;   -- 改表名方式一
ALTER TABLE my_commentmeta RENAME AS wp_commentmeta;   --  改表名方式二
  1. 调整记录值,在wordpress 6.7.2上成功。
SQL
-- REPLACE(option_name, 'my_', 'wp_')  注意区分大小写,先 select 确认。
SELECT REPLACE(o.option_name, 'my_', 'wp_'),o.* FROM wp_options o WHERE o.option_name LIKE 'my_%';
SELECT REPLACE(u.meta_key, 'my_', 'wp_'),u.* FROM wp_usermeta u WHERE u.meta_key LIKE 'my_%';

UPDATE wp_usermeta u SET u.meta_key=REPLACE(u.meta_key, 'my_', 'wp_') WHERE u.meta_key LIKE 'my_%';
UPDATE wp_options o SET o.option_name=REPLACE(o.option_name, 'my_', 'wp_') WHERE o.option_name LIKE 'my_%';
COMMIT;

将用户密码重置为123456

SQL
UPDATE wp_users SET user_pass = '$1$rSziHLDY$399k.JuJsy.oHVp5lquJC.' WHERE ID = N;

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注