= 0 ) { function matthewruddy_image_resize( $url, $width = NULL, $height = NULL, $crop = true, $retina = false ) { global $wpdb; if ( empty( $url ) ) return new WP_Error( 'no_image_url', __( 'No image URL has been entered.','wta' ), $url ); // Get default size from database $width = ( $width ) ? $width : get_option( 'thumbnail_size_w' ); $height = ( $height ) ? $height : get_option( 'thumbnail_size_h' ); // Allow for different retina sizes $retina = $retina ? ( $retina === true ? 2 : $retina ) : 1; // Get the image file path $file_path = parse_url( $url ); $file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path']; // Check for Multisite if ( is_multisite() ) { global $blog_id; $blog_details = get_blog_details( $blog_id ); $file_path = str_replace( $blog_details->path . 'files/', '/wp-content/blogs.dir/'. $blog_id .'/files/', $file_path ); } // Destination width and height variables $dest_width = $width * $retina; $dest_height = $height * $retina; // File name suffix (appended to original file name) $suffix = "{$dest_width}x{$dest_height}"; // Some additional info about the image $info = pathinfo( $file_path ); $dir = $info['dirname']; $ext = $info['extension']; $name = wp_basename( $file_path, ".$ext" ); if ( 'bmp' == $ext ) { return new WP_Error( 'bmp_mime_type', __( 'Image is BMP. Please use either JPG or PNG.','wta' ), $url ); } // Suffix applied to filename $suffix = "{$dest_width}x{$dest_height}"; // Get the destination file name $dest_file_name = "{$dir}/{$name}-{$suffix}.{$ext}"; if ( !file_exists( $dest_file_name ) ) { /* * Bail if this image isn't in the Media Library. * We only want to resize Media Library images, so we can be sure they get deleted correctly when appropriate. */ $query = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid='%s'", $url ); $get_attachment = $wpdb->get_results( $query ); if ( !$get_attachment ) return array( 'url' => $url, 'width' => $width, 'height' => $height ); // Load Wordpress Image Editor $editor = wp_get_image_editor( $file_path ); if ( is_wp_error( $editor ) ) return array( 'url' => $url, 'width' => $width, 'height' => $height ); // Get the original image size $size = $editor->get_size(); $orig_width = $size['width']; $orig_height = $size['height']; $src_x = $src_y = 0; $src_w = $orig_width; $src_h = $orig_height; if ( $crop ) { $cmp_x = $orig_width / $dest_width; $cmp_y = $orig_height / $dest_height; // Calculate x or y coordinate, and width or height of source if ( $cmp_x > $cmp_y ) { $src_w = round( $orig_width / $cmp_x * $cmp_y ); $src_x = round( ( $orig_width - ( $orig_width / $cmp_x * $cmp_y ) ) / 2 ); } else if ( $cmp_y > $cmp_x ) { $src_h = round( $orig_height / $cmp_y * $cmp_x ); $src_y = round( ( $orig_height - ( $orig_height / $cmp_y * $cmp_x ) ) / 2 ); } } // Time to crop the image! $editor->crop( $src_x, $src_y, $src_w, $src_h, $dest_width, $dest_height ); // Now let's save the image $saved = $editor->save( $dest_file_name ); // Get resized image information $resized_url = str_replace( basename( $url ), basename( $saved['path'] ), $url ); $resized_width = $saved['width']; $resized_height = $saved['height']; $resized_type = $saved['mime-type']; // Add the resized dimensions to original image metadata (so we can delete our resized images when the original image is delete from the Media Library) $metadata = wp_get_attachment_metadata( $get_attachment[0]->ID ); if ( isset( $metadata['image_meta'] ) ) { $metadata['image_meta']['resized_images'][] = $resized_width .'x'. $resized_height; wp_update_attachment_metadata( $get_attachment[0]->ID, $metadata ); } // Create the image array $image_array = array( 'url' => $resized_url, 'width' => $resized_width, 'height' => $resized_height, 'type' => $resized_type ); } else { $image_array = array( 'url' => str_replace( basename( $url ), basename( $dest_file_name ), $url ), 'width' => $dest_width, 'height' => $dest_height, 'type' => $ext ); } // Return image array return $image_array; } } else { function matthewruddy_image_resize( $url, $width = NULL, $height = NULL, $crop = true, $retina = false ) { global $wpdb; if ( empty( $url ) ) return new WP_Error( 'no_image_url', __( 'No image URL has been entered.','wta' ), $url ); // Bail if GD Library doesn't exist if ( !extension_loaded('gd') || !function_exists('gd_info') ) return array( 'url' => $url, 'width' => $width, 'height' => $height ); // Get default size from database $width = ( $width ) ? $width : get_option( 'thumbnail_size_w' ); $height = ( $height ) ? $height : get_option( 'thumbnail_size_h' ); // Allow for different retina sizes $retina = $retina ? ( $retina === true ? 2 : $retina ) : 1; // Destination width and height variables $dest_width = $width * $retina; $dest_height = $height * $retina; // Get image file path $file_path = parse_url( $url ); $file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path']; // Check for Multisite if ( is_multisite() ) { global $blog_id; $blog_details = get_blog_details( $blog_id ); $file_path = str_replace( $blog_details->path . 'files/', '/wp-content/blogs.dir/'. $blog_id .'/files/', $file_path ); } // Some additional info about the image $info = pathinfo( $file_path ); $dir = $info['dirname']; $ext = $info['extension']; $name = wp_basename( $file_path, ".$ext" ); if ( 'bmp' == $ext ) { return new WP_Error( 'bmp_mime_type', __( 'Image is BMP. Please use either JPG or PNG.','wta' ), $url ); } // Suffix applied to filename $suffix = "{$dest_width}x{$dest_height}"; // Get the destination file name $dest_file_name = "{$dir}/{$name}-{$suffix}.{$ext}"; // No need to resize & create a new image if it already exists! if ( !file_exists( $dest_file_name ) ) { /* * Bail if this image isn't in the Media Library either. * We only want to resize Media Library images, so we can be sure they get deleted correctly when appropriate. */ $query = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid='%s'", $url ); $get_attachment = $wpdb->get_results( $query ); if ( !$get_attachment ) return array( 'url' => $url, 'width' => $width, 'height' => $height ); $image = wp_get_image_editor( $file_path ); if ( !is_resource( $image ) ) return new WP_Error( 'error_loading_image_as_resource', $image, $file_path ); // Get the current image dimensions and type $size = @getimagesize( $file_path ); if ( !$size ) return new WP_Error( 'file_path_getimagesize_failed', __( 'Failed to get $file_path information using "@getimagesize".','wta'), $file_path ); list( $orig_width, $orig_height, $orig_type ) = $size; // Create new image $new_image = wp_imagecreatetruecolor( $dest_width, $dest_height ); // Do some proportional cropping if enabled if ( $crop ) { $src_x = $src_y = 0; $src_w = $orig_width; $src_h = $orig_height; $cmp_x = $orig_width / $dest_width; $cmp_y = $orig_height / $dest_height; // Calculate x or y coordinate, and width or height of source if ( $cmp_x > $cmp_y ) { $src_w = round( $orig_width / $cmp_x * $cmp_y ); $src_x = round( ( $orig_width - ( $orig_width / $cmp_x * $cmp_y ) ) / 2 ); } else if ( $cmp_y > $cmp_x ) { $src_h = round( $orig_height / $cmp_y * $cmp_x ); $src_y = round( ( $orig_height - ( $orig_height / $cmp_y * $cmp_x ) ) / 2 ); } // Create the resampled image imagecopyresampled( $new_image, $image, 0, 0, $src_x, $src_y, $dest_width, $dest_height, $src_w, $src_h ); } else imagecopyresampled( $new_image, $image, 0, 0, 0, 0, $dest_width, $dest_height, $orig_width, $orig_height ); // Convert from full colors to index colors, like original PNG. if ( IMAGETYPE_PNG == $orig_type && function_exists('imageistruecolor') && !imageistruecolor( $image ) ) imagetruecolortopalette( $new_image, false, imagecolorstotal( $image ) ); // Remove the original image from memory (no longer needed) imagedestroy( $image ); // Check the image is the correct file type if ( IMAGETYPE_GIF == $orig_type ) { if ( !imagegif( $new_image, $dest_file_name ) ) return new WP_Error( 'resize_path_invalid', __( 'Resize path invalid (GIF)','wta' ) ); } elseif ( IMAGETYPE_PNG == $orig_type ) { if ( !imagepng( $new_image, $dest_file_name ) ) return new WP_Error( 'resize_path_invalid', __( 'Resize path invalid (PNG).','wta' ) ); } else { // All other formats are converted to jpg if ( 'jpg' != $ext && 'jpeg' != $ext ) $dest_file_name = "{$dir}/{$name}-{$suffix}.jpg"; if ( !imagejpeg( $new_image, $dest_file_name, apply_filters( 'resize_jpeg_quality', 90 ) ) ) return new WP_Error( 'resize_path_invalid', __( 'Resize path invalid (JPG).','wta' ) ); } // Remove new image from memory (no longer needed as well) imagedestroy( $new_image ); // Set correct file permissions $stat = stat( dirname( $dest_file_name )); $perms = $stat['mode'] & 0000666; @chmod( $dest_file_name, $perms ); // Get some information about the resized image $new_size = @getimagesize( $dest_file_name ); if ( !$new_size ) return new WP_Error( 'resize_path_getimagesize_failed', __( 'Failed to get $dest_file_name (resized image) info via @getimagesize','wta' ), $dest_file_name ); list( $resized_width, $resized_height, $resized_type ) = $new_size; // Get the new image URL $resized_url = str_replace( basename( $url ), basename( $dest_file_name ), $url ); // Add the resized dimensions to original image metadata (so we can delete our resized images when the original image is delete from the Media Library) $metadata = wp_get_attachment_metadata( $get_attachment[0]->ID ); if ( isset( $metadata['image_meta'] ) ) { $metadata['image_meta']['resized_images'][] = $resized_width .'x'. $resized_height; wp_update_attachment_metadata( $get_attachment[0]->ID, $metadata ); } // Return array with resized image information $image_array = array( 'url' => $resized_url, 'width' => $resized_width, 'height' => $resized_height, 'type' => $resized_type ); } else { $image_array = array( 'url' => str_replace( basename( $url ), basename( $dest_file_name ), $url ), 'width' => $dest_width, 'height' => $dest_height, 'type' => $ext ); } return $image_array; } } /** * Deletes the resized images when the original image is deleted from the Wordpress Media Library. * * @author Matthew Ruddy */ add_action( 'delete_attachment', 'matthewruddy_delete_resized_images' ); function matthewruddy_delete_resized_images( $post_id ) { // Get attachment image metadata $metadata = wp_get_attachment_metadata( $post_id ); if ( !$metadata ) return; // Do some bailing if we cannot continue if ( !isset( $metadata['file'] ) || !isset( $metadata['image_meta']['resized_images'] ) ) return; $pathinfo = pathinfo( $metadata['file'] ); $resized_images = $metadata['image_meta']['resized_images']; // Get Wordpress uploads directory (and bail if it doesn't exist) $wp_upload_dir = wp_upload_dir(); $upload_dir = $wp_upload_dir['basedir']; if ( !is_dir( $upload_dir ) ) return; // Delete the resized images foreach ( $resized_images as $dims ) { // Get the resized images filename $file = $upload_dir .'/'. $pathinfo['dirname'] .'/'. $pathinfo['filename'] .'-'. $dims .'.'. $pathinfo['extension']; // Delete the resized image @unlink( $file ); } }