函数文档

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.

Return

stdClass Image restoration message object.

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.