一个乐于分享的博客
关注互联网折腾服务器分享码农的日常

用PHP正则替换MySQL数据 实现批量替换WP文内链接

用PHP正则替换MySQL数据 实现批量替换WP文内链接

事情起源于博主之前更改网站域名,出于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:yhf7952/myCode

源码已集成了Medoo,所以不用再次安装,直接部署即可使用。有类似需求的同学可以下载使用,记得修改正则部分。

转载务必注明出处:岩兔站 » 用PHP正则替换MySQL数据 实现批量替换WP文内链接
赞 (1) or 打赏

讨论区 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址