Как добавить автоматический класс в изображение для поста WordPress

Я хочу создать адаптивную тему с помощью Bootstrap 3. Однако мне нужно автоматически добавлять класс CSS .img-responsive к каждому изображению в сообщении, потому что мне нужно, чтобы изображения были адаптивными.

Пожалуйста, предложите мне, что мне нужно добавить в файл functions.php WordPress или любой другой файл, который позволит мне автоматически добавить класс CSS.


person Amit Sarker    schedule 09.12.2013    source источник


Ответы (11)


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

function add_responsive_class($content){

        $content = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
        $document = new DOMDocument();
        libxml_use_internal_errors(true);
        $document->loadHTML(utf8_decode($content));

        $imgs = $document->getElementsByTagName('img');
        foreach ($imgs as $img) {
           $img->setAttribute('class','img-responsive');
        }

        $html = $document->saveHTML();
        return $html;
}

теперь добавьте хук к содержимому

add_filter        ('the_content', 'add_responsive_class');

Однако, если у вас уже есть классы для img и вам нужно добавить новый класс, вы можете обратиться к PHP-эквивалент jQuery addClass. Или вы можете просто сделать это:

$existing_class = $img->getAttribute('class');
$img->setAttribute('class', "img-responsive $existing_class");

Приведенный выше код работает. Я использую его для удаления src и data-src для ленивой загрузки изображения. Надеюсь, это сработает для вас

person AhmadAssaf    schedule 10.12.2013
comment
Хорошее использование DOMDocument. Я вижу, как многие люди предлагают использовать регулярное выражение для этого типа приложений. +1 - person Greg L; 22.10.2014
comment
регулярное выражение намного быстрее, чем это. подумайте также о том, чтобы сделать это с помощью javascript. С jquery, который, я думаю, у вас есть, будет просто $(#main-content).find(img).addClass(img-responsive).. - person Juan; 27.02.2015
comment
@Juan другие люди также предложили иметь решение JS, и снова ответ заключается в том, что это означает, что страница должна быть сгенерирована из PHP, тогда эта функция будет работать при загрузке документа или любом другом заданном вами хуке ... лучше иметь классы в сгенерированном файле PHP вы сохраните ненужные манипуляции с DOM, которые можно выполнить непосредственно на бэкэнде, и это чрезвычайно полезно в тех случаях, когда вы также выполняете кэширование. Кроме того, адаптивные изображения можно получить с помощью CSS, а для этого с помощью jQuery, поскольку предложенное вами решение требует включения JS, что может не всегда иметь место для некоторых - person AhmadAssaf; 27.02.2015
comment
@AhmadAssaf js отключен в 2015 году? В самом деле? Кроме того, вопрос явно заключается в том, как добавить класс к моим элементам img внутри моего сообщения. Вопрос предполагает, что ему нужен код для размещения в functions.php, но это только потому, что он был потерян. Для этого вам не нужен jquery. - person Juan; 28.02.2015
comment
@ Хуан, вы будете удивлены, узнав, сколько людей отключают его по разным причинам. Хороший программист ничего не предполагает, а проектирует так, чтобы охватить все случаи, это принцип прогрессивных улучшений. Кроме того, откуда вы знаете, что он потерялся? Ты умеешь читать мысли. В любом случае, нет идеального решения, но вы так много всего предполагали в своем комментарии. - person AhmadAssaf; 28.02.2015
comment
Это решение заставляет функцию the_content() оборачивать содержимое сообщения тегами <html> и <body>. - person LondonAppDev; 08.03.2015
comment
Я получаю предупреждение, когда содержимое пусто (Предупреждение: DOMDocument::loadHTML(): в качестве входных данных используется пустая строка). Любой способ подавить это? - person Teo Maragakis; 01.07.2015
comment
@TeoMaragakis проверяет наличие пустого содержимого раньше и вводит, только если $content не пусто - person AhmadAssaf; 01.07.2015
comment
Чтобы не добавлять ‹html› и ‹body›, используйте этот $html-›loadHTML(utf8_decode($content), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - person Kref; 16.05.2016
comment
Отлично работает с библиотекой lazysizes для отложенной загрузки. И я рад, что именно по этому вопросу, потому что это было первое, что я искал. - person Josh Habdas; 17.04.2017
comment
Для повышения производительности и функциональности рассмотрите возможность добавления досрочного прекращения на основе некоторых рекомендаций WP для the_content: developer.wordpress.org/reference/hooks/the_content - person Josh Habdas; 18.04.2017
comment
это не лучший ответ, использование DOMDocument излишне, медленно и не обязательно - person OzzyCzech; 26.07.2018
comment
нет подходящего ответа, вместо этого см. ответ @Yaron - person niklas; 14.11.2018

Этот подход лучше: https://wordpress.stackexchange.com/questions/108831/add-css-class-to-every-image

function add_image_class($class){
    $class .= ' additional-class';
    return $class;
}
add_filter('get_image_tag_class','add_image_class');

Единственное предостережение заключается в том, что он добавляет класс в панель редактирования при вставке новых изображений и не влияет на уже существующие.

person Yaron    schedule 02.10.2015
comment
этот ответ лучше других. Он должен быть помечен как правильный ответ. - person erginduran; 18.05.2016
comment
Мне лично этот ответ нравится больше всего. Проще всего добавить классы к добавляемому изображению. - person JoeMoe1984; 23.06.2016
comment
Я бы сказал, что это «способ WordPress» для этого. - person ACJ; 05.07.2018
comment
лучший ответ из всех - person OzzyCzech; 26.07.2018

Я думаю, что самый простой способ — использовать такой CSS.

.content img { height: auto; max-width: 100%; }

Где .content – это область, содержащая содержимое вашего сообщения.

Примечание. Вы также можете переопределить класс .wp-caption.

.wp-caption { width: auto !important; }
person Syclone    schedule 20.01.2015
comment
Это должен быть правильный ответ. Оберните весь контент в div и добавьте к нему класс с именем content или как вы хотите его назвать. - person Edward; 11.09.2017
comment
вздох. То, что у вас другой метод, чем у OP, не означает, что вы правы. У вас может быть мнение, но вместо этого укажите его в комментарии к вопросу, потому что этот ответ просто не по теме. - person Athoxx; 20.07.2019
comment
@PatrikAlienus Как это не по теме? Цель состоит в том, чтобы сделать все изображения в посте адаптивными. CSS в моем ответе сделает каждое изображение в посте отзывчивым. Не нужно добавлять класс к каждому изображению, если мы знаем селектор для всех изображений. Это решение использует меньше кода и не требует серверной обработки. - person Syclone; 21.07.2019
comment
@Syclone Он конкретно спрашивает, как автоматически добавлять определенный класс к изображениям, поэтому этот ответ не по теме. - person Athoxx; 22.07.2019
comment
@Syclone Он сообщает вам о своем намерении, это правда. Однако только после этого он задает конкретный вопрос. Я считаю, что ваш ответ не по теме из-за этого, а не потому, что ваше решение хуже. Это не большую часть времени, но вы не можете знать каждую деталь среды OP, поэтому вам следует воздерживаться от отклонения от фактического вопроса. ЭТО на самом деле очень важно здесь, поскольку вопросы и ответы предназначены для многих, а не только для одного. - person Athoxx; 26.07.2019
comment
Серверов решений @PatrikAlienus много, и их можно использовать для многих сценариев, отличных от целей реагирования. Я думаю, мы можем согласиться не соглашаться. - person Syclone; 26.07.2019

У меня был тот же вопрос, и добавление этой функции в functions.php у меня сработало.

function add_image_responsive_class($content) {
   global $post;
   $pattern ="/<img(.*?)class=\"(.*?)\"(.*?)>/i";
   $replacement = '<img$1class="$2 img-responsive"$3>';
   $content = preg_replace($pattern, $replacement, $content);
   return $content;
}
add_filter('the_content', 'add_image_responsive_class');
person user793487    schedule 27.02.2014
comment
Этот ответ следует пометить как решенный, потому что он работает намного лучше, чем другие. Это не вставляет теги DOCTYPE, HTML и BODY внутрь html. - person Diego Somar; 06.11.2017
comment
Этот конкретный код не только отлично работает. Он позволяет включать глобальные модальные изображения в популярные тематические информационные бюллетени и новостные журналы. Глобальное модальное ВКЛ ломается на их теме при включении любой CDN. Когда этот фрагмент кода добавляется в плагин, тема восстанавливает функциональность. Они должны нанять вас для улучшения своего кода, поскольку они используют wp-booster и не хотят его исправлять, они просто говорят, что CDN может не работать вне Cloudflare. - person Alex Vojacek; 17.04.2018

Когда вы отображаете сообщение в своем цикле, вы можете сделать:

the_post_thumbnail('thumbnail', array('class' => 'img-responsive'));

Подробнее см. https://codex.wordpress.org/Function_Reference/the_post_thumbnail.

person Bertrand    schedule 09.12.2013
comment
Спасибо, Бертран, но мне нужно, чтобы все мои почтовые изображения были полностью адаптивными. Итак, я хочу добавить class=img-responsive для всех изображений постов. - person Amit Sarker; 09.12.2013

Не совсем уверен, насколько хорош этот ответ с точки зрения производительности, но он работает. Просто поместите это в functions.php.

function img_responsive($content){
    return str_replace('<img class="','<img class="img-responsive ',$content);
}
add_filter('the_content','img_responsive');

Обратите внимание, что вам нужен пробел после class="img-responsive, чтобы он не сливался с другими классами.

person Lallex    schedule 19.12.2014
comment
А что, если class не является первым атрибутом? - person Paweł Tomkiel; 05.02.2019

Вы можете использовать код jquery в файле header.php вашей темы.

jQuery(function() {
  jQuery(img).addClass('img-responsive');
});
person super global user    schedule 09.12.2013
comment
обратите внимание, что это решение JS. Это означает, что страница должна быть сгенерирована из PHP, тогда эта функция будет запускаться при загрузке документа или любой другой заданной вами ловушке. Лучше иметь классы в сгенерированном файле PHP. - person AhmadAssaf; 10.12.2013
comment
это не идеальный или профессиональный способ. Хорошее решение — использование фильтров - person Mohammad Ayoub Khan; 10.06.2021

Я думаю, вам не нужно добавлять класс, чтобы сделать изображение отзывчивым. просто удалите высоту и ширину из избранного изображения, изображение определенно станет отзывчивым.

В ваш function.php добавлен код для удаления ширины высоты.

add_filter( 'post_thumbnail_html', 'remove_thumbnail_dimensions', 10, 3 );

function remove_thumbnail_dimensions( $html, $post_id, $post_image_id ) {
    $html = preg_replace( '/(width|height)=\"\d*\"\s/', "", $html );
    return $html;
} 
person Mitul Shah    schedule 09.12.2013
comment
Mitul, я убрал ширину и высоту изображений постов с помощью ваших кодов. Это действительно полезно. Но это не делает почтовые изображения отзывчивыми в Bootstrap 3.0. - person Amit Sarker; 09.12.2013

Классы добавляются не при загрузке, а при отправке изображения в редактор. Вы можете использовать фильтр image_send_to_editor, чтобы добавить один или несколько классов. В этом примере добавляется класс fancybox.

person diggy    schedule 09.12.2013
comment
этот хук работает для недавно добавленных изображений .. но не будет работать для его старых постов - person AhmadAssaf; 09.12.2013
comment
Правильный. Обратите внимание, что OP создает новую тему. - person diggy; 09.12.2013

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

Я хочу подать заявку css class(bootstrap) .img-responsive для всех изображений содержимого

Здесь используется LESS, но версия Sass почти такая же:

  img {
    @include img-responsive();
  }
person Jordie C    schedule 10.05.2016

У меня следующий код, а так как посты из предыдущих версий... Не сработали...

Что я должен делать?

<figure class="image"><img class="lazyload p402_hide" alt="" 
 width="800" height="400" data-sizes="auto" data- 
src="https://br.clubnation.club/wp-content/uploads/2020/01/primeira- 
loja-oficial-de-harry-potter-sera-aberta-em-nova-york-2.jpg" data- 
 srcset="https://br.clubnation.club/wp- 
 content/uploads/2020/01/primeira-loja-oficial-de-harry-potter-sera-aberta- 
 em-nova-york-2.jpg 328w, https://br.clubnation.club/wp- 
 content/uploads/2020/01/primeira-loja-oficial-de-harry-potter-sera- 
 aberta-em-nova-york-3.jpg 380w, https://br.clubnation.club/wp- 
 content/uploads/2020/01/primeira-loja-oficial-de-harry-potter-sera- 
 aberta-em-nova-york-4.jpg 528w, https://br.clubnation.club/wp- 
 content/uploads/2020/01/primeira-loja-oficial-de-harry-potter-sera- 
 aberta-em-nova-york-5.jpg 704w" />
 <figcaption>A loja será inaugurada no próximo verão.
 (Fonte: Warner Bros/Divulgação)</figcaption></figure>
person Paulo Boaventura    schedule 13.01.2020