数据库中“特色图像”字段的结构是什么?

时间:2014-02-22 作者:Gaia

在安装了约1400个图像的WP上Media Tools 1.1 插件中,我运行了“导入外部并设置特征图像”和“设置特征图像”。

但是特色图像功能不起作用,因为它(在DB中)为图像指定了错误的文件名:它没有指向正确的文件,而是在其名称后附加了一个“1”,例如,当它应该指向“抗议-1-620x264.jpg”时,会导致“抗议-11-620x264.jpg”的404

我需要做一个search & replace 在DB on wp\\u attachment\\u metadata字段中,从文件名中删除额外的“1”。当然,我会使用regex, 但是如何处理字段的内容呢?数据的哪个部分具有要使用的特征图像?换句话说,我需要查找什么才能知道文件名是要搜索的正确文件名&;代替

例如(请注意此处的“抗议-11-620x264.jpg”)

_wp_attachment_metadata = a:5:{s:5:"width";i:800;s:6:"height";i:536;s:4:"file";s:22:"2013/11/Protest-11.jpg";s:5:"sizes";a:9:{s:9:"thumbnail";a:4:{s:4:"file";s:22:"Protest-11-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:22:"Protest-11-300x201.jpg";s:5:"width";i:300;s:6:"height";i:201;s:9:"mime-type";s:10:"image/jpeg";}s:6:"slider";a:4:{s:4:"file";s:22:"Protest-11-800x400.jpg";s:5:"width";i:800;s:6:"height";i:400;s:9:"mime-type";s:10:"image/jpeg";}s:7:"content";a:4:{s:4:"file";s:22:"Protest-11-620x264.jpg";s:5:"width";i:620;s:6:"height";i:264;s:9:"mime-type";s:10:"image/jpeg";}s:9:"spotlight";a:4:{s:4:"file";s:22:"Protest-11-580x326.jpg";s:5:"width";i:580;s:6:"height";i:326;s:9:"mime-type";s:10:"image/jpeg";}s:4:"loop";a:4:{s:4:"file";s:22:"Protest-11-174x131.jpg";s:5:"width";i:174;s:6:"height";i:131;s:9:"mime-type";s:10:"image/jpeg";}s:8:"carousel";a:4:{s:4:"file";s:21:"Protest-11-174x98.jpg";s:5:"width";i:174;s:6:"height";i:98;s:9:"mime-type";s:10:"image/jpeg";}s:8:"cp_large";a:4:{s:4:"file";s:22:"Protest-11-300x225.jpg";s:5:"width";i:300;s:6:"height";i:225;s:9:"mime-type";s:10:"image/jpeg";}s:8:"cp_small";a:4:{s:4:"file";s:20:"Protest-11-70x53.jpg";s:5:"width";i:70;s:6:"height";i:53;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:10:{s:8:"aperture";d:3.5;s:6:"credit";s:0:"";s:6:"camera";s:10:"NIKON D40X";s:7:"caption";s:0:"";s:17:"created_timestamp";i:1383833520;s:9:"copyright";s:0:"";s:12:"focal_length";s:2:"18";s:3:"iso";s:3:"200";s:13:"shutter_speed";s:7:"0.00125";s:5:"title";s:0:"";}}  

3 个回复
最合适的回答,由SO网友:Simon 整理而成

你可能不应该跑preg_replace 关于a的元数据_wp_attachment_metadata 数据序列化时的字段。我建议您编写一个小脚本来循环遍历图像、取消序列化数据、更新值、序列化和存储修改后的数组。下面是一个示例函数,它可以做到这一点:

function wpse_135525_fix_imagepaths() {
    $images = get_posts(array(
        \'post_type\' => \'attachment\',
        \'post_mime_types\' => \'image\',
        \'posts_per_page\' => -1,
        // Extra filtering, e.g. by post_date etc.
    ));

    foreach ($images as $image) {
        $attachment_meta = get_post_meta($image->ID, \'_wp_attachment_metadata\', true);
        if ($attachment_meta) {
            $attachment_meta = unserialize($attachment_meta);

            $filename = $attachment_meta[\'file\'];
            $filename = preg_replace(\'/(\\d)\\1/\', \'$1\', $filename); // Replace any two repeating digits (44 => 4, 11 => 1 etc.)

            $attachment_meta[\'file\'] = $filename;

            update_post_meta($image->ID, \'_wp_attachment_metadata\', serialize($attachment_meta)); 
        }
    }
}
您可能希望将post查询限制为仅处理在定义的时间段内创建的附件,并且regex应该需要一些改进,以防止它替换文件名等第一部分中的任何重复数字。

SO网友:K Themes

您可以在“meta\\u key”列中查询“post\\u meta”表中的“\\u thumbnail\\u id”(正如Milo所说)并选择“meta\\u value”列,从而获得特征图像的所有id。

然后将您的值替换为相同的“post\\u meta”表中的值,其中“post\\u id”是上面的值,“meta\\u key”是“\\u wp\\u attached\\u file”和/或“\\u wp\\u attachment\\u metadata”

希望这有意义

SO网友:ssaltman

我对1100张图片也有同样的问题:

这将从元数据中完全删除文本。你也可以用你的网站名称或其他东西来替换文本,例如“Mysite图片”。

  UPDATE wp_postmeta SET meta_value = 
  REPLACE( meta_value,  \'OLYMPUS DIGITAL CAMERA\',  
  \'                      \' ) 
  WHERE meta_value LIKE  \'%OLYMPUS DIGITAL CAMERA%\' 
  AND meta_key =  \'_wp_attachment_metadata\';
替换为特定文本:

  UPDATE wp_postmeta SET meta_value = 
  REPLACE( meta_value,  \'OLYMPUS DIGITAL CAMERA\',  \'Mysitename Image    \' ) 
  WHERE meta_value LIKE  \'%OLYMPUS DIGITAL CAMERA%\' 
  AND meta_key =  \'_wp_attachment_metadata\';
对于特定图像或通过meta\\u id或post\\u id等测试限制

 UPDATE wp_postmeta SET meta_value = 
 REPLACE( meta_value,  \'OLYMPUS DIGITAL CAMERA\',  \'                      \' ) 
 WHERE meta_value LIKE  \'%OLYMPUS DIGITAL CAMERA%\' 
 AND meta_key =  \'_wp_attachment_metadata\' AND meta_id =705412;
编辑:根据Gaia的观点,我应该提到新字符串的长度必须与旧字符串的长度匹配,否则元数据可能会中断。

另外,我想补充一点,这里有一个脚本我没有使用过,但在研究这个问题时发现了它。

http://davidcoveney.com/575/php-serialization-fix-for-wordpress-migrations/

结束

相关推荐

SQL database export-import

我开发的网站包含WordPress博客以及我设计的其他PHP页面。当我在测试服务器上本地更改站点时,我使用myPHPAdmin进行SQL数据库转储。如何避免覆盖客户端WordPress日历条目和其他日历设置的内容?如果我只是在localhost db dump上取消选择日历表,那么在导入之后,客户端的db会维护远程服务器上表的这些客户端条目吗?提前感谢