获取与原始图像的纵横比匹配的所有图像大小的列表

时间:2017-10-05 作者:Marvin3

我需要与默认WordPress相同的功能wp_calculate_image_srcset() 方法返回srcset的字符串:

image-300x200.jpg 300w, image-600x400.jpg 600w, ...
但它应该返回一个数组而不是字符串,其结构类似于:

$image_sizes = array(
  array(
    \'url\' => \'image-300x200.jpg\',
    \'width\' => 300,
    \'height\' => 200
  ),
  array(
    \'url\' => \'image-600x400.jpg\',
    \'width\' => 600,
    \'height\' => 400
  ),
  array(
    \'url\' => \'image.jpg\',
    \'width\' => 1200,
    \'height\' => 800
  )
);
我知道我可以解析字符串本身,但我想知道它是否安全?我正在制作的插件是公共的,可以在任何服务器上与其他可能修改此字符串的插件一起使用。

Source of wp_calculate_image_srcset 看起来很复杂,并且使用了一些“\\u private”方法。

这个wp_calculate_image_srcset 也在使用max_srcset_image_width 过滤器(限制图像的最大大小),我需要以某种方式避免它。remove\\u filter->execute method->add\\u filter是跳过它的唯一方法吗?

Edit: 我最终还是这样做了(如果这是个坏主意,请告诉我):

class MyClass {
    public $image_items;

    function __construct() {
        add_filter(\'wp_calculate_image_srcset\', array($this, \'filter_my_srcset\'), 10, 5);
        wp_calculate_image_srcset( ... );
        remove_filter(\'wp_calculate_image_srcset\', array($this, \'filter_my_srcset\'));

        // print_r( $this->image_items );
    }

    public function filter_my_srcset( $source, ... ) {
        $this->image_items = $source;
        return $source;
    }
}

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

我想你应该用wp_calculate_image_srcset() 原因很简单,它非常复杂(首先它不应该只是一个函数)。当WP改变原始算法时,复制它可能会导致奇怪的副作用。

对于过滤器问题:

可以在中传递第三个参数$size_array. WP将只查看前两个值。如果您这样调用函数…

wp_calculate_image_srcset( [600, 400, \'wpse_281968\'], … )
…您可以在筛选时查找该值max_srcset_image_width.

add_filter( \'max_srcset_image_width\', function( $max, array $sizes ) {

    if ( ! empty ( $sizes[2] ) && \'wpse_281968\' === $sizes[2] )
        return PHP_INT_MAX;

    return $max;

}, 10, 20);
是的,这是一次黑客攻击。但它将一直工作,直到WP在这里使用第三个数组条目。密切关注WP来源。:)

然后我会过滤wp_calculate_image_srcset (优先权为- PHP_INT_MAX 以便首先运行)并从中获取源。它是一个数组,可能比函数返回的字符串更容易解析。

旁注:Please don\'t register callbacks for hooks in a constructor. :)

结束

相关推荐

Get images by category

我目前获取滑块图像的方法是使用以下工作正常的代码:$args = array( \'post_type\' => \'attachment\', \'sort_order\' => \'ASC\', \'sort_column\' => \'menu_order\', ); $attachments = get_posts($args); if ($attachments) { $