Created
May 20, 2012 17:03
-
-
Save coreyweb/2758778 to your computer and use it in GitHub Desktop.
WordPress Dynamic Image Resizing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Resize images dynamically using wp built in functions. | |
* @author Victor Teixeira http://profiles.wordpress.org/vteixeira/ | |
* @author Aaron Collegeman http://aaroncollegeman.com | |
* @see http://core.trac.wordpress.org/ticket/15311 | |
* | |
* @coreyweb's note: I asked Aaron to simplify Victor's original by excluding | |
* the lookup to see if the original image is big enough to render the newly sized image. | |
* Our themes don't increase image sizes (ever), and if they did, they would | |
* become larger than intended due to forcing sizes with CSS and/or HTML. | |
* This allows us to do image resizing inline, without the need for additional | |
* PHP as provided in the original (which is awesome). | |
* | |
* php 5.2+ | |
* | |
* Examples: | |
* | |
* <?php | |
* $image = vt_resize( get_post_thumbnail_id(), 140, 110, true ); // == vt_resize( get_the_ID(), 140, 110, true ) | |
* // or, resize any locally stored image: | |
* $image = vt_resize( '/some/image/url.jpg', 100, 100, true ); | |
* ?> | |
* <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width]; ?>" height="<?php echo $image[height]; ?>" /> | |
* | |
* @param mixed $attach_ref - either an attachment id, a post ID, or a URL | |
* @param int $width | |
* @param int $height | |
* @param bool $crop | |
* @return array | |
*/ | |
function get_vt_resize( $attach_ref = null, $width, $height, $crop = false ) { | |
// this is an attachment or a Post, so we have the ID | |
if ( is_numeric($attach_ref) ) { | |
$image_src = wp_get_attachment_image_src( $attach_ref, 'full' ); | |
if (!$image_src) { | |
$attach_ref = get_post_thumbnail_id( $attach_ref ); | |
$image_src = wp_get_attachment_image_src( $attach_ref, 'full' ); | |
} | |
$file_path = get_attached_file( $attach_ref ); | |
// this is not an attachment, so try to find the file | |
} else { | |
$file_path = parse_url( $attach_ref ); | |
$file_path = ltrim( $file_path['path'], '/' ); | |
//$file_path = rtrim( ABSPATH, '/' ).$file_path['path']; | |
$orig_size = getimagesize( $file_path ); | |
$image_src[0] = $attach_ref; | |
$image_src[1] = $orig_size[0]; | |
$image_src[2] = $orig_size[1]; | |
} | |
if (!$file_path) { | |
return array( | |
'url' => '#', | |
'width' => -1, | |
'height' => -1 | |
); | |
} | |
$file_info = pathinfo( $file_path ); | |
$extension = '.'. $file_info['extension']; | |
// the image path without the extension | |
$no_ext_path = $file_info['dirname'].'/'.$file_info['filename']; | |
$cropped_img_path = $no_ext_path.'-'.$width.'x'.$height.$extension; | |
// checking if the file size is larger than the target size | |
// if it is smaller or the same size, stop right here and return | |
if ( $image_src[1] > $width || $image_src[2] > $height ) { | |
// the file is larger, check if the resized version already exists (for crop = true but will also work for crop = false if the sizes match) | |
if ( file_exists( $cropped_img_path ) ) { | |
$cropped_img_url = str_replace( basename( $image_src[0] ), basename( $cropped_img_path ), $image_src[0] ); | |
$vt_image = array ( | |
'url' => $cropped_img_url, | |
'width' => $width, | |
'height' => $height | |
); | |
return $vt_image; | |
} | |
// crop = false | |
if ( $crop == false ) { | |
// calculate the size proportionaly | |
$proportional_size = wp_constrain_dimensions( $image_src[1], $image_src[2], $width, $height ); | |
$resized_img_path = $no_ext_path.'-'.$proportional_size[0].'x'.$proportional_size[1].$extension; | |
// checking if the file already exists | |
if ( file_exists( $resized_img_path ) ) { | |
$resized_img_url = str_replace( basename( $image_src[0] ), basename( $resized_img_path ), $image_src[0] ); | |
$vt_image = array ( | |
'url' => $resized_img_url, | |
'width' => $new_img_size[0], | |
'height' => $new_img_size[1] | |
); | |
return $vt_image; | |
} | |
} | |
// no cached files - let's finally resize it | |
$new_img_path = image_resize( $file_path, $width, $height, $crop ); | |
$new_img_size = getimagesize( $new_img_path ); | |
$new_img = str_replace( basename( $image_src[0] ), basename( $new_img_path ), $image_src[0] ); | |
// resized output | |
$vt_image = array ( | |
'url' => $new_img, | |
'width' => $new_img_size[0], | |
'height' => $new_img_size[1] | |
); | |
return $vt_image; | |
} | |
// default output - without resizing | |
$vt_image = array ( | |
'url' => $image_src[0], | |
'width' => $image_src[1], | |
'height' => $image_src[2] | |
); | |
return $vt_image; | |
} | |
/** | |
* Use this function to simply print the URL of the resized image. | |
* Note that this approach does not account for cases in which the | |
* source image is smaller than the requested size, in which case | |
* the requested width/height will not necessarily be the exact width | |
* and height of the resulting image. | |
* | |
* Example: | |
* | |
* <img src="<?php vt_resize(get_the_ID(), 400, 300, true) ?>" width="400" height="300" /> | |
* | |
* @param mixed $attach_ref - either an attachment id, a post ID, or a URL | |
* @param int $width | |
* @param int $height | |
* @param bool $crop | |
*/ | |
function vt_resize( $attach_ref = null, $width, $height, $crop = false ) { | |
$image = get_vt_resize( $attach_ref, $width, $height, $crop ); | |
echo $image['url']; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment