Skip to content

Instantly share code, notes, and snippets.

@seedprod
Created November 15, 2011 14:45
  • Star 40 You must be signed in to star a gist
  • Fork 17 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save seedprod/1367237 to your computer and use it in GitHub Desktop.
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;
}
}
@seedprod
Copy link
Author

Very cool, thanks for the tip :)

@seedprod
Copy link
Author

seedprod commented Jun 14, 2012 via email

@urooj105
Copy link

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

@vegaix9
Copy link

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.

@zitrusman
Copy link

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

@CharlyLeetham
Copy link

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!

@bestimage
Copy link

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.

@corpora731
Copy link

Where can I find the documentation ?

@Cozmoz
Copy link

Cozmoz commented Oct 9, 2015

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

@JoelLisenby
Copy link

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