Cómo Redimensionar Dinámicamente Imágenes de WordPress Al Vuelo (campo personalizado/opción del tema)

29 nov 2011, 19:20:43
Vistas: 23.3K
Votos: 12

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!

5
Comentarios

Ok - creo que he logrado esto:

<?php $main_image = of_get_option('of_main_image'); $thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid = '$main_image'" ) ); $theID = $thepost->ID; echo wp_get_attachment_image( $theID, 'homepage_main' ); ?>

¿Alguien ve algún agujero de seguridad o rareza aquí? Podría ser útil para otros también. ¡Gracias!

Zach Zach
29 nov 2011 21:36:23

Como el 'guid' es donde se almacena la URL de la imagen (el Options Framework utiliza el WooThemes Media Uploader para almacenar estos datos como un post_type de adjunto) entonces puedo acceder a los datos así :)

Zach Zach
29 nov 2011 22:34:43

Lo agregué para completitud. No debería cerrarse, ya que otra solución no perjudicaría.

kaiser kaiser
17 jul 2012 18:36:20

Me he encontrado con este problema en tantos sitios web que he construido. No pude encontrar una solución que funcione de manera óptima, ¡así que creé mi propio plugin! Espero que esto ayude. https://wordpress.org/plugins/fly-dynamic-image-resizer/

Junaid Bhura Junaid Bhura
30 sept 2015 16:50:26
Todas las respuestas a la pregunta 1
7

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;
    }

}

?>
13 jul 2012 00:09:58
Comentarios

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

brettwhiteman brettwhiteman
21 may 2015 03:08:47

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

bueltge bueltge
1 oct 2015 07:36:17

@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?

Ionut Necula Ionut Necula
9 mar 2017 12:53:07

@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()

Ionut Necula Ionut Necula
9 mar 2017 12:56:49

@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.

Ionut Necula Ionut Necula
9 mar 2017 15:20:36

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.

bueltge bueltge
9 mar 2017 15:35:22

Es un excelente ejemplo de redimensionamiento de imágenes. Buen trabajo

kuldip Makadiya kuldip Makadiya
2 abr 2020 17:30:19
Mostrar los 2 comentarios restantes