Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Resize WordPress images on the fly vt_resize w/ multisite support
<?php
/*
* Resize images dynamically using wp built in functions
* Victor Teixeira
*
* php 5.2+
*
* Exemplo de uso:
*
* <?php
* $thumb = get_post_thumbnail_id();
* $image = vt_resize( $thumb, '', 140, 110, true );
* ?>
* <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width]; ?>" height="<?php echo $image[height]; ?>" />
*
* @param int $attach_id
* @param string $img_url
* @param int $width
* @param int $height
* @param bool $crop
* @return array
*/
if ( !function_exists( 'vt_resize') ) {
function vt_resize( $attach_id = null, $img_url = null, $width, $height, $crop = false ) {
// this is an attachment, so we have the ID
if ( $attach_id ) {
$image_src = wp_get_attachment_image_src( $attach_id, 'full' );
$file_path = get_attached_file( $attach_id );
// this is not an attachment, let's use the image url
} else if ( $img_url ) {
$file_path = parse_url( $img_url );
$file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path'];
// Look for Multisite Path
if(file_exists($file_path) === false){
global $blog_id;
$file_path = parse_url( $img_url );
if (preg_match("/files/", $file_path['path'])) {
$path = explode('/',$file_path['path']);
foreach($path as $k=>$v){
if($v == 'files'){
$path[$k-1] = 'wp-content/blogs.dir/'.$blog_id;
}
}
$path = implode('/',$path);
}
$file_path = $_SERVER['DOCUMENT_ROOT'].$path;
}
//$file_path = ltrim( $file_path['path'], '/' );
//$file_path = rtrim( ABSPATH, '/' ).$file_path['path'];
$orig_size = getimagesize( $file_path );
$image_src[0] = $img_url;
$image_src[1] = $orig_size[0];
$image_src[2] = $orig_size[1];
}
$file_info = pathinfo( $file_path );
// check if file exists
$base_file = $file_info['dirname'].'/'.$file_info['filename'].'.'.$file_info['extension'];
if ( !file_exists($base_file) )
return;
$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 ) {
// 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 or no height set
if ( $crop == false OR !$height ) {
// 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' => $proportional_size[0],
'height' => $proportional_size[1]
);
return $vt_image;
}
}
// check if image width is smaller than set width
$img_size = getimagesize( $file_path );
if ( $img_size[0] <= $width ) $width = $img_size[0];
// Check if GD Library installed
if (!function_exists ('imagecreatetruecolor')) {
echo 'GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library';
return;
}
// no cache 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' => $width,
'height' => $height
);
return $vt_image;
}
}
Owner

seedprod commented Mar 29, 2012

Very cool, thanks for the tip :)

Owner

seedprod commented Jun 14, 2012

its woking fine in single site wordpress
but in multisite it is not working

vegaix9 commented Jan 8, 2013

I'm having issues with using vt_resize on multisite. I have tried adding timkinnane's parts as well. Returns file paths errors.

Hey. Thanks for that package!!! Great work.

Wondering if you noticed, that the image_resize function is deprecated since Wordpress 3.5. https://codex.wordpress.org/Function_Reference/image_resize

Instead they use WP_Image_Editor instead.
https://codex.wordpress.org/Class_Reference/WP_Image_Editor

Any plans to change that???

Cheers

Thank you so much for this code. A couple of changes were required:

Line 46 added a '/' in front of wp-content:
$path[$k-1] = '/wp-content/blogs.dir/'.$blog_id;

Line 78, changed the test to accept images that were the same width as the source image and crop=true:
if ( ($image_src[1] > $width ) || ($image_src[1] >= $width && $crop==true)) {

It works really well! Thank you again!

here are some codes on image resizing i'd like to share with you . hope it helps you.

Private Sub button1_Click(sender As Object, e As EventArgs)
Dim fileName As String = "c:/Sample.png"

        Dim reImage As REImage = REFile.OpenImageFile(fileName)

        ImageProcessing.ApplyResize(reImage, 500, 500)

        REFile.SaveImageFile(reImage, "c:/reimage.png", New PNGEncoder())
    End Sub

if you need other image programming codes, you can find out in that website as well.

Where can I find the documentation ?

Cozmoz commented Oct 9, 2015

Hi, would it be possible to set a dynamic height? Any advice would be appreciated.

I have created an alternative vt_resize() function that uses WP_Image_Editor class instead of image_resize to get rid of the deprecated function image_resize error.

https://gist.github.com/JoelLisenby/70a38cc1065dbcb26d0cd2f8392f0342

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment