Cómo Redimensionar Dinámicamente Imágenes de WordPress Al Vuelo (campo personalizado/opción del tema)
Así que, a petición de un cliente, necesito poder redimensionar una imagen no de la manera estándar de WordPress... sino desde una imagen incorporada desde una opción del tema. No puedo simplemente usar el área custom_header, ya que habrá dos o tres (también tengo algunas opciones una vez que la imagen está cargada para permitir que el usuario elija cómo debería funcionar el enlace (página, entrada, categoría, sin enlace, enlace externo, etc)). Estoy usando Options Framework Theme con gran éxito y puedo recuperar el src de la imagen sin problemas, se trata de si esto se puede usar de alguna manera en combinación con la función add_image_size() que normalmente se usa para miniaturas de entradas. Preferiría REALMENTE no ir por la ruta de timthumb y mantenerme con las APIs de WordPress (sé que esto es un poco contradictorio con lo que estoy haciendo en primer lugar...). Cualquier ayuda sería muy apreciada. ¡Gracias!

Redimensionar imágenes de WordPress al vuelo usando funciones integradas de WordPress.
Usa la función vt_resize
para redimensionar dinámicamente imágenes de WordPress ubicadas en un campo personalizado, imagen destacada, directorio de subidas, plugin NextGen Gallery de WordPress, o incluso un enlace externo a una imagen fuera del sitio.
Es muy sencillo de usar, solo copia/pega el código a continuación en el archivo functions.php
de tu tema de WordPress actualmente activo.
Luego, donde sea que necesites redimensionar una imagen al vuelo, simplemente coloca una llamada a esa función siguiendo los parámetros de uso explicados en los comentarios de la función.
Aquí hay un ejemplo de cómo obtener automáticamente el ID de la entrada, la entrada en sí, los valores de los campos personalizados de la entrada, y redimensionar dinámicamente la imagen del campo personalizado que contiene la imagen a redimensionar al vuelo.
<?php
# Coloca esto en tu functions.php
function get_postID() {
global $wp_query;
return $wp_query->post->ID;
}
?>
<?php
# Coloca las siguientes líneas donde quieras realizar esta acción.
$postID = get_postID(); // Obtiene el ID de la entrada actual.
$post = get_post( $postID ); // Toma el ID de la entrada actual y devuelve el registro de la base de datos. (alternativamente, `global $post`)
$custom = get_post_custom( $post->ID ); // Devuelve un array multidimensional con todos los campos personalizados de la entrada.
$image = $custom['field-slug'][0]; // Especifica la clave del array del campo personalizado que contiene la imagen.
# El primer parámetro es 0. Significa que no se usará un adjunto de entrada.
# El segundo parámetro es la URL de la imagen del valor del campo personalizado de la entrada.
# El tercer y cuarto parámetros son el ancho y alto de la imagen después del redimensionamiento.
# El quinto parámetro significa recortar esta imagen.
$resizedImage = vt_resize( 0, $image, 190, 338, true ); // Redimensiona la imagen dinámicamente al vuelo.
echo '<img src="' . $resizedImage[ 'url' ] . '" width="' . $resizedImage[ 'width' ] . '" height="' . $resizedImage[ 'height' ] . '" title="' . $post->post_title . '" alt="' . $post->post_title . '" />'; // Las propiedades de la imagen se guardan en un array. (Usa print_r($resizedImage) para ver las propiedades del array.)
?>
Redimensionar imágenes de WordPress al vuelo vt_resize con soporte para multisitio
- Descripción: Redimensiona imágenes dinámicamente usando funciones integradas de WordPress.
- Autor: Victor Teixeira
- Requisitos: PHP 5.2+, WordPress 3.2+
Reformateé el código fuente para que sea más legible para mis ojos. Si quieres el código fuente con el formato original, visita el enlace de arriba.
<?php
if ( ! function_exists( 'vt_resize' ) ) {
/**
* Redimensiona imágenes dinámicamente usando funciones integradas de WordPress
* Victor Teixeira
*
* php 5.2+
*
* Ejemplo 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|void
*/
function vt_resize( int $attach_id = 0, string $img_url = '', int $width = 0, int $height = 0, bool $crop = false ) {
if ( $attach_id ) {
# esto es un adjunto, así que tenemos el ID
$image_src = wp_get_attachment_image_src( $attach_id, 'full' );
$file_path = get_attached_file( $attach_id );
} elseif ( $img_url ) {
# esto no es un adjunto, usemos la URL de la imagen
$file_path = parse_url( $img_url );
$file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path'];
# Buscar ruta de multisitio
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 );
# verificar si el archivo existe
$base_file = $file_info['dirname'] . '/' . $file_info['filename'] . '.' . $file_info['extension'];
if ( ! file_exists( $base_file ) ) {
return;
}
$extension = '.' . $file_info['extension'];
# la ruta de la imagen sin la extensión
$no_ext_path = $file_info['dirname'] . '/' . $file_info['filename'];
$cropped_img_path = $no_ext_path . '-' . $width . 'x' . $height . $extension;
# verificando si el tamaño de la imagen es mayor que el tamaño objetivo
# si es más pequeño o del mismo tamaño, detente aquí y devuelve
if ( $image_src[1] > $width ) {
# el archivo es más grande, verifica si ya existe una versión redimensionada (para $crop = true pero también funcionará para $crop = false si los tamaños coinciden)
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 o no se estableció altura
if ( $crop == false OR ! $height ) {
# calcular el tamaño proporcionalmente
$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;
# verificando si el archivo ya existe
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;
}
}
# verificar si el ancho de la imagen es menor que el ancho establecido
$img_size = getimagesize( $file_path );
if ( $img_size[0] <= $width ) {
$width = $img_size[0];
}
# Verificar si la biblioteca GD está instalada
if ( ! function_exists( 'imagecreatetruecolor' ) ) {
echo 'Error en la biblioteca GD: imagecreatetruecolor no existe - por favor contacta a tu proveedor de alojamiento y pídeles que instalen la biblioteca GD';
return;
}
# no hay archivos en caché - finalmente redimensionémosla
$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] );
# salida redimensionada
$vt_image = array(
'url' => $new_img,
'width' => $new_img_size[0],
'height' => $new_img_size[1]
);
return $vt_image;
}
# salida por defecto - sin redimensionar
$vt_image = array(
'url' => $image_src[0],
'width' => $width,
'height' => $height
);
return $vt_image;
}
}
?>

Aquí hay una función mucho más simple (sin soporte para multi-sitio, pero ¿alguien en su sano juicio usa multi-sitio?) https://github.com/BrettMW/img_resize

También una solución lista para usar https://github.com/bueltge/WP-Image-Resizer, como el enlace de @kaiser

@bueltge, funciona, pero ¿tienes idea de por qué las imágenes se ven borrosas? Parece que hace que todas las imágenes sean de 150x150. ¿Sabes por qué está pasando eso?

@bueltge, olvídalo. Encontré el problema. Tuve que establecer el tamaño como full como segundo parámetro cuando usaba wp_get_attachment_image_url()

@bueltge, ignora eso. Parece que no está funcionando... ¿podrías ayudarme con esto? Cuando agrego el tamaño de imagen como full
las imágenes tienen diferentes tamaños.

con el parámetro full siempre obtienes el tamaño subido, el ancho y alto del original. Deberías trabajar con un tamaño definido, como custom_full que está definido con ancho y alto.
