Вопрос или проблема
У меня много контейнеров вокруг указанного изображения, таких как col-md-10
, который определяет max-width
около 80%, вот как я генерирую свой пост:
<article id="single-post-<?php the_ID(); ?>" <?php post_class('single-post'); ?>>
<?php
$post_share = new Post_Share( array( 'facebook', 'twitter', 'gplus', 'pinterest' ), $post, $style="share-style-2" );
echo $post_share->generate_share_links();
?>
<header class="single-post-header">
<div class="single-post-meta">
<?php echo _s_show_post_info( array( 'author','time', 'category') ); ?>
</div><!-- .post-meta -->
<?php
the_title( '<h1 class="single-post-title">','</h1>' );
if ( has_category() ) : ?>
<?php
$categories = (array) wp_get_post_terms( get_the_ID(), 'category' );
if ( !is_wp_error( $categories ) && !empty( $categories) ) { ?>
<div class="single-post-secondary-meta">
<span class="single-post-category-span">опубликовано в
<a class="single-post-category" href="https://wordpress.stackexchange.com/questions/290225/<?php echo get_term_link( $categories[0] )?>"><?php echo $categories[0] -> name ?>
</a>
</span>
</div><!-- .post-meta-2 -->
<?php } ?>
<?php endif; ?>
</header><!-- .post-header -->
<?php if ( has_post_thumbnail() ) : ?>
<div class="single-post-thumbnail">
<a class="single-post-thumbnail-link" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
<?php the_post_thumbnail(); ?>
</a>
</div><!-- .post-thimbnail -->
<?php
endif; ?>
<div class="single-post-content">
<?php
//echo wp_trim_words( get_the_content(), 40, '...' );
the_content();
?>
</div><!-- .post-content -->
</article><!-- #post-<?php the_ID(); ?> -->
<?php
get_template_part('template-parts/individual_post-related-posts');
?>
В частности:
the_content();
К сожалению, вставка изображения приводит к следующему:
Установка .post-content { width: 100%; }
решает проблему, но учитывая, что существует множество плагинов и правил, которые могут быть переопределены, это кажется временным решением.
Что я упускаю, почему это происходит?
Свойство width
родительского элемента DIV не применяется к его дочерним элементам. Изображение внутри .col-md-10
может переполнять своего родителя и будет видно, если родитель не имеет свойства overflow:hidden
.
Чтобы это исправить, вы можете попробовать сделать изображения адаптивными. Вот как:
.single-post img {
max-width: 100%;
height: auto;
display:block;
}
Это гарантирует, что ваши изображения не будут шире их родительского элемента.
Bootstrap также предоставляет свой собственный класс для адаптивных изображений. Имя класса – .img-responsive
, и вы можете передать его своим функциям в качестве аргумента при выводе миниатюр постов, например:
the_post_thumbnail( 'thumbnail', [ 'class' => 'img-responsive' ] );
Добавьте эту функцию, чтобы удалить атрибут ширины и высоты из редактора WYSIWYG WordPress при вставке изображения.
add_filter( 'post_thumbnail_html', 'remove_width_attribute', 10 );
add_filter( 'image_send_to_editor', 'remove_width_attribute', 10 );
function remove_width_attribute( $html ) {
$html = preg_replace( '/(width|height)="\d*"\s/', "", $html );
return $html;
}
Существует некоторый CSS, связанный с кодом, выводимым через WYSIWYG WordPress. Я всегда включаю этот код в свои стили WordPress, и это позволяет исправить проблему, а также обеспечивает правильное выравнивание изображений/подписей и т. д.
Вы можете найти код и прочитать о нем здесь: https://codex.wordpress.org/CSS#WordPress_Generated_Classes)
Вот код для тех, кто быстро просматривает:
/* =Ядро WordPress
-------------------------------------------------------------- */
.alignnone {
margin: 5px 20px 20px 0;
}
.aligncenter,
div.aligncenter {
display: block;
margin: 5px auto 5px auto;
}
.alignright {
float:right;
margin: 5px 0 20px 20px;
}
.alignleft {
float: left;
margin: 5px 20px 20px 0;
}
a img.alignright {
float: right;
margin: 5px 0 20px 20px;
}
a img.alignnone {
margin: 5px 20px 20px 0;
}
a img.alignleft {
float: left;
margin: 5px 20px 20px 0;
}
a img.aligncenter {
display: block;
margin-left: auto;
margin-right: auto;
}
.wp-caption {
background: #fff;
border: 1px solid #f0f0f0;
max-width: 96%; /* Изображение не переполняет область контента */
padding: 5px 3px 10px;
text-align: center;
}
.wp-caption.alignnone {
margin: 5px 20px 20px 0;
}
.wp-caption.alignleft {
margin: 5px 20px 20px 0;
}
.wp-caption.alignright {
margin: 5px 0 20px 20px;
}
.wp-caption img {
border: 0 none;
height: auto;
margin: 0;
max-width: 98.5%;
padding: 0;
width: auto;
}
.wp-caption p.wp-caption-text {
font-size: 11px;
line-height: 17px;
margin: 0;
padding: 0 4px 5px;
}
/* Текст предназначен только для экранных считывателей. */
.screen-reader-text {
border: 0;
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(50%);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute !important;
width: 1px;
word-wrap: normal !important; /* Многие комбинации экранных считывателей и браузеров объявляют сломанные слова так, как они визуально появляются. */
}
.screen-reader-text:focus {
background-color: #eee;
clip: auto !important;
clip-path: none;
color: #444;
display: block;
font-size: 1em;
height: auto;
left: 5px;
line-height: normal;
padding: 15px 23px 14px;
text-decoration: none;
top: 5px;
width: auto;
z-index: 100000;
/* Над панелью инструментов WP. */
}
Используйте the_post_thumbnail($size);
, где размер – это предустановленные размеры изображений, которые вы можете настроить в панели управления wp в настройках – медиа.
Предустановленные размеры изображений:
the_post_thumbnail( 'thumbnail' );
the_post_thumbnail( 'medium' );
the_post_thumbnail( 'medium_large' );
the_post_thumbnail( 'large' );
the_post_thumbnail( 'full' );
вы также можете определить свои собственные размеры изображений в functions.php
, например:
add_image_size( 'my_custom_small', 245, 165, true );
add_image_size( 'my_custom_medium', 600, 400 );
и затем использовать их в шаблоне, как:
the_post_thumbnail( 'my_custom_medium' );
true
означает, что изображение будет обрезано до точного размера, в то время как без него изображение будет уменьшено, чтобы соответствовать одному из максимальных размеров.
в css вы также можете установить максимальную ширину изображений, чтобы она соответствовала ширине контейнера, следующим образом:
img {max-width: 100%;}
– это глобально для всех изображений, или только для тех изображений, которые вы хотите, например:
.post-content img {max-width: 100%;}
Дополнение: не забывайте регенерировать миниатюры после добавления пользовательских размеров, иначе у вас будут новые размеры только для вновь загруженных изображений.
Ответ или решение
Когда вы вставляете изображения в контент поста через функцию the_content()
, они могут превышать максимальную ширину контейнера, например, col-md-10
, который задаёт ширину в 80%. Это связано с тем, что в HTML-коде, генерируемом WordPress, изображения могут иметь фиксированные значения для атрибутов ширины и высоты, что мешает их адаптивному поведению.
Прежде всего, важно понимать, что:
-
Фиксированные размеры изображений: Если вы вставляете изображение с фиксированными размерами (например, через визуальный редактор WordPress), эти размеры могут конфликтовать с вашими стилями CSS, задающими максимальную ширину контейнера.
-
Отсутствие ограничения на уровне CSS: По умолчанию изображения могут не подстраиваться под размеры их родительских контейнеров, если у них не заданы соответствующие CSS-стили.
Чтобы решить проблему с переполнением изображения, предлагаю несколько решений:
1. Сделайте изображения адаптивными
Добавьте следующее CSS-правило в ваш файл стилей (style.css):
.single-post img {
max-width: 100%;
height: auto;
display: block;
}
Это правило будет гарантировать, что изображения не превышают ширину их родительских элементов.
2. Изменение атрибутов ширины и высоты
Чтобы исключить атрибуты ширины и высоты из HTML-кода изображений, можно использовать следующий фильтр. Добавьте этот код в файл functions.php
вашей темы:
add_filter( 'post_thumbnail_html', 'remove_width_attribute', 10 );
add_filter( 'image_send_to_editor', 'remove_width_attribute', 10 );
function remove_width_attribute( $html ) {
$html = preg_replace( '/(width|height)="\d*"\s/', "", $html );
return $html;
}
Этот код удалит фиксированные значения ширины и высоты из изображений, что позволит им более гибко адаптироваться к разным размерам контейнеров.
3. Использование классов Bootstrap
Если вы используете Bootstrap, в его классе .img-responsive
уже предусмотрена поддержка адаптивных изображений. Вы можете добавить этот класс к изображениям, например, при выводе миниатюры поста:
the_post_thumbnail( 'thumbnail', [ 'class' => 'img-responsive' ]);
4. Регистрация пользовательских размеров изображений
Вы можете определить собственные размеры изображений в functions.php
и потом использовать их в шаблоне:
add_image_size( 'my_custom_small', 245, 165, true );
add_image_size( 'my_custom_medium', 600, 400 );
И затем вызывать их в вашем коде:
the_post_thumbnail( 'my_custom_medium' );
5. Стиль для caption и выравнивание изображений
WordPress автоматически добавляет определенные классы для выравнивания изображений. Также вы можете использовать CSS для настройки этих классов. Например:
.wp-caption {
max-width: 96%; /* Не позволяем изображению переполнять контент */
background: #fff;
border: 1px solid #f0f0f0;
padding: 5px 3px 10px;
text-align: center;
}
.wp-caption img {
max-width: 100%;
height: auto;
}
Заключение
Комплексное применение данных подходов позволит вам избежать проблем с переполнением изображений и сделать ваши посты более адаптивными. Обязательно протестируйте изменения на разных устройствах, чтобы убедиться, что все элементы отображаются корректно.