【问题标题】:MySQL query to find and replace urls that point to the root of a directory but not a subdirectory underneath itMySQL 查询以查找和替换指向目录根目录但不指向其下的子目录的 url
【发布时间】:2015-04-19 23:11:13
【问题描述】:

我在 WordPress 核心升级中遇到问题,它会删除我上传目录根目录中的图像。

为了解决这个问题,我正在尝试通过 WordPress 再次上传图片,并让帖子内容中的 URL 按年和月在上传目录中的子目录中指向它们的新位置。

所以我需要对 MySQL 查询做的基本上是:

查找:位于“wp-content/uploads”根目录下的文件但不会进入其他目录,例如“wp-content/uploads/2014/...”

对于这些结果,请将“wp-content/uploads”替换为:“wp-content/uploads/2015/04”。

我可能会使用如下查询:

UPDATE wp_posts SET post_content = replace(post_content, 'oldpath', 'newpath');

有没有办法只查找与“uploads”目录的根匹配的结果,而不去其他目录?

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    您可以使用regexp 查找匹配或不匹配的行,并根据该条件进行更新。

    update wp_posts
      set post_content = replace(post_content, 'oldpath', 'newpath')
      where post_content not regexp 'wp-content/uploads/.*/.*'
    

    这是一个简单的正则表达式,但它应该可以完成工作。

    mysql> select 'wp-content/uploads/1.jpg' not regexp 'wp-content/uploads/.*/.*';
    +------------------------------------------------------------------+
    | 'wp-content/uploads/1.jpg' not regexp 'wp-content/uploads/.*/.*' |
    +------------------------------------------------------------------+
    |                                                                1 |
    +------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select 'wp-content/uploads/2014/1.jpg' not regexp 'wp-content/uploads/.*/.*';
    +-----------------------------------------------------------------------+
    | 'wp-content/uploads/2014/1.jpg' not regexp 'wp-content/uploads/.*/.*' |
    +-----------------------------------------------------------------------+
    |                                                                     0 |
    +-----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    将正则表达式更新为更独特
    'wp-content/uploads/.*/.*'; 更改为'wp-content/uploads/[^/]*/[^"]*"';,它将在您在下面发布的小提琴中工作,请在此处查看更新版本:http://sqlfiddle.com/#!9/d636b/1(当然请在执行此操作之前进行备份)

    【讨论】:

    • 我试过这个并收到以下错误消息:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'regexp 'wp-content/uploads/.*/.*'' 附近使用正确的语法。作为参考,我使用的是 MySQL 版本 5.5.29
    • 啊废话。对不起。固定的。忘记告诉查询我们正在针对什么进行正则表达式
    • 谢谢。更新后的查询运行但影响了 0 行,这是不对的。
    • 您可以将一些示例行发布到 sql fiddle 中吗?例如,此处显示了确切的语法:sqlfiddle.com/#!9/a05db/2,结果符合预期。您确实将“旧路径”和“新路径”更改为您想要的值?
    • 感谢您的提琴。是的,我更改了 'oldpath' 和 'newpath',但检查一下也无妨。有趣的。我认为 post_content 表中实际上可能有 0 个受影响的行,但 wp_postmeta 表中肯定应该有。我修改了查询以在 wp_postmeta 上运行。拨弄sqlfiddle.com/#!9/446ab/1。它不会按预期改变路径。
    猜你喜欢
    • 2012-05-27
    • 2023-03-17
    • 2014-10-30
    • 1970-01-01
    • 2015-12-14
    • 2019-04-29
    • 2012-02-13
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多