从一组维度中获取最接近的命名图像大小

时间:2017-01-25 作者:Cai

我想检索最接近的命名图像大小(例如。\'thumbnail\', \'medium\', \'large\', \'full\', 或添加的任何自定义尺寸的名称add_image_size()) 从宽度/高度值数组(例如。array( 150, 150 )). 我基本上想做什么wp_get_attachment_image 和相关函数,但没有实际图像。

我希望的是:

$image_size   = get_named_size( array( 150, 150 ) ); // returns \'thumbnail\'
$another_size = get_named_size( array( 999999, 999999 ) ); // returns \'full\'
看起来图像函数中的所有调整大小魔法都发生在image_downsize(), 但就我所知,那里发生的一切都依赖于实际图像,只返回一个新图像,而不是大小,这对我没有什么帮助。

我可以使用以下示例获得所有现有尺寸here, 但是,将我的数组值与所有现有大小进行比较并找到最接近的值会有点麻烦,所以我希望现有的wp函数可以帮助我解决这个问题。

1 个回复
SO网友:Cai

结果是,image_get_intermediate_size() 很容易适应我的需要。而不是使用wp_get_attachment_metadata 要获取现有图像的可用大小,我使用自己的函数获取所有可用图像大小(基本上与建议的函数相同here). 然后,我只返回名称,而不是元数据数组。

它可以工作,但我需要做一些更彻底的测试,并且可能需要做一些更改(例如,我不确定我是否真的想返回小于“缩略图”大小的“缩略图”)。。。

下面是我的整个函数(它是实用程序类的静态方法):

/**
 * Return the closest named size from an array of width and height values.
 *
 * Based off of WordPress\'s image_get_intermediate_size()
 * If the size matches an existing size then it will be used. If there is no
 * direct match, then the nearest image size larger than the specified size
 * will be used. If nothing is found, then the function will return false.
 * Uses get_image_sizes() to get all available sizes.
 *
 * @param  array|string $size   Image size. Accepts an array of width and height (in that order).
 * @return false|string $data   named image size e.g. \'thumbnail\'.
 */
public static function get_named_size( $size ) {

    $image_sizes = self::get_image_sizes();
    $data = array();

    // Find the best match when \'$size\' is an array.
    if ( is_array( $size ) ) {
        $candidates = array();

        foreach ( $image_sizes as $_size => $data ) {

            // If there\'s an exact match to an existing image size, short circuit.
            if ( $data[\'width\'] == $size[0] && $data[\'height\'] == $size[1] ) {
                $candidates[ $data[\'width\'] * $data[\'height\'] ] = array( $_size, $data );
                break;
            }

            // If it\'s not an exact match, consider larger sizes with the same aspect ratio.
            if ( $data[\'width\'] >= $size[0] && $data[\'height\'] >= $size[1] ) {
                if ( wp_image_matches_ratio( $data[\'width\'], $data[\'height\'], $size[0], $size[1] ) ) {
                    $candidates[ $data[\'width\'] * $data[\'height\'] ] = array( $_size, $data );
                }
            }
        }

        if ( ! empty( $candidates ) ) {
            // Sort the array by size if we have more than one candidate.
            if ( 1 < count( $candidates ) ) {
                ksort( $candidates );
            }

            $data = array_shift( $candidates );
            $data = $data[0];
        /*
         * When the size requested is smaller than the thumbnail dimensions, we
         * fall back to the thumbnail size to maintain backwards compatibility with
         * pre 4.6 versions of WordPress.
         */
        } elseif ( ! empty( $image_sizes[\'thumbnail\'] ) && $image_sizes[\'thumbnail\'][\'width\'] >= $size[0] && $image_sizes[\'thumbnail\'][\'width\'] >= $size[1] ) {
            $data = \'thumbnail\';
        } else {
            return false;
        }

    } elseif ( ! empty( $image_sizes[ $size ] ) ) {
        $data = $size;
    }

    // If we still don\'t have a match at this point, return false.
    if ( empty( $data ) ) {
        return false;
    }

    return $data;
}
我可以使用(接近)我最初想要的方式:

$image_size = My_Utility_Class::get_named_size( array( 150, 150 ) ); // returns \'thumbnail\'

相关推荐

Remove <p></p> after images

我对<p></p> 出现在my之后的标记<img....>. 以下是我在本地主机上查看生成的页面时显示的内容。。。<img src=\"/wp-content/themes/wunderful/assets/images/feedback-danielle.png\" alt=\"Danielle Johnson Deal Town FC Treasurer\"> <p></p> 请注意随机生成的<p>&