Supprimer la dimension de wp_get_attachment_image

10

J'ai des problèmes pour supprimer la largeur et la hauteur de mes images jointes lors de l'utilisation de wp_get_attachment_image. Voici ce que j'utilise pour afficher l'image

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

A quoi ressemble le code source

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

J'aimerais qu'il s'affiche comme ceci

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

L'image est extraite d'un champ de fichier répétable avec une entrée avec un id de slide_image_id. J'ai regardé autour et j'ai remarqué d'utiliser wp_get_attachment_image_url mais quand je l'utilise avec mon code ci-dessus, l'image ne s'affiche pas. Y a-t-il quelque chose que je fais mal?

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

Note latérale: $ entry ['slide_image_id'] est ce qui est utilisé pour appeler mon champ de fichier répétable.

user3756781
la source
wp_get_attachment_image_url()renvoie une URL - pas un élément d'image.
bosco
Quelle sera la meilleure solution dans ce que je recherche @bosco
user3756781
Wow, à quel point il est ennuyeux que chaque attribut de la sortie img soit filtrable, add_filter('wp_get_attachment_image_attributes' ...sauf que seules la hauteur et la largeur sont codées en dur.
squarecandy

Réponses:

9

Vos arguments pour les deux wp_get_attachment_image_url()et wp_get_attachment_image()dans le mauvais ordre - consultez la documentation liée pour plus de détails. En outre, wp_get_attachment_image_url()renvoie une URL - pas un élément d'image réel.

La suppression des attributs widthet heightdes <img>éléments est déconseillée: si la mise en page de la page est influencée de quelque manière que ce soit par la taille de l'image, la mise en page "pépinera" dès que le CSS qui spécifie les dimensions de l'image, ou l'image elle-même se charge.

Malheureusement, la wp_get_attachment_image()fonction est actuellement (à partir de WordPress 4.4.1) codée en dur pour générer les attributs widthet height <img>(voir ticket # 14110 ), vous devrez donc créer vous-même le balisage d'image. Cela peut être fait en prenant des indices de wp_get_attachment_image()la source de :

<?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
la source
J'ai suivi le lien que vous m'avez envoyé et j'ai pu générer l'image sans problème et utiliser votre solution. Le seul problème que j'ai, c'est avec la balise alt. Avec le lien que vous m'avez envoyé, une balise alt n'est pas générée et avec la vôtre, elle est statique (c'est pourquoi j'ai pensé que wp_get_attachment_image serait la meilleure option). Comment générer une balise alt avec l'exemple que vous affichez? @bosco
user3756781
Le problème s'est avéré plus compliqué que je ne l'avais prévu. Mise à jour de ma réponse pour inclure les <img>bits de génération d'attributs de wp_get_attachment_image()- bien que j'aie omis les parties srcsetet sizesutilisées pour les images réactives. Si ceux-ci sont nécessaires, la création d'une fonction get_sizeless_attachment_image()serait souhaitable.
bosco
merci cela a fonctionné parfaitement. Il y avait une erreur dans le code do à un écho de caractère manquant ($ name. '= "'. $ Value. '"'; Devrait être echo ($ name. '= "'. $ Value. '"') ;. Merci encore pour votre aide @bosco
user3756781
12

solution de contournement

J'ai fait quelques recherches / tests de base et trouvé une solution de contournement à travers le wp_constrain_dimensionsfiltre:

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

Cela semble nous permettre de supprimer les attributs de hauteur et de largeur de l'image html générée wp_get_attachment_image(), sans sortir les canons reg-ex. Nous pourrions également utiliser le wp_get_attachment_image_srcfiltre d'une manière similaire pour supprimer la largeur / hauteur mais garder l' url .

Remarques

Cette solution de contournement supprime les srcsetet sizesattributs. Mais il est également possible de définir les attributs srcset et tailles via le quatrième $attrargument d'entrée.

Comme mentionné par @bosco, vous avez changé les arguments d'entrée d' icône et de taille dans:

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

Utilisez-le à la place:

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

J'ai simplement utilisé CSS pour celui-ci. Cela ne fonctionne pas dans tous les scénarios, mais assez souvent. Prenons une image 300px x 300px:

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

Cela limite les dimensions de l'image sans perdre son rapport largeur / hauteur. Sinon, vous pouvez également utiliser REGEX:

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

Ce sont des alternatives. Bonne chance.

JMRC
la source