Impedire a WordPress di codificare automaticamente gli attributi width e height delle immagini

30 set 2011, 10:18:21
Visualizzazioni: 38.3K
Voti: 18

Mi chiedo se esiste un modo semplice per impedire a WordPress di codificare automaticamente gli attributi di altezza e larghezza delle immagini in evidenza, oltre all'uso delle espressioni regolari...

Dato che sto utilizzando una griglia flessibile per il mio progetto (chi non lo fa!) questo sta causando alcuni problemi strani con le immagini.

0
Tutte le risposte alla domanda 8
1
14

Puoi rimuovere gli attributi width e height filtrando l'output della funzione image_downsize che si trova in wp-includes/media.php. Per fare questo, scrivi la tua funzione e eseguila tramite il file functions.php del tuo tema o come plugin.

Esempio:

Rimuovi gli attributi width e height.

/**
 * Questa è una modifica della funzione image_downsize() in wp-includes/media.php
 * rimuoveremo tutti i riferimenti a width e height, quindi il tag img 
 * non aggiungerà gli attributi width e height all'immagine inviata all'editor.
 * 
 * @param bool false Nessun riferimento a height e width.
 * @param int $id ID dell'allegato per l'immagine.
 * @param array|string $size Opzionale, default è 'medium'. Dimensione dell'immagine, può essere un array o una stringa.
 * @return bool|array False in caso di fallimento, array in caso di successo.
 */
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);

    // prova per una nuova dimensione intermedia
    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' ) {
        // Ripiega sulla vecchia miniatura
        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;
        }
    }

    // Abbiamo la dimensione effettiva dell'immagine, ma potrebbe essere necessario limitarla ulteriormente se content_width è più stretto
    if ( $img_url) {
        return array( $img_url, 0, 0, $is_intermediate );
    }
    return false;
}

Collega la nuova funzione all'hook image_downsize:

/* Rimuovi i riferimenti a height e width dalla funzione image_downsize.
 * Abbiamo aggiunto un nuovo parametro, quindi la priorità è 1, come sempre, e i nuovi 
 * parametri sono 3.
 */
add_filter( 'image_downsize', 'myprefix_image_downsize', 1, 3 );

Inoltre non dimenticare di ridimensionare correttamente le immagini nel tuo CSS:

/* Dimensioni e allineamenti delle immagini */
.entry-content img,
.comment-content img,
.widget img {
    max-width: 97.5%; /* Immagini fluide per articoli, commenti e widget */
}
img[class*="align"],
img[class*="wp-image-"] {
    height: auto; /* Assicurati che le immagini con attributi height e width aggiunti da WordPress siano scalate correttamente */
}
img.size-full {
    max-width: 97.5%;
    width: auto; /* Previene lo stretching delle immagini full-size con attributi height e width in IE8 */
}

Spero che questo ti sia d'aiuto.

Saluti,

30 set 2011 12:13:39
Commenti

Questo purtroppo rimuove gli attributi srcset, sizes e altri attributi delle immagini responsive. :( Questa è la mia soluzione attuale, che ricostruisce gli attributi: https://gist.github.com/cibulka/8e2bf16b0f55779af590472ae1bf9239

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

Puoi utilizzare il filtro post_thumbnail_html per rimuovere l'attributo:

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

add_filter( 'post_thumbnail_html', 'remove_img_attr' );

Inserisci questo codice nel tuo file functions.php

26 set 2013 09:12:06
Commenti

Funziona ancora perfettamente.

Rahul Rahul
31 ago 2017 09:04:53

Questa è la migliore risposta che ho trovato

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

Puoi ottenere l'URL dell'immagine in evidenza e aggiungerla manualmente al tuo contenuto, ad esempio:

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

if ($image) : ?>
    <img src="<?php echo $image[0]; ?>" alt="Miniatura del post" title="Miniatura del post" />
<?php endif; ?> 
30 set 2011 11:12:49
Commenti

funziona solo per le pagine WordPress hardcoded, il che è inutile per un CMS.

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

Tieni presente: Questo metodo impedisce le immagini responsive da WP 4.4 perché non include l'attributo srcset.

Drivingralle Drivingralle
5 feb 2016 09:33:35
2

Puoi sovrascrivere gli stili/attributi inline con !important:

.wp-post-image {
    width: auto !important; /* oppure probabilmente 100% nel caso di una griglia */
    height: auto !important; 
}

Non è la soluzione più pulita, ma risolve il tuo problema.

9 lug 2016 15:55:45
Commenti

Per qualche motivo la classe wp-post-image non era inclusa nelle mie immagini. Invece avevo qualcosa come wp-image-26. Ho dovuto usare un altro selettore ma l'idea ha funzionato.

Pier Pier
16 mag 2018 20:21:34

Infatti @Pier, usa la risposta di @marsandback qui sotto, in particolare con il selettore di attributo includes, img[class*="wp-image-"]. Non c'è bisogno di !important!

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

Soluzione CSS:

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

Questo permette alle immagini responsive di funzionare correttamente, mantenendo comunque gli attributi width e height nell'elemento img, il che è probabilmente meglio per browser più vecchi, prestazioni e/o per superare i validatori HTML.

Soluzione PHP:

Questo codice previene l'aggiunta degli attributi width/height su qualsiasi nuovo media aggiunto nell'editor di WordPress (tramite 'Aggiungi Media'). Nota: potrebbe influenzare anche le didascalie delle immagini!

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
Commenti

QUESTA è la soluzione migliore per Wordpress, perché corregge le immagini troppo grandi all'interno di una tabella nell'editor, evitando di dover scorrere orizzontalmente. Applicatela sia all'area frontend che all'area di amministrazione!

scavenger scavenger
23 mar 2024 21:06:09
2

La soluzione migliore è posizionare jQuery nel footer

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

Qualche spiegazione sul perché questa è la soluzione "migliore"?

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

perché a volte "add_filter" non funziona dove vuoi che funzioni, ecco perché l'ho detto

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

Aggiungi questo pezzo di codice: (Si applica anche al nuovo editor Gutenberg)

/**
 * Disabilita l'aggiunta degli attributi width e height alle immagini
 * 
 * @param bool   $value          Valore corrente
 * @param string $image          Tag immagine HTML
 * @param string $context        Contesto in cui viene chiamato il filtro
 * @param int    $attachment_id  ID dell'allegato
 * @return bool
 */
function disable_add_img_width_height( $value, $image, $context, $attachment_id ) {
    // Disabilita gli attributi width/height solo in questi contesti
    if ($context === 'the_content' || $context === 'the_excerpt' ||  $context === 'widget_text_content')
        return false;
    return $value;
}
add_filter( 'wp_img_tag_add_width_and_height_attr', 'disable_add_img_width_height', 10, 4 );
20 ago 2021 11:54:13
Commenti

Mi chiedevo solo - c'è una ragione per filtrare in base al contesto?

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

@JamesSnell naturalmente, beh, dipende dal contesto... ;-)

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

Ecco una semplice soluzione in Javascript:

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

Questo codice può essere utilizzato per specifiche immagini invece che per tutte, utilizzando un selettore CSS, in questo modo:

 $('.mialcpecificaclasse img').each(function()
20 gen 2020 16:08:22