wp_get_attachment_imageからディメンションを削除


10

wp_get_attachment_imageを使用するときに、添付画像から幅と高さを削除するときに問題が発生します。これは私が画像を表示するために使用しているものです

 <?php echo $image = wp_get_attachment_image( $entry['slide_image_id'], true, 'full'); ?>

ソースコードの見え方

 <img width="150" height="108" src="http://website:8888/wp-content/uploads/2015/12/cupcakes-and-cosmetics-logo.png" class="attachment-1 size-1" alt="cupcakes-and-cosmetics-logo" />

このように表示して欲しい

 <img src="http://website:8888/wp-content/uploads/2015/12/cupcakes-and-cosmetics-logo.png" class="attachment-1 size-1" alt="cupcakes-and-cosmetics-logo" />

画像は、slide_image_idというIDを持つエントリを持つ繰り返し可能なファイルフィールドから取得されます。私は周りを見回していて、wp_get_attachment_image_urlを使用することに気づきましたが、上記のコードで使用すると、画像が表示されません。私が間違っていることはありますか?

 <?php echo $image = wp_get_attachment_image_url( $entry['slide_image_id'], true, 'full'); ?>

補足:$ entry ['slide_image_id']は、繰り返し可能なファイルフィールドを呼び出すために使用されているものです。


wp_get_attachment_image_url()画像要素ではなくURLを返します。
bosco

私が@boscoを探している中で最良の解決策は何ですか-user3756781 16
1

うわー、img出力のすべての属性がadd_filter('wp_get_attachment_image_attributes' ...高さと幅だけがハードコードされていることを除いてフィルター可能であることはどれほど不愉快なことです。
squarecandy 2018

回答:


9

両方のためのあなたの引数wp_get_attachment_image_url()wp_get_attachment_image()誤った順序である-詳しくはリンクマニュアルを参照してください。さらに、wp_get_attachment_image_url()実際の画像要素ではなくURLを返します。

要素からwidthおよびheight属性を削除すること<img>はお勧めできません。ページのレイアウトが画像のサイズによって何らかの影響を受ける場合、画像のサイズを指定するCSSまたは画像自体がロードされるとすぐに、レイアウトが「グリッチ」します。

残念ながら、wp_get_attachment_image()関数は現在(WordPress 4.4.1以降)widthおよびheight <img>属性を出力するようにハードコードされているため(チケット#14110を参照)、画像マークアップを自分で構築する必要があります。これは、wp_get_attachment_image()のソースからキューを取得することで実行できます。

<?php
  $attachment = get_post( $entry['slide_image_id'] );

  if( $attachment ) {
    $img_size_class = 'full';
    $img_atts = array(
      'src'   => wp_get_attachment_image_url( $entry['slide_image_id'], $img_size_class, false ),
      'class' => 'attachment-' . $img_size_class . ' size-' . $img_size_class,
      'alt'   => trim(strip_tags( get_post_meta( $entry['slide_image_id'], '_wp_attachment_image_alt', true) ) )
    );

    //If an 'alt' attribute was not specified, try to create one from attachment post data
    if( empty( $img_atts[ 'alt' ] ) )
      $img_atts[ 'alt' ] = trim(strip_tags( $attachment->post_excerpt ));
    if( empty( $img_atts[ 'alt' ] ) )
      $img_atts[ 'alt' ] = trim(strip_tags( $attachment->post_title ));

    $img_atts = apply_filters( 'wp_get_attachment_image_attributes', $img_atts, $attachment, $img_size_class );

    echo( '<img ' );
    foreach( $img_atts as $name => $value ) {
      echo( $name . '="' . $value . '" ';
    }
    echo( '/>' );
  }
?>

私はあなたが私に送ったリンクをたどりました、そしてあなたの解決策を使うことと同様に問題なく画像を生成することができました。私が持っている唯一の問題は、altタグです。あなたが私に送信したリンクではaltタグは生成されず、あなたのタグでは静的です(そのため、wp_get_attachment_imageが最良のオプションだと思いました)。表示している例を使用してaltタグをどのように生成しますか?@bosco
user3756781

この問題は予想よりも複雑であることがわかりました。私の回答を更新して、<img>属性生成ビットを含めましたwp_get_attachment_image()- レスポンシブ画像に使用されるsrcsetおよびsizesパーツは省略しました。これらが必要な場合は、関数get_sizeless_attachment_image()を作成することをお勧めします。
bosco

ありがとうございます。ミス文字echo($ name。 '= "'。$ value。 '"'に対するコード実行中にエラーが発生しました; echo($ name。 '= "'。$ value。 '"');である必要があります。 @boscoにご協力いただきありがとうございます
user3756781

12

回避策

私はいくつかのコアの掘り下げ/テストを行い、wp_constrain_dimensionsフィルターを通して回避策を見つけました:

// Add filter to empty the height/width array
add_filter( 'wp_constrain_dimensions', '__return_empty_array' );
// Display image html
echo wp_get_attachment_image( $entry['slide_image_id'], 'full', true );
// Remove filter again
remove_filter( 'wp_constrain_dimensions', '__return_empty_array' );

これにより、reg-ex canonを取得せずに、生成されたの画像HTMLから高さ幅の属性を削除できるようになりますwp_get_attachment_image()wp_get_attachment_image_src同様の方法でフィルターを使用して、 / 高さを削除することもできますが、URLは保持します。

ノート

この回避策により、srcsetおよびsizes属性も削除されます。ただし、4番目の入力引数を使用してsrcset属性とサイズ属性を設定することもでき$attrます。

@boscoで述べたように、アイコンサイズの入力引数を次のように切り替えました。

echo wp_get_attachment_image( $entry['slide_image_id'], true, 'full' );

代わりにこれを使用してください:

echo wp_get_attachment_image( $entry['slide_image_id'], 'full', true );

1

私は単にこれにCSSを使用しました。すべてのシナリオで機能するわけではありませんが、十分に機能することがよくあります。300px x 300pxの画像を撮ってみましょう:

max-height: 300px;
max-width: 300px;
width: auto;

これにより、画像の幅と高さの比率を失うことなく、画像の寸法が制限されます。それ以外の場合は、REGEXを使用することもできます。

$html = preg_replace(array('/width="[^"]*"/', '/height="[^"]*"/'), '', $html);

これらはいくつかの選択肢でした。幸運を。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.