重新生成MISSING_WP_ATTACH_METADATA

时间:2019-02-27 作者:That Brazilian Guy

由于某种原因,我的媒体库的一些缩略图正在随机丢失。

我发现了_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.

<我的目标是重建缺失的缩略图。

我已经尝试过的:

  • This WP SE answer.
  • Regenerate Thumbnails 插件:如果我打开该特定图像的附件详细信息面板并按下“重新生成缩略图”按钮,我会收到以下消息:“错误:无法加载此附件的元数据。”
  • 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
            (
            )
    
    )
    

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

    运行wp media regenerate command 从WP-CLI--only-missing 参数非常快(4000幅图像大约需要30秒)并且可以重建_wp_attachment_metadata 正确:

    wp media regenerate --only-missing

    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 );
    
    }
    

    SO网友:WowPress.host

    你网站的真正问题是“我的媒体库的缩略图正在随机丢失”,这是你应该首先尝试修复的问题。你在你的信息中给出了一个提示:“它也会在非常大的图像上出错”。这是因为当Web服务器尝试为您的图像构建缩略图时,内存不足。其他图像可能会在其边缘进行转换,因此它们会随机失败。

    您需要升级托管计划或使用/上载较小的图像。

    相关推荐

    Adding Images into API

    我正试图将特色图片添加到我的API中,但这是一种不同类型的帖子。http://example.com/wp-json/wp/v2/directory我一直在使用WP REST API控制器,但它没有显示图像选项。我也尝试使用“更好的RESTAPI特色图片”,但运气不好。这开始让我恼火了。