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