Entfernen Sie Dimension aus wp_get_attachment_image

10

Bei Verwendung von wp_get_attachment_image tritt ein Problem beim Entfernen der Breite und Höhe aus meinen Anhangsbildern auf. Dies ist, was ich benutze, um das Bild anzuzeigen

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

Wie es aussieht der Quellcode

 <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" />

Ich möchte, dass es so angezeigt wird

 <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" />

Das Bild wird aus einem wiederholbaren Dateifeld mit einem Eintrag mit der ID slide_image_id abgerufen. Ich habe mich umgesehen und festgestellt, dass ich wp_get_attachment_image_url verwenden soll, aber wenn ich es mit meinem obigen Code verwende, wird das Bild nicht angezeigt. Gibt es etwas, was ich falsch mache?

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

Randnotiz: $ entry ['slide_image_id'] wird verwendet, um mein wiederholbares Dateifeld aufzurufen.

user3756781
quelle
wp_get_attachment_image_url()Gibt eine URL zurück - kein Bildelement.
Bosco
Was wird die beste Lösung in dem sein, was ich suche @bosco
user3756781
Wow, wie ärgerlich ist es, dass jedes Attribut der img-Ausgabe gefiltert werden kann, add_filter('wp_get_attachment_image_attributes' ...außer dass nur Höhe und Breite fest codiert sind.
Squarecandy

Antworten:

9

Ihre Argumente für beide wp_get_attachment_image_url()und wp_get_attachment_image()sind in der falschen Reihenfolge - überprüfen Sie die verknüpfte Dokumentation für Details. Gibt außerdem wp_get_attachment_image_url()eine URL zurück - kein tatsächliches Bildelement.

Das Entfernen der widthund height-Attribute aus <img>Elementen ist nicht ratsam: Wenn das Layout der Seite in irgendeiner Weise von der Größe des Bildes beeinflusst wird, wird das Layout "fehlerhaft", sobald das CSS, das die Abmessungen des Bildes angibt, oder das Bild selbst geladen wird.

Leider ist die wp_get_attachment_image()Funktion derzeit (ab WordPress 4.4.1) fest codiert, um die Attribute widthund auszugeben height <img>(siehe Ticket Nr. 14110 ), sodass Sie das Bild-Markup selbst erstellen müssen. Dies kann durch Hinweise aus wp_get_attachment_image()der Quelle erfolgen :

<?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( '/>' );
  }
?>
Bosco
quelle
Ich bin dem Link gefolgt, den Sie mir gesendet haben, und konnte das Bild problemlos generieren und Ihre Lösung verwenden. Das einzige Problem, das ich habe, ist mit dem Alt-Tag. Mit dem Link, den Sie mir gesendet haben, wird kein Alt-Tag generiert und mit Ihrem ist es statisch (weshalb ich dachte, wp_get_attachment_image wäre die beste Option). Wie würde ich ein Alt-Tag mit dem angezeigten Beispiel generieren? @ Bosco
Benutzer3756781
Das Problem stellte sich als komplizierter heraus, als ich erwartet hatte. Meine Antwort wurde aktualisiert und enthält nun die <img>Attributegenerierungsbits von wp_get_attachment_image()- obwohl ich die srcsetund sizesTeile, die für reaktionsfähige Bilder verwendet wurden, weggelassen habe. Wenn diese benötigt werden, ist get_sizeless_attachment_image()es ratsam , eine Funktion zu erstellen.
Bosco
Danke, das hat perfekt funktioniert. Es gab einen Fehler im Code do für ein falsches Zeichenecho ($ name. '= "'. $ Value. '"'; Sollte echo sein ($ name. '= "'. $ Value. '"');. Nochmals
vielen
12

Problemumgehung

Ich habe einige Kerngrabungen / Tests durchgeführt und eine Problemumgehung durch den wp_constrain_dimensionsFilter gefunden:

// 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' );

Dies scheint es uns zu ermöglichen, die Höhen- und Breitenattribute aus dem generierten HTML-Bild von zu entfernen wp_get_attachment_image(), ohne die Reg-Ex-Kanons herauszuholen. Wir könnten den wp_get_attachment_image_srcFilter auch auf ähnliche Weise verwenden, um die Breite / Höhe zu entfernen, aber die URL beizubehalten .

Anmerkungen

Diese Problemumgehung entfernt das srcsetund sizesauch Attribute. Aber es ist auch möglich , die festlegen srcset und Größen Attribute durch das vierte $attrEingabeargument.

Wie von @bosco erwähnt, haben Sie die geschalteten Symbol und Größe Eingabeargumente in:

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

Verwenden Sie stattdessen Folgendes:

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

Ich habe einfach CSS für diesen verwendet. Es funktioniert nicht in allen Szenarien, aber oft genug. Nehmen wir ein 300 x 300 Pixel großes Bild:

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

Dies schränkt die Abmessungen des Bildes ein, ohne das Verhältnis von Breite zu Höhe zu verlieren. Ansonsten können Sie auch REGEX verwenden:

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

Dies waren einige Alternativen. Viel Glück.

JMRC
quelle