wp_restore_image()
云策文档标注
概述
wp_restore_image() 函数用于恢复指定附件的元数据,主要处理图像编辑后的还原操作。它通过备份数据恢复原始图像文件及其尺寸信息,并管理备份元数据的更新或删除。
关键要点
- 函数接受一个必需的整数参数 $post_id,表示附件ID,并返回一个 stdClass 对象,包含恢复状态消息。
- 核心逻辑包括:检查备份元数据是否存在,恢复原始图像文件,更新附件元数据中的尺寸信息,并根据 IMAGE_EDIT_OVERWRITE 常量决定是否删除备份。
- 函数依赖于多个 WordPress 核心函数,如 wp_get_attachment_metadata()、update_attached_file() 和 wp_update_attachment_metadata() 等。
代码示例
// 示例调用 wp_restore_image()
$post_id = 123; // 附件ID
$result = wp_restore_image( $post_id );
if ( isset( $result->msg ) ) {
echo $result->msg; // 输出成功消息
} else if ( isset( $result->error ) ) {
echo $result->error; // 输出错误消息
}注意事项
- 函数要求备份元数据以数组形式存在,否则会返回错误消息“Cannot load image metadata.”。
- 恢复过程中,如果 IMAGE_EDIT_OVERWRITE 常量被定义且为真,将删除编辑后的图像文件并清除备份元数据;否则会创建新的备份条目。
- 函数在恢复失败时可能返回错误消息,如“Cannot save image metadata.”或“Image metadata is inconsistent.”,开发者需妥善处理这些情况。
原文内容
Restores the metadata for a given attachment.
Parameters
$post_idintrequired-
Attachment post ID.
Source
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'],
'filesize' => $meta['filesize'],
'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'];
if ( isset( $data['filesize'] ) ) {
/*
* Restore the original filesize if it was backed up.
*
* See https://core.trac.wordpress.org/ticket/59684.
*/
$meta['filesize'] = $data['filesize'];
}
}
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;
}
Changelog
| Version | Description |
|---|---|
| 2.9.0 | Introduced. |