Отключение автоматического добавления width и height атрибутов изображений в WordPress

30 сент. 2011 г., 10:18:21
Просмотры: 38.3K
Голосов: 18

Интересно, есть ли простой способ остановить WordPress от автоматического добавления атрибутов width и height для изображений записей, кроме использования регулярных выражений...

Поскольку я использую адаптивную сетку для своего проекта (а кто сейчас не использует!), это вызывает некоторые странные проблемы с изображениями.

0
Все ответы на вопрос 8
1
14

Вы можете удалить атрибуты width и height, отфильтровав вывод функции image_downsize, которая находится в файле wp-includes/media.php. Для этого вам нужно написать собственную функцию и выполнить её через файл functions.php вашей темы или в виде плагина.

Пример:

Удаление атрибутов width и height.

/**
 * Это модификация функции image_downsize() из wp-includes/media.php
 * Мы удалим все ссылки на ширину и высоту, поэтому тег img 
 * не будет добавлять атрибуты width и height к изображению, отправляемому в редактор.
 * 
 * @param bool false Отсутствие ссылок на высоту и ширину.
 * @param int $id ID вложения для изображения.
 * @param array|string $size Необязательный параметр, по умолчанию 'medium'. Размер изображения, массив или строка.
 * @return bool|array false при неудаче, массив при успехе.
 */
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);

    // попытка получить новый стиль промежуточного размера
    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' ) {
        // Возврат к старому миниатюрному изображению
        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;
        }
    }

    // У нас есть фактический размер изображения, но может потребоваться дополнительное ограничение, если content_width уже
    if ( $img_url) {
        return array( $img_url, 0, 0, $is_intermediate );
    }
    return false;
}

Привяжите новую функцию к хуку image_downsize:

/* Удаление ссылок на высоту и ширину из функции image_downsize.
 * Мы добавили новый параметр, поэтому приоритет 1, как всегда, и 
 * количество новых параметров — 3.
 */
add_filter( 'image_downsize', 'myprefix_image_downsize', 1, 3 );

Также не забудьте правильно масштабировать изображения в вашем CSS:

/* Размеры изображений и выравнивание */
.entry-content img,
.comment-content img,
.widget img {
    max-width: 97.5%; /* Гибкие изображения для записей, комментариев и виджетов */
}
img[class*="align"],
img[class*="wp-image-"] {
    height: auto; /* Убедитесь, что изображения с добавленными WordPress атрибутами height и width масштабируются правильно */
}
img.size-full {
    max-width: 97.5%;
    width: auto; /* Предотвращение растягивания полноразмерных изображений с атрибутами height и width в IE8 */
}

Надеюсь, это поможет вам.

С уважением,

30 сент. 2011 г. 12:13:39
Комментарии

К сожалению, это удаляет атрибуты srcset, sizes и другие атрибуты адаптивных изображений. :( Вот моё текущее решение, которое восстанавливает эти атрибуты: https://gist.github.com/cibulka/8e2bf16b0f55779af590472ae1bf9239

Petr Cibulka Petr Cibulka
4 окт. 2017 г. 21:52:08
2
14

Вы можете использовать фильтр post_thumbnail_html для удаления атрибутов:

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

add_filter( 'post_thumbnail_html', 'remove_img_attr' );

Поместите этот код в файл functions.php вашей темы

26 сент. 2013 г. 09:12:06
Комментарии

Все еще работает как часы.

Rahul Rahul
31 авг. 2017 г. 09:04:53

Это лучший ответ, который я нашел

Oscar Godson Oscar Godson
2 мар. 2022 г. 11:30:20
2

Вы можете получить URL изображения записи и добавить его в содержимое вручную, например:

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

if ($image) : ?>
    <img src="<?php echo $image[0]; ?>" alt="" />
<?php endif; ?> 
30 сент. 2011 г. 11:12:49
Комментарии

работает только для статичных страниц WordPress, что бесполезно для CMS.

S.. S..
29 июн. 2013 г. 22:06:16

Имейте в виду: Этот метод не поддерживает адаптивные изображения, начиная с WP 4.4, так как не включает атрибут srcset.

Drivingralle Drivingralle
5 февр. 2016 г. 09:33:35
2

Вы можете переопределить встроенные стили/атрибуты с помощью !important:

.wp-post-image {
    width: auto !important; /* или, возможно, 100% в случае использования сетки */
    height: auto !important; 
}

Это не самое чистое решение, но оно решает вашу проблему.

9 июл. 2016 г. 15:55:45
Комментарии

По какой-то причине класс wp-post-image не добавлялся к моим изображениям. Вместо этого был класс вида wp-image-26. Мне пришлось использовать другой селектор, но идея сработала.

Pier Pier
16 мая 2018 г. 20:21:34

Действительно, @Pier, используйте ответ @marsandback ниже, особенно с селектором атрибута includes, img[class*="wp-image-"]. Нет необходимости в !important!

Brian Zelip Brian Zelip
29 мар. 2021 г. 23:47:29
1

CSS решение:

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

Это позволяет адаптивным изображениям работать как положено, при этом вы сохраняете атрибуты width и height в элементе img, что, вероятно, лучше для старых браузеров, производительности и/или для прохождения валидации HTML.

PHP решение:

Это предотвратит добавление атрибутов width/height для любого нового медиа в редакторе WordPress (через 'Добавить медиа'). Примечание: это может также повлиять на подписи к изображениям!

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 авг. 2018 г. 19:54:42
Комментарии

ЭТО лучшее решение для WordPress, потому что оно исправляет слишком большие изображения внутри таблицы в редакторе, предотвращая горизонтальную прокрутку. Примените его и для фронтенда, и для админки!

scavenger scavenger
23 мар. 2024 г. 21:06:09
2

Лучшее решение — разместить jQuery в подвале сайта

jQuery(document).ready(function ($) {
    jQuery('img').removeAttr('width').removeAttr('height');
});
23 окт. 2016 г. 19:13:41
Комментарии

Любое объяснение, почему это "лучшее" решение?

Kit Johnson Kit Johnson
27 авг. 2017 г. 07:09:19

потому что иногда "add_filter" не работает там, где вы хотите, поэтому я так сказал

Asad Ali Asad Ali
4 сент. 2017 г. 00:10:06
2

Добавьте этот фрагмент кода: (Применяется и к новому редактору Gutenberg)

function disable_add_img_width_height( $value, $image, $context, $attachment_id ) {
    // Отключаем добавление атрибутов width и height для изображений в контенте, цитатах и виджетах
    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 авг. 2021 г. 11:54:13
Комментарии

Просто интересно - есть ли причина для фильтрации по контексту?

James Snell James Snell
9 дек. 2023 г. 19:17:53

@JamesSnell конечно, ну, это зависит от контекста... ;-)

daniel.gindi daniel.gindi
19 дек. 2023 г. 14:07:08
0

Вот простое решение на Javascript:

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

Этот код можно использовать для выбора конкретных изображений вместо всех, используя CSS-селектор, например:

 $('.myspecificclass img').each(function()
20 янв. 2020 г. 16:08:22