我目前有一个网站,有许多自定义的帖子类型。我希望理想的结构如下/wp-content-uploads/posttype/postid/xxxx.jpg
. 所有图片都是帖子本身的附件
我有一个脚本,可以使用以下MySQL移动当前图像
SELECT p.id, p.post_type, p.guid, p.post_parent, m.meta_id, m.meta_key, m.meta_value, p2.post_type as parent_type
FROM wp_posts AS p
INNER JOIN wp_postmeta AS f ON f.post_id = p.id AND f.meta_key = \'_wp_attached_file\'
INNER JOIN wp_postmeta AS m ON m.post_id = p.id AND m.meta_key = \'_wp_attachment_metadata\'
INNER JOIN wp_posts AS p2 ON p2.id = p.post_parent
WHERE p.post_type = \'attachment\'
AND p2.post_type IN(\'customposttype1\',\'customposttype2\',\'customposttype3\')
有了这些,我获得了所有相关信息,以便创建各种文件夹和移动图像,所以这方面的事情不是问题。
我的问题是,当我运行脚本并移动图像时,帖子仍然引用旧图像,即wp-content/uploads/xxx.jpg
.
移动图像后,我将更新wp_posts
表中,我想这应该是存储图像位置的位置,但现在我猜测wordpress使用固定的上载结构,这取决于在后端选择的内容,而不是将位置存储在数据库中。
是否有人可以确认是否存在这种情况,或者是哪个表存储了我可以在脚本中更改的图像的实际路径,以使图像按预期显示。
我备份了数据库并查看了文件,在一些地方看到了引用的图像,但所有完整路径都以我提供的格式显示。
最合适的回答,由SO网友:WebElaine 整理而成
GUID不是图像的URL。它通常会(巧合地)成为图像的原始URL,因为它需要一个唯一的标识符——但这就是WordPress使用它作为唯一标识符的全部目的。
您的代码应该成功更新帖子的特色图片的URL,但只更新特色图片。听起来您可能在post\\u内容本身中遇到了对图像的引用(例如,在(prefix)\\u posts表中,在每个post和修订的post\\u content列中)。经典编辑器和块编辑器都会出现这种情况-完整图像路径包含在<;img>;标签
因此,您必须更新所有包含图像的帖子/页面/CPT。这在PHP中可能是最简单的,您可以在PHP中获取所有帖子,使用正则表达式循环它们,并以编程方式替换图像路径。(如果您运行的是一个较小的网站,只有一点旧内容,那么手工操作可能会更快。)
但是,数据库中还有一个地方引用了图像的位置,即您在媒体库中看到的URL,因此WordPress知道当您将图像添加到新帖子时,它将添加正确的路径。这在(前缀)\\u postmeta表中。对于每个单独的图像文件,您可以在(前缀)\\u帖子中找到一个条目,您可以从中获取ID。然后,对于这些ID中的每一个,在(prefix)\\u posmeta表中将有两个键引用路径。“\\u wp\\u attached\\u file”postmeta将路径和文件名存储为简单字符串。更复杂的是另一个问题,“\\u wp\\u attachment\\u metadata”。这会将路径和文件名存储在序列化数组中,这意味着您不能只搜索和替换字符串,否则会破坏序列化。因此,需要做更多的工作才能找到一种方法来更新Posteta值,使WordPress能够在正确的位置查找图像。
实际上,如果您的图像库很小,您甚至可以考虑通过媒体库将所有媒体新上载到新位置,然后返回并手动更新帖子(当然,如果您的站点较大,这将非常耗时,因此您可能希望了解序列化,并以编程方式进行操作。)