事情起源于博主之前更改网站域名,出于SEO考虑,也将文章固定链接由https://bak.yantuz.cn:8000/blog/401/
改为https://bak.yantuz.cn:8000/401.html
这种形式了。经过之前修改Nginx重定向和百度站长平台改版,已经基本完成了换域名和和换固定链接的工作。
最近在翻阅之前文章的时候发现,以前文章中固定的文内链接仍然是href="/blog/401/"
这种形式,一篇篇修改未免复杂,与是就考虑用正则表达式来一次批量替换!
MySQL正则查询
本来想直接在数据库中进行正则替换的,但是MySQL只支持正则查询,并不能进行正则替换,与是首先利用MySQL查询出所有带有旧链接的文章。
SELECT * from wp_posts where post_content REGEXP '\/blog\/[0-9]+'
以此找到了所有带有类似/blog/401
的文章。
刚才说过MySQL不能执行正则替换,所以要想替换还得运用PHP,与是写了一小段代码来实现替换。
PHP正则替换
首先建立数据库连接,这里博主采用了一个PHP数据库操作类,Medoo,免去了写繁复的SQL查询语句,还能防止注入。
安装Medoo
$ composer require catfan/Medoo
引用并初始化
// If you installed via composer, just use this code to requrie autoloader on the top of your projects. require 'vendor/autoload.php'; // Using Medoo namespace use Medoo\Medoo; // Initialize $database = new Medoo([ 'database_type' => 'mysql', 'database_name' => 'name', 'server' => 'localhost', 'username' => 'your_username', 'password' => 'your_password' ]);
或者引用wp-config.php
文件,直接调用wp-config中的数据库配置信息初始化数据库,如:
require 'wp-config.php'; $database = new Medoo([ 'database_type' => 'mysql', 'database_name' => DB_NAME, 'server' => DB_HOST, 'username' => DB_USER, 'password' => DB_PASSWORD, 'charset' => DB_CHARSET ]); //根据表前缀定义表名; $tbPosts = $table_prefix.'posts';
遍历所有文章,如果发现有符合查询条件的内容,则进行正则替换
//获取所有文章ID和内容 $contents = $database->select($tbPosts, [ "ID","post_content" ]); //遍历文章列表 foreach($contents as $con){ //如果存在链接形式如 “/blog/233/”这种形式的链接 if(preg_match('/\/blog\/(\d+)\/"/',$con['post_content'])){ //转换链接为“233.html” $newCon = preg_replace('/\/blog\/(\d+)\/"/','/$1.html"',$con['post_content']); //更新数据库 $database->update($tbPosts,[ 'post_content' => $newCon ],[ 'ID'=>$con['ID'] ]); } }
源码打包
GitHub:/myCode
源码已集成了Medoo,所以不用再次安装,直接部署即可使用。有类似需求的同学可以下载使用,记得修改正则部分。