wp_restore_image

The timeline below displays how wordpress function wp_restore_image has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $old_backup_sizes = $backup_sizes;
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] !== $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's an edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    wp_delete_file($file);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] !== $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's an edited image.
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        $delete_file = path_join($parts['dirname'], $meta['sizes'][$default_size]['file']);
                        wp_delete_file($delete_file);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || $old_backup_sizes !== $backup_sizes && !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
        if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
            delete_post_meta($post_id, '_wp_attachment_backup_sizes');
        }
    }
    return $msg;
}

WordPress Version: 6.2

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $old_backup_sizes = $backup_sizes;
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's an edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    wp_delete_file($file);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's an edited image.
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        $delete_file = path_join($parts['dirname'], $meta['sizes'][$default_size]['file']);
                        wp_delete_file($delete_file);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || $old_backup_sizes !== $backup_sizes && !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
        if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
            delete_post_meta($post_id, '_wp_attachment_backup_sizes');
        }
    }
    return $msg;
}

WordPress Version: 5.3

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $old_backup_sizes = $backup_sizes;
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's an edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    wp_delete_file($file);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's an edited image.
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        $delete_file = path_join($parts['dirname'], $meta['sizes'][$default_size]['file']);
                        wp_delete_file($delete_file);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || $old_backup_sizes !== $backup_sizes && !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}

WordPress Version: 4.4

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = $old_backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's an edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    wp_delete_file($file);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's an edited image.
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        $delete_file = path_join($parts['dirname'], $meta['sizes'][$default_size]['file']);
                        wp_delete_file($delete_file);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || $old_backup_sizes !== $backup_sizes && !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}

WordPress Version: 4.2

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = $old_backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    wp_delete_file($file);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's edited image
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        $delete_file = path_join($parts['dirname'], $meta['sizes'][$default_size]['file']);
                        wp_delete_file($delete_file);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || $old_backup_sizes !== $backup_sizes && !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}

WordPress Version: 4.1

/**
 * @param int $post_id
 * @return stdClass
 */
function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    /** This filter is documented in wp-admin/custom-header.php */
                    $delpath = apply_filters('wp_delete_file', $file);
                    @unlink($delpath);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's edited image
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        /** This filter is documented in wp-admin/custom-header.php */
                        $delpath = apply_filters('wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']));
                        @unlink($delpath);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}

WordPress Version: 4.0

function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // Delete only if it's edited image.
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    /** This filter is documented in wp-admin/custom-header.php */
                    $delpath = apply_filters('wp_delete_file', $file);
                    @unlink($delpath);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // Delete only if it's edited image
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        /** This filter is documented in wp-admin/custom-header.php */
                        $delpath = apply_filters('wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']));
                        @unlink($delpath);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}

WordPress Version: 3.7

function wp_restore_image($post_id)
{
    $meta = wp_get_attachment_metadata($post_id);
    $file = get_attached_file($post_id);
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $restored = false;
    $msg = new stdClass();
    if (!is_array($backup_sizes)) {
        $msg->error = __('Cannot load image metadata.');
        return $msg;
    }
    $parts = pathinfo($file);
    $suffix = time() . rand(100, 999);
    $default_sizes = get_intermediate_image_sizes();
    if (isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig'])) {
        $data = $backup_sizes['full-orig'];
        if ($parts['basename'] != $data['file']) {
            if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                // delete only if it's edited image
                if (preg_match('/-e[0-9]{13}\./', $parts['basename'])) {
                    /** This filter is documented in wp-admin/custom-header.php */
                    $delpath = apply_filters('wp_delete_file', $file);
                    @unlink($delpath);
                }
            } elseif (isset($meta['width'], $meta['height'])) {
                $backup_sizes["full-{$suffix}"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
            }
        }
        $restored_file = path_join($parts['dirname'], $data['file']);
        $restored = update_attached_file($post_id, $restored_file);
        $meta['file'] = _wp_relative_upload_path($restored_file);
        $meta['width'] = $data['width'];
        $meta['height'] = $data['height'];
    }
    foreach ($default_sizes as $default_size) {
        if (isset($backup_sizes["{$default_size}-orig"])) {
            $data = $backup_sizes["{$default_size}-orig"];
            if (isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file']) {
                if (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE) {
                    // delete only if it's edited image
                    if (preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file'])) {
                        /** This filter is documented in wp-admin/custom-header.php */
                        $delpath = apply_filters('wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']));
                        @unlink($delpath);
                    }
                } else {
                    $backup_sizes["{$default_size}-{$suffix}"] = $meta['sizes'][$default_size];
                }
            }
            $meta['sizes'][$default_size] = $data;
        } else {
            unset($meta['sizes'][$default_size]);
        }
    }
    if (!wp_update_attachment_metadata($post_id, $meta) || !update_post_meta($post_id, '_wp_attachment_backup_sizes', $backup_sizes)) {
        $msg->error = __('Cannot save image metadata.');
        return $msg;
    }
    if (!$restored) {
        $msg->error = __('Image metadata is inconsistent.');
    } else {
        $msg->msg = __('Image restored successfully.');
    }
    return $msg;
}