WordPress Version: 3.1
/**
* Scale an image to fit a particular size (such as 'thumb' or 'medium').
*
* Array with image url, width, height, and whether is intermediate size, in
* that order is returned on success is returned. $is_intermediate is true if
* $url is a resized image, false if it is the original.
*
* The URL might be the original image, or it might be a resized version. This
* function won't create a new resized copy, it will just return an already
* resized one if it exists.
*
* A plugin may use the {@see 'image_downsize'} filter to hook into and offer image
* resizing services for images. The hook must return an array with the same
* elements that are returned in the function. The first element being the URL
* to the new image that was resized.
*
* @since 2.5.0
*
* @param int $id Attachment ID for image.
* @param array|string $size Optional. Image size to scale to. Accepts any valid image size,
* or an array of width and height values in pixels (in that order).
* Default 'medium'.
* @return false|array Array containing the image URL, width, height, and boolean for whether
* the image is an intermediate size. False on failure.
*/
function image_downsize($id, $size = 'medium')
{
$is_image = wp_attachment_is_image($id);
/**
* Filters whether to preempt the output of image_downsize().
*
* Passing a truthy value to the filter will effectively short-circuit
* down-sizing the image, returning that value as output instead.
*
* @since 2.5.0
*
* @param bool $downsize Whether to short-circuit the image downsize. Default false.
* @param int $id Attachment ID for image.
* @param array|string $size Size of image. Image size or array of width and height values (in that order).
* Default 'medium'.
*/
$out = apply_filters('image_downsize', false, $id, $size);
if ($out) {
return $out;
}
$img_url = wp_get_attachment_url($id);
$meta = wp_get_attachment_metadata($id);
$width = 0;
$height = 0;
$is_intermediate = false;
$img_url_basename = wp_basename($img_url);
// If the file isn't an image, attempt to replace its URL with a rendered image from its meta.
// Otherwise, a non-image type could be returned.
if (!$is_image) {
if (!empty($meta['sizes']['full'])) {
$img_url = str_replace($img_url_basename, $meta['sizes']['full']['file'], $img_url);
$img_url_basename = $meta['sizes']['full']['file'];
$width = $meta['sizes']['full']['width'];
$height = $meta['sizes']['full']['height'];
} else {
return false;
}
}
// try for a new style intermediate size
$intermediate = image_get_intermediate_size($id, $size);
if ($intermediate) {
$img_url = str_replace($img_url_basename, $intermediate['file'], $img_url);
$width = $intermediate['width'];
$height = $intermediate['height'];
$is_intermediate = true;
} elseif ($size === 'thumbnail') {
// fall back to the old thumbnail
$thumb_file = wp_get_attachment_thumb_file($id);
$info = null;
if ($thumb_file) {
$info = @getimagesize($thumb_file);
}
if ($thumb_file && $info) {
$img_url = str_replace($img_url_basename, wp_basename($thumb_file), $img_url);
$width = $info[0];
$height = $info[1];
$is_intermediate = true;
}
}
if (!$width && !$height && isset($meta['width'], $meta['height'])) {
// any other type: use the real image
$width = $meta['width'];
$height = $meta['height'];
}
if ($img_url) {
// we have the actual image size, but might need to further constrain it if content_width is narrower
list($width, $height) = image_constrain_size_for_editor($width, $height, $size);
return array($img_url, $width, $height, $is_intermediate);
}
return false;
}