Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Resizes an image and returns an array containing the resized URL, width, height and file type. Uses native Wordpress functionality.
- *
- * Because Wordpress 3.5 has added the new 'WP_Image_Editor' class and depreciated some of the functions
- * we would normally rely on a separate function has been created for 3.5+.
- *
- * Providing two separate functions means we can be backwards compatible and future proof. Hooray!
- *
- * The first function (3.5+) supports GD Library and Imagemagick. Worpress will pick whichever is most appropriate.
- * The second function (3.4.2 and lower) only support GD Library.
- * If none of the supported libraries are available the function will bail and return the original image.
- *
- * Both functions produce the exact same results when successful.
- * Images are saved to the Wordpress uploads directory, just like images uploaded through the Media Library.
- *
- * Copyright 2013 Matthew Ruddy (http://easinglider.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * @author Matthew Ruddy (http://easinglider.com)
- * @return array An array containing the resized image URL, width, height and file type.
- */
- if ( isset( $wp_version ) && version_compare( $wp_version, '3.5' ) >= 0 ) {
- if (!function_exists('hb_resize')) {
- function hb_resize($attach_id = null, $url = null, $width = NULL, $height = NULL, $crop = true, $retina = false) {
- if ($attach_id) {
- $url = wp_get_attachment_image_src($attach_id, 'full');
- $url = $url[0];
- // this is not an attachment, let's use the image url
- }
- global $wpdb;
- if (empty($url)) { return; }
- /* ----------------------------------------------------------------- */
- /* MOD_START */
- /* ----------------------------------------------------------------- */
- $file_path = ''; $dest_width = 0; $dest_height = 0;
- if (!$width || !$width) {
- $file_path = get_attached_file($attach_id);
- list($origWidth, $origHeight) = getimagesize($file_path);
- $ratio = $origWidth / $origHeight;
- if (!$height) {
- $height = (int)round($width / $ratio);
- $dest_height = $height;
- }
- if (!$width) {
- $width = (int)round($height * $ratio);
- $dest_width = $width;
- }
- }
- /* ----------------------------------------------------------------- */
- /* MOD_END */
- /* ----------------------------------------------------------------- */
- // 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
- if (!$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);
- $blog_path = $blog_details->path;
- $pieces = explode('/', $blog_path);
- $good_path = implode('/', array_slice($pieces, 0, -2));
- $file_path = str_replace($blog_details->path, $good_path . '/', $file_path);
- }
- // Destination width and height variables
- if (!$dest_width) { $dest_width = $width * $retina; }
- if (!$dest_height) { $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");
- // Suffix applied to filename
- $suffix = "{$dest_width}x{$dest_height}";
- // Get the destination file name
- $dest_file_name = "{$dir}/{$name}-{$suffix}.{$ext}";
- if ($ext == "gif") {
- return array('url' => $url, 'width' => $width, 'height' => $height);
- }
- 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.
- */
- /* ----------------------------------------------------------------- */
- /* MOD_START !important */
- /* ----------------------------------------------------------------- */
- global $im_never_change_domains;
- if ($im_never_change_domains) {
- /* very stupid idea */
- $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);
- }
- }
- /* ----------------------------------------------------------------- */
- /* MOD_END */
- /* ----------------------------------------------------------------- */
- // 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);
- if (is_wp_error($saved)){
- return array('url' => $url, 'width' => $width, 'height' => $height);
- }
- // 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 hb_resize( $attach_id = null, $url = null, $width = NULL, $height = NULL, $crop = true, $retina = false ) {
- global $wpdb;
- if ( $attach_id ) {
- $url = wp_get_attachment_image_src( $attach_id, 'full' );
- $url = $url[0];
- // this is not an attachment, let's use the image url
- }
- if ( empty( $url ) )
- return new WP_Error( 'no_image_url', __( 'No image URL has been entered.' , 'hbthemes'), $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" );
- // 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".', 'hbthemes'), $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)' , 'hbthemes') );
- }
- elseif ( IMAGETYPE_PNG == $orig_type ) {
- if ( !imagepng( $new_image, $dest_file_name ) )
- return new WP_Error( 'resize_path_invalid', __( 'Resize path invalid (PNG).', 'hbthemes' ) );
- }
- 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).', 'hbthemes' ) );
- }
- // 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', 'hbthemes' ), $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 );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement