Установите метаданные мультимедиа (т. Е. Поле «размеры») в файле SVG после извлечения его с помощью фильтра

Мой вопрос заключается в том, как прикрепить размеры размеров, которые я успешно извлек из SVG, и принудительно их в поле «размеры» WP, связанные с файлом, чтобы размеры отображались в медиатеке.

Примечание: это не то же самое, что и в предыдущем вопросе . В этом вопросе я спросил, как извлечь значение измерения. Однако никто не выяснил, как установить это значение навсегда для SVG, чтобы он отображался в медиа-библиотеке.

Где я извлекаю размеры

Я извлекаю размеры изображения из SVG с помощью фильтра. Этот фильтр позволяет мне отображать SVG, а не только как логотипы, а как изображения. Используемый мной фильтр идентифицирует размер SVG из файла SVG, а затем сбрасывает значения значений image[1] и $image[2] в массиве, возвращаемом wp_get_attachment_image_src() Эта функция:

 File: wp-includes/media.php 804: /** 805: * Retrieve an image to represent an attachment. 806: * 807: * A mime icon for files, thumbnail or intermediate size for images. 808: * 809: * The returned array contains four values: the URL of the attachment image src, 810: * the width of the image file, the height of the image file, and a boolean 811: * representing whether the returned array describes an intermediate (generated) 812: * image size or the original, full-sized upload. 813: * 814: * @since 2.5.0 815: * 816: * @param int $attachment_id Image attachment ID. 817: * @param string|array $size Optional. Image size. Accepts any valid image size, or an array of width 818: * and height values in pixels (in that order). Default 'thumbnail'. 819: * @param bool $icon Optional. Whether the image should be treated as an icon. Default false. 820: * @return false|array Returns an array (url, width, height, is_intermediate), or false, if no image is available. 821: */ 822: function wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon = false ) { 823: // get a thumbnail or intermediate image if there is one 824: $image = image_downsize( $attachment_id, $size ); 825: if ( ! $image ) { 826: $src = false; 827: 828: if ( $icon && $src = wp_mime_type_icon( $attachment_id ) ) { 829: /** This filter is documented in wp-includes/post.php */ 830: $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' ); 831: 832: $src_file = $icon_dir . '/' . wp_basename( $src ); 833: @list( $width, $height ) = getimagesize( $src_file ); 834: } 835: 836: if ( $src && $width && $height ) { 837: $image = array( $src, $width, $height ); 838: } 839: } 

Это фильтр, который я применяю к этой функции, которая меняет значения $image[1] и $image[2] (т. Е. Ширина и высота изображения соответственно).

  add_filter( 'wp_get_attachment_image_src', 'fix_wp_get_attachment_image_svg', 10, 4 ); /* the hook */ function fix_wp_get_attachment_image_svg($image, $attachment_id, $size, $icon) { if (is_array($image) && preg_match('/\.svg$/i', $image[0]) && $image[1] <= 1) { if(is_array($size)) { $image[1] = $size[0]; $image[2] = $size[1]; } elseif(($xml = simplexml_load_file($image[0])) !== false) { $attr = $xml->attributes(); $viewbox = explode(' ', $attr->viewBox); $image[1] = isset($attr->width) && preg_match('/\d+/', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null); $image[2] = isset($attr->height) && preg_match('/\d+/', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null); } else { $image[1] = $image[2] = null; } } return $image; } 

Фильтр работает, но медиа-библиотека не отображает извлеченные данные

Фильтр работает, и из того, что я могу сообщить этой информации в $image[1] а $image[2] присваивается ширине и высоте html элемента размещенного SVG. Но, как вы можете видеть на изображении ниже, фильтр, похоже, не обновляет поле dimensions изображения в базе данных WP.

библиотечный просмотр SVG против PNG

Мой вопрос обобщен:

Как взять эти значения размеров, которые извлекает мой фильтр, и подключить их к файлу изображения в самой базе данных таким образом, чтобы я мог просматривать размеры в медиа-библиотеке?

Благодаря!!

Solutions Collecting From Web of "Установите метаданные мультимедиа (т. Е. Поле «размеры») в файле SVG после извлечения его с помощью фильтра"

Фильтр wp_update_attachment_metadata запускается каждый раз при загрузке изображения через медиабиблиотеку (особенно каждый раз, когда вы wp_update_attachment_metadata функцию wp_update_attachment_metadata ).

Поэтому, когда файл svg загружается, мы проверяем, есть ли у файла требуемые метаданные, ширина и высота. Если нет, мы генерируем метаданные, как в вашем wp_get_attachment_image_src . Теперь, когда метаданные сохранены, мы можем вызывать такие функции, как wp_get_attachment_image_src и получать метада без необходимости фильтровать эти функции.

Помните о проблеме загрузки файлов svg в последней версии WordPress (4.7.2). Он должен быть зафиксирован в 4.7.3

Наконец, я хотел бы предупредить вас о потенциальных рисках безопасности (XSS-атаках), которые открывают файлы SVG. Подробнее здесь и здесь .

 function svg_meta_data($data, $id){ $attachment = get_post($id); // Filter makes sure that the post is an attachment $mime_type = $attachment->post_mime_type; // The attachment mime_type //If the attachment is an svg if($mime_type == 'image/svg+xml'){ //If the svg metadata are empty or the width is empty or the height is empty //then get the attributes from xml. if(empty($data) || empty($data['width']) || empty($data['height'])){ $xml = simplexml_load_file(wp_get_attachment_url($id)); $attr = $xml->attributes(); $viewbox = explode(' ', $attr->viewBox); $data['width'] = isset($attr->width) && preg_match('/\d+/', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null); $data['height'] = isset($attr->height) && preg_match('/\d+/', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null); } } return $data; } add_filter('wp_update_attachment_metadata', 'svg_meta_data', 10, 2);