web-dev-qa-db-ja.com

元の画像の縦横比と一致するすべての画像サイズのリストを取得する

Srcsetの文字列を返すデフォルトのWordPress wp_calculate_image_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
  )
);

私は文字列そのものを解析することができると理解していますが、それが安全かどうか疑問に思います。私が作っているプラ​​グインは公開されており、この文字列を変更する可能性のある他のプラグインを持つ任意のサーバーで使用できます。

wp_calculate_image_srcsetのソース は複雑に見え、いくつかの "_private"メソッドを使用します。

wp_calculate_image_srcsetmax_srcset_image_widthフィルタ(これは画像の最大サイズを制限します)を使っているので、どうにかしてそれを避ける必要があります。それをスキップする唯一の方法は、remove_filter - > execute method - > add_filterですか?

編集:これをやってしまいました(それが悪い考えだったら - 教えてください):

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
Marvin3

wp_calculate_image_srcset()は非常に複雑であるという単純な理由で使うべきだと思います(そもそもそれがただ1つの関数であってはならない)。 WPが元のアルゴリズムを変更しているときにそれを複製すると、将来奇妙な副作用が生じる可能性があります。

フィルタ問題の場合:

$size_arrayに3番目のパラメータを渡すことができます。 WPは最初の2つの値を調べます。このような関数を呼べば…

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がここで3番目の配列エントリを使用するまではうまくいきます。 WPソースに注目してください。 :)

それから私はwp_calculate_image_srcsetを(最初に実行するために- PHP_INT_MAXの優先順位で)フィルタリングし、そこからソースを取得します。これは配列で、おそらく関数が返す文字列よりも多少解析が簡単です。

サイドノート: フックのコールバックをコンストラクタに登録しないでください 。 :)

3
fuxia