Make WordPress Core


Ignore:
Timestamp:
12/30/2015 01:03:11 AM (9 years ago)
Author:
azaozz
Message:

Responsive images: fix the check whether the attachment meta matches the image src to work with http/https and CDNs.

Props webaware, joemcgill, azaozz.
Fixes #35045 and #35102 for trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/media.php

    r36120 r36121  
    997997 */
    998998function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id = 0 ) {
     999    /**
     1000     * Let plugins pre-filter the image meta to be able to fix inconsistencies in the stored data.
     1001     *
     1002     * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
     1003     * @param array  $size_array    Array of width and height values in pixels (in that order).
     1004     * @param string $image_src     The 'src' of the image.
     1005     * @param int    $attachment_id The image attachment ID or 0 if not supplied.
     1006     */
     1007    $image_meta = apply_filters( 'wp_calculate_image_srcset_meta', $image_meta, $size_array, $image_src, $attachment_id );
     1008
    9991009    if ( empty( $image_meta['sizes'] ) ) {
    10001010        return false;
     
    10131023
    10141024    $image_basename = wp_basename( $image_meta['file'] );
    1015     $image_baseurl = _wp_upload_dir_baseurl();
    10161025
    10171026    /*
     
    10301039    }
    10311040
    1032     // Uploads are (or have been) in year/month sub-directories.
    1033     if ( $image_basename !== $image_meta['file'] ) {
    1034         $dirname = _wp_get_attachment_relative_path( $image_meta['file'] );
    1035 
    1036         if ( $dirname ) {
    1037             $image_baseurl = trailingslashit( $image_baseurl ) . $dirname;
    1038         }
    1039     }
    1040 
    1041     $image_baseurl = trailingslashit( $image_baseurl );
     1041    // Retrieve the uploads sub-directory from the full size image.
     1042    $dirname = _wp_get_attachment_relative_path( $image_meta['file'] );
     1043
     1044    if ( $dirname ) {
     1045        $dirname = trailingslashit( $dirname );
     1046    }
     1047
     1048    $image_baseurl = _wp_upload_dir_baseurl();
     1049    $image_baseurl = trailingslashit( $image_baseurl ) . $dirname;
    10421050
    10431051    /*
     
    10611069    $sources = array();
    10621070
     1071    /**
     1072     * To make sure the ID matches our image src, we will check to see if any sizes in our attachment
     1073     * meta match our $image_src. If no mathces are found we don't return a srcset to avoid serving
     1074     * an incorrect image. See #35045.
     1075     */
     1076    $src_matched = false;
     1077
    10631078    /*
    10641079     * Loop through available images. Only use images that are resized
     
    10661081     */
    10671082    foreach ( $image_sizes as $image ) {
     1083
     1084        // If the file name is part of the `src`, we've confirmed a match.
     1085        if ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {
     1086            $src_matched = true;
     1087        }
    10681088
    10691089        // Filter out images that are from previous edits.
     
    11301150
    11311151    // Only return a 'srcset' value if there is more than one source.
    1132     if ( count( $sources ) < 2 ) {
     1152    if ( ! $src_matched || count( $sources ) < 2 ) {
    11331153        return false;
    11341154    }
     
    13091329        strpos( wp_basename( $image_src ), $img_edit_hash[0] ) === false ) {
    13101330
    1311         return $image;
    1312     }
    1313 
    1314     $base_url = trailingslashit( _wp_upload_dir_baseurl() );
    1315     $image_base_url = $base_url;
    1316 
    1317     $dirname = _wp_get_attachment_relative_path( $image_meta['file'] );
    1318     if ( $dirname ) {
    1319         $image_base_url .= trailingslashit( $dirname );
    1320     }
    1321 
    1322     $all_sizes = wp_list_pluck( $image_meta['sizes'], 'file' );
    1323 
    1324     foreach ( $all_sizes as $key => $file ) {
    1325         $all_sizes[ $key ] = $image_base_url . $file;
    1326     }
    1327 
    1328     // Add the original image.
    1329     $all_sizes[] = $image_base_url . basename( $image_meta['file'] );
    1330 
    1331     // Bail early if the image src doesn't match any of the known image sizes.
    1332     if ( ! in_array( $image_src, $all_sizes ) ) {
    13331331        return $image;
    13341332    }
Note: See TracChangeset for help on using the changeset viewer.