Как да добавите автоматичен клас в изображение за публикация в 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
@Juan, ще се изненадате колко хора го деактивират по различни причини. Добрият pegrammer не предполага неща, а дизайн, за да улови всички случаи, това е принципът на прогресивните подобрения. Освен това откъде знаеш, че е изгубен? Можеш ли да четеш мисли. Както и да е, няма едно идеално решение, но вие предполагате толкова много неща в коментара си - 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 Solution сървъри много и може да се използва за много сценарии, различни от отзивчиви цели. Мисля, че можем да се съгласим да не сме съгласни. - 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
И какво, ако класът не е първият атрибут? - 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
Митул, премахнах ширината и височината от изображенията в публикацията, като използвах вашите кодове. Наистина е полезно. Но това не прави изображенията на публикациите отзивчиви в 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-отзивчив към всички изображения на съдържание

Това използва 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