Detener la codificación automática de atributos width y height en imágenes de WordPress

30 sept 2011, 10:18:21
Vistas: 38.3K
Votos: 18

Me pregunto si hay una manera simple de evitar que WordPress codifique automáticamente los atributos de altura y ancho de las imágenes destacadas, sin usar expresiones regulares...

Como estoy usando un grid flexible para mi proyecto (¿quién no lo hace?), esto está causando algunos problemas extraños con las imágenes.

0
Todas las respuestas a la pregunta 8
1
14

Puedes eliminar los atributos de ancho (width) y alto (height) filtrando la salida de la función image_downsize que se encuentra en wp-includes/media.php. Para hacer esto, debes escribir tu propia función y ejecutarla a través del archivo functions.php de tu tema o como un plugin.

Ejemplo:

Eliminar los atributos width y height.

/**
 * Esta es una modificación de la función image_downsize() en wp-includes/media.php
 * eliminaremos todas las referencias de ancho y alto, por lo tanto, la etiqueta img 
 * no añadirá los atributos width y height a la imagen enviada al editor.
 * 
 * @param bool false Sin referencias de alto y ancho.
 * @param int $id ID del adjunto para la imagen.
 * @param array|string $size Opcional, por defecto es 'medium'. Tamaño de la imagen, ya sea un array o string.
 * @return bool|array Falso en caso de fallo, array en caso de éxito.
 */
function myprefix_image_downsize( $value = false, $id, $size ) {
    if ( !wp_attachment_is_image($id) )
        return false;

    $img_url = wp_get_attachment_url($id);
    $is_intermediate = false;
    $img_url_basename = wp_basename($img_url);

    // intentar obtener un tamaño intermedio de estilo nuevo
    if ( $intermediate = image_get_intermediate_size($id, $size) ) {
        $img_url = str_replace($img_url_basename, $intermediate['file'], $img_url);
        $is_intermediate = true;
    }
    elseif ( $size == 'thumbnail' ) {
        // Retroceder al thumbnail antiguo
        if ( ($thumb_file = wp_get_attachment_thumb_file($id)) && $info = getimagesize($thumb_file) ) {
            $img_url = str_replace($img_url_basename, wp_basename($thumb_file), $img_url);
            $is_intermediate = true;
        }
    }

    // Tenemos el tamaño real de la imagen, pero podríamos necesitar restringirlo más si content_width es más estrecho
    if ( $img_url) {
        return array( $img_url, 0, 0, $is_intermediate );
    }
    return false;
}

Conecta la nueva función al hook image_downsize:

/* Eliminar las referencias de alto y ancho de la función image_downsize.
 * Hemos añadido un nuevo parámetro, por lo que la prioridad es 1, como siempre, 
 * y los nuevos parámetros son 3.
 */
add_filter( 'image_downsize', 'myprefix_image_downsize', 1, 3 );

También no olvides escalar las imágenes correctamente en tu CSS:

/* Tamaños y alineaciones de imágenes */
.entry-content img,
.comment-content img,
.widget img {
    max-width: 97.5%; /* Imágenes fluidas para entradas, comentarios y widgets */
}
img[class*="align"],
img[class*="wp-image-"] {
    height: auto; /* Asegurar que las imágenes con atributos height y width añadidos por WordPress se escalen correctamente */
}
img.size-full {
    max-width: 97.5%;
    width: auto; /* Evitar el estiramiento de imágenes a tamaño completo con atributos height y width en IE8 */
}

Espero que esto te ayude.

Saludos,

30 sept 2011 12:13:39
Comentarios

Esto elimina los atributos srcset, sizes y otros atributos de imágenes responsivas desafortunadamente. :( Esta es mi solución actual, que reconstruye los atributos nuevamente: https://gist.github.com/cibulka/8e2bf16b0f55779af590472ae1bf9239

Petr Cibulka Petr Cibulka
4 oct 2017 21:52:08
2
14

Puedes usar el filtro post_thumbnail_html para eliminar el atributo:

function remove_img_attr ($html) {
    return preg_replace('/(width|height)="\d+"\s/', "", $html);
}

add_filter( 'post_thumbnail_html', 'remove_img_attr' );

Coloca esto en tu archivo functions.php

26 sept 2013 09:12:06
Comentarios

Sigue funcionando perfectamente.

Rahul Rahul
31 ago 2017 09:04:53

Esta es la mejor respuesta que he encontrado

Oscar Godson Oscar Godson
2 mar 2022 11:30:20
2

Puedes obtener la URL de la imagen destacada y añadirla a tu contenido manualmente, por ejemplo:

<?php 
$image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'thumbnail' ); 

if ($image) : ?>
    <img src="<?php echo $image[0]; ?>" alt="Imagen destacada" title="Imagen destacada del artículo" />
<?php endif; ?> 
30 sept 2011 11:12:49
Comentarios

solo funciona para páginas de WordPress codificadas manualmente, lo cual es inútil para un CMS.

S.. S..
29 jun 2013 22:06:16

Tenga en cuenta: Este método evita las imágenes responsivas desde WP 4.4 porque no incluye el atributo srcset.

Drivingralle Drivingralle
5 feb 2016 09:33:35
2

Puedes anular los estilos/atributos en línea con !important:

.wp-post-image {
    width: auto !important; /* o probablemente 100% en caso de una cuadrícula */
    height: auto !important; 
}

No es la solución más limpia, pero resuelve tu problema.

9 jul 2016 15:55:45
Comentarios

Por alguna razón la clase wp-post-image no estaba incluida en mis imágenes. En su lugar tenía algo como wp-image-26. Tuve que usar otro selector pero la idea funcionó.

Pier Pier
16 may 2018 20:21:34

Efectivamente @Pier, usa la respuesta de @marsandback más abajo, particularmente con el selector de atributo includes, img[class*="wp-image-"]. ¡No necesitas !important!

Brian Zelip Brian Zelip
29 mar 2021 23:47:29
1

Solución CSS:

img[class*="align"], img[class*="wp-image-"] {
    width: auto;
    height: auto;
}

Esto permite que las imágenes responsive funcionen como deberían, mientras mantienes los atributos de ancho y alto en el elemento img, lo que probablemente sea mejor para navegadores antiguos, rendimiento y/o para pasar validadores HTML.

Solución PHP:

Esto evitará la adición de atributos width/height en cualquier medio nuevo añadido en el editor de WP (a través de 'Añadir medio'). ¡Atención, también puede afectar a tus pies de foto de imágenes!

function remove_widthHeight_attribute( $html ) {
   $html = preg_replace( '/(width|height)="\d*"\s/', "", $html );
   return $html;
}

add_filter( 'post_thumbnail_html', 'remove_widthHeight_attribute', 10 );
add_filter( 'image_send_to_editor', 'remove_widthHeight_attribute', 10 );
7 ago 2018 19:54:42
Comentarios

ESTA es la mejor solución para WordPress, ya que corrige imágenes demasiado grandes dentro de una tabla en el editor, evitando que tengas que desplazarte horizontalmente. ¡Aplícala tanto en el área pública como en la de administración!

scavenger scavenger
23 mar 2024 21:06:09
2

La mejor solución es colocar jQuery en el footer

jQuery(document).ready(function ($) {
    jQuery('img').removeAttr('width').removeAttr('height');
});
23 oct 2016 19:13:41
Comentarios

¿Alguna explicación sobre por qué esta es la "mejor" solución?

Kit Johnson Kit Johnson
27 ago 2017 07:09:19

porque a veces "add_filter" no funciona donde quieres que funcione, por eso lo dije

Asad Ali Asad Ali
4 sept 2017 00:10:06
2

Añade este fragmento de código: (Aplica también al nuevo editor Gutenberg)

// Función para deshabilitar los atributos de ancho y alto en las imágenes
function disable_add_img_width_height( $value, $image, $context, $attachment_id ) {
    // Verifica si el contexto es el contenido principal, extracto o contenido de widget
    if ($context === 'the_content' || $context === 'the_excerpt' ||  $context === 'widget_text_content')
        return false; // Devuelve falso para deshabilitar los atributos
    return $value; // En otros contextos, devuelve el valor original
}
// Añade el filtro para modificar los atributos de imagen
add_filter( 'wp_img_tag_add_width_and_height_attr', 'disable_add_img_width_height', 10, 4 );
20 ago 2021 11:54:13
Comentarios

Solo me pregunto - ¿hay alguna razón para filtrar por el contexto?

James Snell James Snell
9 dic 2023 19:17:53

@JamesSnell claro, bueno, depende del contexto... ;-)

daniel.gindi daniel.gindi
19 dic 2023 14:07:08
0

Aquí hay una solución simple en Javascript:

<script type="text/javascript">
jQuery.noConflict();
jQuery(document).ready(function($){
  $('img').each(function(){
  $(this).removeAttr('width')
  $(this).removeAttr('height');
 });
});
</script>

Esto puede usarse para apuntar a imágenes específicas en lugar de todas las imágenes usando un selector CSS, así:

 $('.miclaseespecifica img').each(function()
20 ene 2020 16:08:22