由于某种原因,我的媒体库的一些缩略图正在随机丢失。
我发现了_wp_attachment_metadata
数据库中不存在缺少缩略图的图像。然而,这些文件都存在于磁盘上,包括原始文件和“裁剪”大小。
The purpose of this question is not to find out why this happens, 我写了一个different question 为此
Again, in this context all I want is to fix the symptoms, while I haven\'t found out the cause yet.
<我的目标是重建缺失的缩略图。
我已经尝试过的:
Fix My Posts 插件:显示一个仪表,它在几秒钟内从0%变为100%,但没有差别Fix Media Library 插件:即使选择“重新生成附件元数据和缩略图”,每个图像也需要大约1秒的时间。它也会在非常大的图像上出错,所以对我来说,它会处理大约100个图像,然后停止我还遇到了下面的代码片段,该代码片段应该可以修复丢失的元数据,但它没有按预期工作(请参见代码后的详细信息)
/**
* fix broken image metadata so that thumbs can be regenerated
*/
function fixImageMeta() {
global $wpdb;
$sql = "
select ID from {$wpdb->posts}
where post_type = \'attachment\'
and post_mime_type like \'image/%\'
";
$images = $wpdb->get_col($sql);
foreach ($images as $id) {
$meta = wp_get_attachment_metadata($id);
if (!$meta) {
$file = get_attached_file($id);
if (!empty($file)) {
$info = getimagesize($file);
$meta = array (
\'width\' => $info[0],
\'height\' => $info[1],
\'hwstring_small\' => "height=\'{$info[1]}\' width=\'{$info[0]}\'",
\'file\' => basename($file),
\'sizes\' => array(), // thumbnails etc.
\'image_meta\' => array(), // EXIF data
);
update_post_meta($id, \'_wp_attachment_metadata\', $meta);
}
}
}
}
(
source)
以上代码修复了媒体库上缺失的缩略图,但存在一些不一致之处:
未序列化_wp_attachment_metadata
对于以前正确的图像:
Array
(
[width] => 700
[height] => 430
[file] => 2019/02/filename.png
[sizes] => Array
(
[thumbnail] => Array
(
[file] => filename-150x150.png
[width] => 150
[height] => 150
[mime-type] => image/png
)
[medium] => Array
(
[file] => filename-300x184.png
[width] => 300
[height] => 184
[mime-type] => image/png
)
)
[image_meta] => Array
(
[aperture] => 0
[credit] =>
[camera] =>
[caption] =>
[created_timestamp] => 0
[copyright] =>
[focal_length] => 0
[iso] => 0
[shutter_speed] => 0
[title] =>
[orientation] => 0
[keywords] => Array
(
)
)
)
未序列化
_wp_attachment_metadata
对于“固定”图像:
Array
(
[width] => 700
[height] => 430
[hwstring_small] => height=\'430\' width=\'700\'
[file] => filename.png
[sizes] => Array
(
)
[image_meta] => Array
(
)
)
SO网友:err
上面有一些非工作链接,因此,如果有人在2021仍在努力解决这个问题(特别是在移动WP之后),我在这里找到了一个工作解决方案:
https://barebones.dev/articles/rebuild-meta-data-for-media-items-that-are-missing-it/
为将来保存源代码,但我必须删除元查询才能正常工作。(数百个附件花费了相当长的时间,因此考虑在foreach中构建一个计数器,并在foreach中执行一些从到限制的操作,因为限制每页的posts\\u不会很好地工作,除非您按rand订购,并且运行了很多次,但这不是一个好主意:))
require_once(\'wp-load.php\');
if ( ! function_exists( \'wp_crop_image\' ) ) {
include( ABSPATH . \'wp-admin/includes/image.php\' );
}
$attachments = get_posts(
[
\'post_type\' => \'attachment\',
\'posts_per_page\' => -1,
\'fields\' => \'ids\',
\'meta_query\' => [
[
\'key\' => \'_wp_attachment_metadata\',
\'compare\' => \'NOT EXISTS\'
]
]
]
);
foreach($attachments as $attachment_id)
{
$url = get_attached_file($attachment_id);
if (strpos($url, \'.svg\') !== false) continue;
$attach_data = wp_generate_attachment_metadata($attachment_id, $url);
wp_update_attachment_metadata( $attachment_id, $attach_data );
}