Получите список всех размеров изображения, которые соответствуют соотношению сторон исходного изображения


Мне нужна та же функциональность, что и метод 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
  )
);

Я понимаю, что могу просто разобрать саму строку, но мне интересно, безопасно ли это? Плагин, который я создаю, является общедоступным и может использоваться на любом сервере с другими плагинами, которые могут изменять эту строку.

Источник wp_calculate_image_srcset кажется сложным и использует несколько методов "_private".

wp_calculate_image_srcset также использует фильтр max_srcset_image_width (который ограничивает максимальный размер изображения), и мне нужно как-то его избежать. Является ли remove_filter -> метод выполнения -> 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;
    }
}
Author: fuxia, 2017-10-05

1 answers

Я думаю, вам следует использовать 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, чтобы запустить первым) и извлек источники из этого. Это массив, и, вероятно, его немного легче разобрать, чем строку, возвращаемую функцией.

Примечание: Пожалуйста, не регистрируйте обратные вызовы для крючков в конструкторе. :)

 3
Author: fuxia, 2017-10-05 21:07:45