-
+
+
@@ -54,9 +55,22 @@ function wp_image_editor($post_id, $msg = false) {
@@ -65,7 +79,7 @@ function wp_image_editor($post_id, $msg = false) {
-
+
-
+
+
+
-
-
+
+
+
-
-
save( $filename, $mime_type );
} else {
- _deprecated_argument( __FUNCTION__, '3.5', __( '$image needs to be an WP_Image_Editor object' ) );
+ _deprecated_argument( __FUNCTION__, '3.5.0', __( '$image needs to be an WP_Image_Editor object' ) );
/** This filter is documented in wp-admin/includes/image-edit.php */
$image = apply_filters( 'image_save_pre', $image, $post_id );
/**
- * Filter whether to skip saving the image file.
+ * Filters whether to skip saving the image file.
*
* Returning a non-null value will short-circuit the save method,
* returning that value instead.
@@ -359,7 +387,7 @@ function _image_get_preview_ratio($w, $h) {
* @return resource|false GD image resource, false otherwise.
*/
function _rotate_image_resource($img, $angle) {
- _deprecated_function( __FUNCTION__, '3.5', __( 'Use WP_Image_Editor::rotate' ) );
+ _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::rotate()' );
if ( function_exists('imagerotate') ) {
$rotated = imagerotate($img, $angle, 0);
if ( is_resource($rotated) ) {
@@ -382,7 +410,7 @@ function _rotate_image_resource($img, $angle) {
* @return resource (maybe) flipped image resource.
*/
function _flip_image_resource($img, $horz, $vert) {
- _deprecated_function( __FUNCTION__, '3.5', __( 'Use WP_Image_Editor::flip' ) );
+ _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::flip()' );
$w = imagesx($img);
$h = imagesy($img);
$dst = wp_imagecreatetruecolor($w, $h);
@@ -429,13 +457,13 @@ function _crop_image_resource($img, $x, $y, $w, $h) {
*
* @since 2.9.0
*
- * @param WP_Image_Editor $image {@see WP_Image_Editor} instance.
+ * @param WP_Image_Editor $image WP_Image_Editor instance.
* @param array $changes Array of change operations.
- * @return WP_Image_Editor {@see WP_Image_Editor} instance with changes applied.
+ * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
*/
function image_edit_apply_changes( $image, $changes ) {
if ( is_resource( $image ) )
- _deprecated_argument( __FUNCTION__, '3.5', __( '$image needs to be an WP_Image_Editor object' ) );
+ _deprecated_argument( __FUNCTION__, '3.5.0', __( '$image needs to be an WP_Image_Editor object' ) );
if ( !is_array($changes) )
return $image;
@@ -486,7 +514,7 @@ function image_edit_apply_changes( $image, $changes ) {
if ( $image instanceof WP_Image_Editor ) {
/**
- * Filter the WP_Image_Editor instance before applying changes to the image.
+ * Filters the WP_Image_Editor instance before applying changes to the image.
*
* @since 3.5.0
*
@@ -497,7 +525,7 @@ function image_edit_apply_changes( $image, $changes ) {
} elseif ( is_resource( $image ) ) {
/**
- * Filter the GD image resource before applying changes to the image.
+ * Filters the GD image resource before applying changes to the image.
*
* @since 2.9.0
* @deprecated 3.5.0 Use wp_image_editor_before_change instead.
@@ -552,18 +580,18 @@ function image_edit_apply_changes( $image, $changes ) {
* in $_REQUEST['history']
*
* @param int $post_id
- * @return boolean
+ * @return bool
*/
function stream_preview_image( $post_id ) {
$post = get_post( $post_id );
- /** This filter is documented in wp-admin/admin.php */
- @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );
+ wp_raise_memory_limit( 'admin' );
$img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) );
- if ( is_wp_error( $img ) )
- return false;
+ if ( is_wp_error( $img ) ) {
+ return false;
+ }
$changes = !empty($_REQUEST['history']) ? json_decode( wp_unslash($_REQUEST['history']) ) : null;
if ( $changes )
@@ -614,7 +642,7 @@ function wp_restore_image($post_id) {
if ( $parts['basename'] != $data['file'] ) {
if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {
- // Delete only if it's edited image.
+ // Delete only if it's an edited image.
if ( preg_match('/-e[0-9]{13}\./', $parts['basename']) ) {
wp_delete_file( $file );
}
@@ -637,7 +665,7 @@ function wp_restore_image($post_id) {
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
+ // 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 );
@@ -676,7 +704,7 @@ function wp_restore_image($post_id) {
* @return \stdClass
*/
function wp_save_image( $post_id ) {
- global $_wp_additional_image_sizes;
+ $_wp_additional_image_sizes = wp_get_additional_image_sizes();
$return = new stdClass;
$success = $delete = $scaled = $nocrop = false;
@@ -731,28 +759,33 @@ function wp_save_image( $post_id ) {
$backup_sizes = array();
// Generate new filename.
- $path = get_attached_file($post_id);
- $path_parts = pathinfo( $path );
- $filename = $path_parts['filename'];
+ $path = get_attached_file( $post_id );
+
+ $basename = pathinfo( $path, PATHINFO_BASENAME );
+ $dirname = pathinfo( $path, PATHINFO_DIRNAME );
+ $ext = pathinfo( $path, PATHINFO_EXTENSION );
+ $filename = pathinfo( $path, PATHINFO_FILENAME );
$suffix = time() . rand(100, 999);
if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE &&
- isset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) {
+ isset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $basename ) {
- if ( 'thumbnail' == $target )
- $new_path = "{$path_parts['dirname']}/{$filename}-temp.{$path_parts['extension']}";
- else
+ if ( 'thumbnail' == $target ) {
+ $new_path = "{$dirname}/{$filename}-temp.{$ext}";
+ } else {
$new_path = $path;
+ }
} else {
- while( true ) {
+ while ( true ) {
$filename = preg_replace( '/-e([0-9]+)$/', '', $filename );
$filename .= "-e{$suffix}";
- $new_filename = "{$filename}.{$path_parts['extension']}";
- $new_path = "{$path_parts['dirname']}/$new_filename";
- if ( file_exists($new_path) )
+ $new_filename = "{$filename}.{$ext}";
+ $new_path = "{$dirname}/$new_filename";
+ if ( file_exists($new_path) ) {
$suffix++;
- else
+ } else {
break;
+ }
}
}
@@ -762,18 +795,19 @@ function wp_save_image( $post_id ) {
return $return;
}
- if ( 'nothumb' == $target || 'all' == $target || 'full' == $target || $scaled ) {
+ if ( 'nothumb' === $target || 'all' === $target || 'full' === $target || $scaled ) {
$tag = false;
- if ( isset($backup_sizes['full-orig']) ) {
- if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] )
+ if ( isset( $backup_sizes['full-orig'] ) ) {
+ if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] !== $basename ) {
$tag = "full-$suffix";
+ }
} else {
$tag = 'full-orig';
}
- if ( $tag )
- $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']);
-
+ if ( $tag ) {
+ $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $basename );
+ }
$success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path );
$meta['file'] = _wp_relative_upload_path( $new_path );
@@ -795,6 +829,21 @@ function wp_save_image( $post_id ) {
$success = $delete = $nocrop = true;
}
+ /*
+ * We need to remove any existing resized image files because
+ * a new crop or rotate could generate different sizes (and hence, filenames),
+ * keeping the new resized images from overwriting the existing image files.
+ * https://core.trac.wordpress.org/ticket/32171
+ */
+ if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && ! empty( $meta['sizes'] ) ) {
+ foreach ( $meta['sizes'] as $size ) {
+ if ( ! empty( $size['file'] ) && preg_match( '/-e[0-9]{13}-/', $size['file'] ) ) {
+ $delete_file = path_join( $dirname, $size['file'] );
+ wp_delete_file( $delete_file );
+ }
+ }
+ }
+
if ( isset( $sizes ) ) {
$_sizes = array();