横長の画像と縦長の画像があり、
レスポンシブデザインに対応させたい為、
横長の画像のimgタグにclassを与えて、max-widthを設定したいと思っています。
横長の画像には
img.yoko280 {
width: 100%;
max-width: 280px;
height: auto;
}
縦長の画像には
img.tate260 {
width: 100%;
max-width: 260px;
height: auto;
}
という問い合わせでした。レスポンシブの部分は、とりあえず置いておいて、実現方法を、試してみます
質問者は、以下のコードを試したそうですが、投稿本文に、無用な class=”yoko280 という文字列が表示されて困っていると語っていました。
function my_add_yokosize() {
echo ' class="yoko280"';
}
add_shortcode('yokosize', 'my_add_yokosize');
と記載し、
投稿用のsingle.phpに
<?php
if(get_post_meta($post->ID,'mainphoto',true)){
echo '<p><img src="'.get_post_meta($post->ID,'mainphoto',true).'" alt="';
echo the_title_attribute( 'echo=false' ).'"';
if ( has_shortcode( $post->post_content, 'yokosize' ) && is_singular() ) {
echo do_shortcode('[yokosize]');
}
echo '></p>';
}
if(get_post_meta($post->ID,'lower-desc',true)){
echo '<p class="img-desc-bottom">'.get_post_meta($post->ID,'lower-desc',true).'</p> ';
}
?>
この質問に対して、機械的に答えるなら、
function.phpに
function my_add_yokosize() {
return '<!--yoko280-->';
}
add_shortcode('yokosize', 'my_add_yokosize');
とショートコードを少し工夫すればいい
<?php
if ( get_post_meta( $post->ID, 'mainphoto1', true ) ) {
echo '<p class="test2"><img src="' . get_post_meta( $post->ID, 'mainphoto1', true ) . '" alt="';
echo the_title_attribute( 'echo=false' ) . '"';
if ( has_shortcode( $post->post_content, 'yokosize' ) && is_singular() ) {
echo str_replace( array( '<!--', '-->' ), array( ' class="', '"' ), do_shortcode( '[yokosize]' ) );
}
echo ' style="max-width:100%" /></p>';
}
if ( get_post_meta( $post->ID, 'mainphoto2', true ) ) {
echo '<p class="test2 img-desc-bottom"><img src="' . get_post_meta( $post->ID, 'mainphoto2', true ) . '" /></p> ';
}
?>
投稿本文に文字列が表示されないようにすれば、OK といった回答になるのだろうと思う。
しかし、これが、最良に解決方法かといえば、疑問が残る。
「そもそも、なぜショートコードを使ってクラスを入力するのか?」
カスタムフィールドに、URLを入力し、更に投稿本文にショートコードを記述するのは、手間だろう。
次に、CSSと背景画像を使って処理してみる
template
<?php
if(get_post_meta($post->ID,'mainphoto1',true)){
echo '<div id="image-wrapper" style="background-image:url('.get_post_meta($post->ID,'mainphoto1',true).'); "></div>';
}
if(get_post_meta($post->ID,'mainphoto2',true)){
echo '<div id="image-wrapper" style="background-image:url('.get_post_meta($post->ID,'mainphoto2',true).'); "></div>';
}
?>
style.css
#image-wrapper{
width:280px;
height:360px;
background-size:contain;
border:1px solid green;
background-repeat:no-repeat;
background-position:top center;
display:inline-block;
}
いや、そもそもの、カスタムフィールドのURLの入力を縦画像と横画像で、別のものにしてみよう
最近、時々使われる プロトコルレスURLを使ってみましょう。
http:という文字列の有無でを、縦か横かを判定します(最悪http:はなくても、画像は表示できるので)
縦画像の時には、http: を省いたURLをカスタムフィールドに入力するというルールにした場合だと、
<?php
if ( get_post_meta( $post->ID, 'mainphoto1', true ) ) {
$url= get_post_meta( $post->ID, 'mainphoto1', true );
if ( strstr( $url , 'http:' ) ) {
echo '<p class="yoko280"><img src="' . $url . '" /></p>';
} else {
echo '<p class="tate260"><img src="' . $url. '" /></p>';
}
}
?>
<?php
if ( get_post_meta( $post->ID, 'mainphoto3', true ) ) {
$url= get_post_meta( $post->ID, 'mainphoto3', true );
if ( strstr( $url , 'http:' ) ) {
echo '<p class="yoko280"><img src="' . $url . '" /></p>';
} else {
echo '<p class="tate260"><img src="http:' . $url. '" /></p>';
}
}
?>
まだまだ、方法はたくさんありそうです。
大きくは、
- 入力内容の見直しによる解決
- 出力は変更せず、CSSで要求を満たす
- ショートコードやフィルタなどを使って、出力を変更する
という事になるのでしょうか
あなたなら、どんな方法を考えつき、何にOKをだすのだろうか
<hr />
<?php
if(get_post_meta($post->ID,'mainphoto1',true)){
echo '<div id="image-wrapper" style="background-image:url('.get_post_meta($post->ID,'mainphoto1',true).'); "></div>';
}
if(get_post_meta($post->ID,'mainphoto2',true)){
echo '<div id="image-wrapper" style="background-image:url('.get_post_meta($post->ID,'mainphoto2',true).'); "></div>';
}
?>
<hr />
<?php
if ( get_post_meta( $post->ID, 'mainphoto1', true ) ) {
echo '<p class="test2"><img src="' . get_post_meta( $post->ID, 'mainphoto1', true ) . '" alt="';
echo the_title_attribute( 'echo=false' ) . '"';
if ( has_shortcode( $post->post_content, 'yokosize' ) && is_singular() ) {
echo str_replace( array( '<!--', '-->' ), array( ' class="', '"' ), do_shortcode( '[yokosize]' ) );
}
echo ' style="max-width:100%" /></p>';
}
if ( get_post_meta( $post->ID, 'mainphoto2', true ) ) {
echo '<p class="test2 img-desc-bottom"><img src="' . get_post_meta( $post->ID, 'mainphoto2', true ) . '" /></p> ';
}
?>
<h2>test3 プロトコルレス URL</h2>
<?php
if ( get_post_meta( $post->ID, 'mainphoto1', true ) ) {
$url= get_post_meta( $post->ID, 'mainphoto1', true );
if ( strstr( $url , 'http:' ) ) {
echo '<p class="yoko280"><img src="' . $url . '" /></p>';
} else {
echo '<p class="tate260"><img src="' . $url. '" /></p>';
}
}
?>
<?php
if ( get_post_meta( $post->ID, 'mainphoto3', true ) ) {
$url= get_post_meta( $post->ID, 'mainphoto3', true );
if ( strstr( $url , 'http:' ) ) {
echo '<p class="yoko280"><img src="' . $url . '" /></p>';
} else {
echo '<p class="tate260"><img src="http:' . $url. '" /></p>';
}
}
?>
.test2{
display:inline-block;
}
.test2 img{
vertical-align:top;
}
.yoko280{
width:280px;
display:inline-block;
}
.tate260{
width:260px;
display:inline-block;
}
.yoko280 img,
.tate260 img{
max-width:100%;
vertical-align:top;
}
.img-desc-bottom img{
width:260px;
}
#image-wrapper{
width:280px;
height:360px;
background-size:contain;
border:1px solid green;
background-repeat:no-repeat;
background-position:top center;
display:inline-block;
}

