Title: wp_restore_image
Published: April 25, 2014
Last modified: February 24, 2026

---

# wp_restore_image( int $post_id ): stdClass

## In this article

 * [Parameters](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#wp--skip-link--target)

Restores the metadata for a given attachment.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#parameters)󠁿

 `$post_id`intrequired

Attachment post ID.

## 󠀁[Return](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#return)󠁿

 stdClass Image restoration message object.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#source)󠁿

    ```php
    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;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/image-edit.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/image-edit.php#L810)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/image-edit.php#L810-L902)

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_delete_file()](https://developer.wordpress.org/reference/functions/wp_delete_file/)`wp-includes/functions.php` |

Deletes a file.

  | 
| [path_join()](https://developer.wordpress.org/reference/functions/path_join/)`wp-includes/functions.php` |

Joins two filesystem paths together.

  | 
| [get_intermediate_image_sizes()](https://developer.wordpress.org/reference/functions/get_intermediate_image_sizes/)`wp-includes/media.php` |

Gets the available intermediate image size names.

  | 
| [wp_get_attachment_metadata()](https://developer.wordpress.org/reference/functions/wp_get_attachment_metadata/)`wp-includes/post.php` |

Retrieves attachment metadata for attachment ID.

  | 
| [wp_update_attachment_metadata()](https://developer.wordpress.org/reference/functions/wp_update_attachment_metadata/)`wp-includes/post.php` |

Updates metadata for an attachment.

  | 
| [update_post_meta()](https://developer.wordpress.org/reference/functions/update_post_meta/)`wp-includes/post.php` |

Updates a post meta field based on the given post ID.

  | 
| [delete_post_meta()](https://developer.wordpress.org/reference/functions/delete_post_meta/)`wp-includes/post.php` |

Deletes a post meta field for the given post ID.

  | 
| [get_attached_file()](https://developer.wordpress.org/reference/functions/get_attached_file/)`wp-includes/post.php` |

Retrieves attached file path based on attachment ID.

  | 
| [update_attached_file()](https://developer.wordpress.org/reference/functions/update_attached_file/)`wp-includes/post.php` |

Updates attachment file path based on attachment ID.

  | 
| [_wp_relative_upload_path()](https://developer.wordpress.org/reference/functions/_wp_relative_upload_path/)`wp-includes/post.php` |

Returns relative path to an uploaded file.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [get_post_meta()](https://developer.wordpress.org/reference/functions/get_post_meta/)`wp-includes/post.php` |

Retrieves a post meta field for the given post ID.

  |

[Show 7 more](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#)

| Used by | Description | 
| [wp_ajax_image_editor()](https://developer.wordpress.org/reference/functions/wp_ajax_image_editor/)`wp-admin/includes/ajax-actions.php` |

Handles image editing via AJAX.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/wp_restore_image/?output_format=md#changelog)󠁿

| Version | Description | 
| [2.9.0](https://developer.wordpress.org/reference/since/2.9.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_restore_image%2F)
before being able to contribute a note or feedback.