WordPress.org

Plugin Directory

Changeset 632022


Ignore:
Timestamp:
11/29/12 22:25:58 (17 months ago)
Author:
ethitter
Message:

Jetpack Photon update

  • Now detects local attachments and queries WP for information about custom crop sizes and maximum image dimensions.
  • Smarter handling of mixed absolute and relative dimensions in images.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • jetpack/trunk/modules/photon.php

    r631958 r632022  
    9090 
    9191            $image_sizes = $this->image_sizes(); 
     92            $upload_dir = wp_upload_dir(); 
    9293 
    9394            foreach ( $images[0] as $index => $tag ) { 
     
    9798                // Start with a clean attachment ID each time 
    9899                $attachment_id = false; 
     100 
     101                // Flag if we need to munge a fullsize URL 
     102                $fullsize_url = false; 
    99103 
    100104                // Identify image source 
     
    123127 
    124128                // Can't pass both a relative width and height, so unset the height in favor of not breaking the horizontal layout. 
    125                 if ( false !== strpos( $width, '%' ) && false !== strpos( $width, '%' ) ) 
     129                if ( false !== strpos( $width, '%' ) && false !== strpos( $height, '%' ) ) 
    126130                    $width = $height = false; 
    127131 
    128                 // Classes 
    129                 if ( preg_match( '#class=["|\']?([^"\']+)["|\']?#i', $images[3][ $index ], $classes ) ) { 
    130                     // WP registered image size, only if width and height are needed 
    131                     if ( false === $width && false === $height && preg_match( '#size-([^\s]+)#i', $classes[1], $size ) ) { 
    132                         $size = array_pop( $size ); 
    133  
    134                         if ( 'full' != $size && array_key_exists( $size, $image_sizes ) ) { 
    135                             $width = (int) $image_sizes[ $size ]['width']; 
    136                             $height = (int) $image_sizes[ $size ]['height']; 
    137                             $transform = $image_sizes[ $size ]['crop'] ? 'resize' : 'fit'; 
     132                // Detect WP registered image size from HTML class 
     133                if ( preg_match( '#class=["|\']?[^"\']*size-([^"\'\s]+)[^"\']*["|\']?#i', $images[3][ $index ], $size ) ) { 
     134                    $size = array_pop( $size ); 
     135 
     136                    if ( false === $width && false === $height && 'full' != $size && array_key_exists( $size, $image_sizes ) ) { 
     137                        $width = (int) $image_sizes[ $size ]['width']; 
     138                        $height = (int) $image_sizes[ $size ]['height']; 
     139                        $transform = $image_sizes[ $size ]['crop'] ? 'resize' : 'fit'; 
     140                    } 
     141                } 
     142 
     143                // WP Attachment ID, if uploaded to this site 
     144                if ( preg_match( '#class=["|\']?[^"\']*wp-image-([\d]+)[^"\']*["|\']?#i', $images[3][ $index ], $attachment_id ) && ( 0 === strpos( $src, $upload_dir['baseurl'] ) || apply_filters( 'jetpack_photon_image_is_local', false, compact( 'src', 'tag', 'images', 'index' ) ) ) ) { 
     145                    $attachment_id = intval( array_pop( $attachment_id ) ); 
     146 
     147                    if ( $attachment_id ) { 
     148                        $attachment = get_post( $attachment_id ); 
     149 
     150                        // Basic check on returned post object 
     151                        if ( is_object( $attachment ) && ! is_wp_error( $attachment ) && 'attachment' == $attachment->post_type ) { 
     152                            $src_per_wp = wp_get_attachment_image_src( $attachment_id, isset( $size ) ? $size : 'full' ); 
     153 
     154                            if ( $this->validate_image_url( $src_per_wp[0] ) ) { 
     155                                $src = $src_per_wp[0]; 
     156                                $fullsize_url = true; 
     157 
     158                                // Prevent image distortion if a detected dimension exceeds the image's natural dimensions 
     159                                if ( ( false !== $width && $width > $src_per_wp[1] ) || ( false !== $height && $height > $src_per_wp[2] ) ) { 
     160                                    $width = false == $width ? false : min( $width, $src_per_wp[1] ); 
     161                                    $height = false == $height ? false : min( $height, $src_per_wp[2] ); 
     162                                } 
     163 
     164                                // If no width and height are found, max out at source image's natural dimensions 
     165                                // Otherwise, respect registered image sizes' cropping setting 
     166                                if ( false == $width && false == $height ) { 
     167                                    $width = $src_per_wp[1]; 
     168                                    $height = $src_per_wp[2]; 
     169                                    $transform = 'fit'; 
     170                                } elseif ( isset( $size ) && array_key_exists( $size, $image_sizes ) && isset( $image_sizes[ $size ]['crop'] ) ) { 
     171                                    $transform = (bool) $image_sizes[ $size ]['crop'] ? 'resize' : 'fit'; 
     172                                } 
     173                            } 
     174                        } else { 
     175                            unset( $attachment ); 
    138176                        } 
    139177                    } 
    140  
    141                     // WP Attachment ID 
    142                     if ( preg_match( '#wp-image-(\d+)#i', $classes[1], $attachment_id ) ) 
    143                         $attachment_id = intval( array_pop( $attachment_id ) ); 
    144178                } 
    145179 
     
    170204 
    171205                // Build URL, first removing WP's resized string so we pass the original image to Photon 
    172                 if ( preg_match( '#(-\d+x\d+)\.(' . implode('|', $this->extensions ) . '){1}$#i', $src, $src_parts ) ) 
     206                if ( ! $fullsize_url && preg_match( '#(-\d+x\d+)\.(' . implode('|', $this->extensions ) . '){1}$#i', $src, $src_parts ) ) 
    173207                    $src = str_replace( $src_parts[1], '', $src ); 
    174208 
     
    176210                $args = array(); 
    177211 
    178                 if ( false !== $width && false !== $height ) 
     212                if ( false !== $width && false !== $height && false === strpos( $width, '%' ) && false === strpos( $height, '%' ) ) 
    179213                    $args[ $transform ] = $width . ',' . $height; 
    180214                elseif ( false !== $width ) 
Note: See TracChangeset for help on using the changeset viewer.