我的一个客户在他们的网站上使用了 Velvet Blues 更新 URL 插件 ( https://en-gb.wordpress.org/plugins/velvet-blues-update-urls/ ),并且破坏了几乎所有的链接...
现在链接看起来像:www.site.compost-name/
而不是 www.site.com/post-name/
。
这是一个实时网站,因此我需要非常小心地修复它,以免让事情变得更糟。
所以我知道我需要某种正则表达式来检查网站网址,后跟字母或数字而不带 /
。
我可以通过运行如下查询来查看很多损坏的链接:SELECT * FROM wp_postmeta WHERE meta_value REGEXP 'site.com[0-9 a-z A-Z]'
。
通常在更新数据库中的某些内容时,我会运行如下查询:UPDATE wp_postmeta SET meta_value = Replace(meta_value,'http://www.oldurl','http://www.newurl') ;
.
但是根据我的研究发现,MySQL 不支持一种 preg_replace
功能 ( How to do a regular expression replace in MySQL? )。
我猜一种方法可能是向 wp_content 添加过滤器并在将其加载到页面上之前对其进行修复,但这只能掩盖问题,并不一定能修复它。
我对此有点困惑,因为有数千个损坏的链接,因此搜索和替换查询的范围很大,可能会出错并可能使事情变得更糟,而且我的正则表达式知识有限。
最佳答案
为此,您可以使用 NOT LIKE 操作数。 例如,
UPDATE wp_postmeta
SET meta_value=REPLACE(meta_value,'site.com','site.com/')
WHERE meta_value LIKE '%site.com%'
AND
meta_value NOT LIKE '%site.com/%'
当然,为了以防万一,您需要先运行 SELECT 查询并查看结果。因为这不是理想的方法,可能会导致一些罕见的问题。
关于php - 如何使用 MySQL 搜索和替换修复 WordPress 中损坏的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51221531/