WordPress.org

Make WordPress Core

Ticket #14110: wp_get_attachment_image.2.diff

File wp_get_attachment_image.2.diff, 4.1 KB (added by Sam_a, 2 years ago)

Let plugins filter image dimensions via wp_get_attachment_image_attributes filter (*props divinenephron*). Restore image dimensions if they're missing after applying the filter (consistent with the wp_get_attachment_image()'s previous behavior). Pass $icon to the filter too. Move esc_attr closer to output. Update documentation. Whitespace.

  • wp/wp-includes/media.php

     
    621621} 
    622622 
    623623/** 
    624  * Get an HTML img element representing an image attachment 
     624 * Gets an HTML image element (img) representing an attachment: 
    625625 * 
     626 * For an image attachment, the image scaled to the specified $size. 
     627 * 
     628 * For a non-image attachment, an icon like those shown in the Media Library (only when $icon is true). 
     629 * 
     630 * $size can be 'full', 'large', 'medium', 'thumbnail', 
     631 * or any keyword registered with add_image_size(). 
     632 * Unrecognized keywords are interpreted as 'full' (not scaled). 
     633 * 
    626634 * While $size will accept an array, it is better to register a size with 
    627635 * add_image_size() so that a cropped version is generated. It's much more 
    628636 * efficient than having to find the closest-sized image and then having the 
     
    633641 * @uses wp_get_attachment_image_src() Gets attachment file URL and dimensions 
    634642 * @since 2.5.0 
    635643 * 
    636  * @param int $attachment_id Image attachment ID. 
    637  * @param string $size Optional, default is 'thumbnail'. 
    638  * @param bool $icon Optional, default is false. Whether it is an icon. 
     644 * @param int $attachment_id Attachment ID. 
     645 * @param string|array $size Keyword or array [width, height]. Ignored for icons. Optional, default is 'thumbnail'. 
     646 * @param bool $icon Use an icon image. Ignored for image attachments. Optional, default is false. 
     647 * @param array|string $attr HTML attributes to merge in. Optional. 
    639648 * @return string HTML img element or empty string on failure. 
    640649 */ 
    641650function wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = false, $attr = '') { 
    642651 
    643         $html = ''; 
     652        $html  = ''; 
    644653        $image = wp_get_attachment_image_src($attachment_id, $size, $icon); 
     654         
    645655        if ( $image ) { 
    646656                list($src, $width, $height) = $image; 
    647                 $hwstring = image_hwstring($width, $height); 
     657 
     658                $width  = intval($width); 
     659                $height = intval($height); 
     660 
    648661                if ( is_array($size) ) 
    649662                        $size = join('x', $size); 
     663                 
     664                if ( $icon && empty($size) ) { 
     665                        $size = 'icon'; 
     666                } 
     667 
    650668                $attachment =& get_post($attachment_id); 
    651669                $default_attr = array( 
    652                         'src'   => $src, 
    653                         'class' => "attachment-$size", 
    654                         'alt'   => trim(strip_tags( get_post_meta($attachment_id, '_wp_attachment_image_alt', true) )), // Use Alt field first 
    655                         'title' => trim(strip_tags( $attachment->post_title )), 
    656                 ); 
    657                 if ( empty($default_attr['alt']) ) 
    658                         $default_attr['alt'] = trim(strip_tags( $attachment->post_excerpt )); // If not, Use the Caption 
    659                 if ( empty($default_attr['alt']) ) 
    660                         $default_attr['alt'] = trim(strip_tags( $attachment->post_title )); // Finally, use the title 
     670                        // Use the image's Alternative Text field if available… 
     671                        'alt'    => trim( strip_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ))), 
     672                        'class'  => "attachment-$size", 
     673                        'height' => $height, 
     674                        'src'    => $src, 
     675                        'title'  => trim( strip_tags( $attachment->post_title )), 
     676                        'width'  => $width, 
     677                        ); 
    661678 
    662                 $attr = wp_parse_args($attr, $default_attr); 
    663                 $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment ); 
    664                 $attr = array_map( 'esc_attr', $attr ); 
    665                 $html = rtrim("<img $hwstring"); 
     679                if ( empty($default_attr['alt']) ) { 
     680                        // otherwise Caption… 
     681                        $default_attr['alt'] = trim( strip_tags( $attachment->post_excerpt )); 
     682                } 
     683  
     684                if ( empty($default_attr['alt']) ) { 
     685                        // otherwise Title 
     686                        $default_attr['alt'] = trim( strip_tags( $attachment->post_title )); 
     687                } 
     688 
     689                $attr = wp_parse_args( $attr, $default_attr ); 
     690                $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment, $icon ); 
     691                 
     692                if ( !isset( $attr['width'], $attr['height'] )) { 
     693                        // If dimensions are missing (null) after applying `wp_get_attachment_image_attributes` filter, restore them. 
     694                        // Plugins can still empty these with ('width' => '', 'height' => ''). 
     695                        $attr['width']  = $width; 
     696                        $attr['height'] = $height; 
     697                } 
     698                 
     699                $html = '<img'; 
     700                 
    666701                foreach ( $attr as $name => $value ) { 
    667                         $html .= " $name=" . '"' . $value . '"'; 
     702                        $html .= sprintf( ' %s="%s"', $name, esc_attr($value) ); 
    668703                } 
     704                 
    669705                $html .= ' />'; 
    670706        } 
    671707