出于某种原因,我的媒体库中的一些缩略图正在随机丢失。
我发现数据库中没有_wp_attachment_metadata
,因为这些图片缺少缩略图。然而,这些文件存在于磁盘上--包括原始文件和“裁剪”大小。
我还遇到了下面的片段,它应该修复丢失的元数据,但是它没有按预期工作(请参阅后面的代码)
/** * 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); } } } }
(来源)
上面的代码修复了媒体库中丢失的缩略图,但有一些不一致之处:
对于以前正确的图像,未序列化的_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 ( ) )
发布于 2019-02-27 19:52:19
使用wp media regenerate
命令参数从WP运行--only-missing
非常快(对于4000个图像大约需要30秒),并正确地重新构建_wp_attachment_metadata
:
wp media regenerate --only-missing
发布于 2021-03-04 04:12:25
上面有一些不工作的链接,所以如果有人在2021年(特别是在移动WP之后)仍在努力解决这个问题,我在这里找到了一个解决方案:
https://barebones.dev/articles/rebuild-meta-data-for-media-items-that-are-missing-it/
为将来保存原始源,但我必须删除元查询才能正常工作。(几百个附件花了很长时间,所以考虑构建一个计数器,并在前端执行一些限制器,因为限制posts_per_page不能很好地工作,除非您按兰特订购,运行很多次,但这不是一个好主意:)
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 );
}
发布于 2019-03-06 15:31:44
你的网站真正的问题是“我的媒体库的缩略图正在随机丢失”,这是你首先应该尝试修复的。你在你的信息中给出了一个提示,为什么会发生这样的事情:“它在非常大的图像上也会出错”。这是因为当when服务器试图为您的图像构建缩略图时,它就会从RAM中消失。潜在的其他图像在它的边缘被转换,因此它们随机失败。
您需要升级您的托管计划或使用/上载较小的图像。
https://wordpress.stackexchange.com/questions/330174
复制相似问题