get( 'svg-upload', false ) ) { $this->enableSvgUpload(); } } public function enableSvgUpload() { add_filter( 'upload_mimes', array( $this, 'addSvgMimeType' ) ); add_filter( 'wp_check_filetype_and_ext', array( $this, 'wp_check_filetype_and_ext' ), 10, 4 ); add_filter( 'wp_prepare_attachment_for_js', [ $this, 'wp_prepare_attachment_for_js' ], 10, 3 ); add_filter( 'wp_handle_upload_prefilter', array( $this, 'wp_handle_upload_prefilter' ) ); } public function disableSvgUpload() { remove_filter( 'upload_mimes', array( $this, 'addSvgMimeType' ) ); remove_filter( 'wp_check_filetype_and_ext', array( $this, 'wp_check_filetype_and_ext' ), 10, 4 ); remove_filter( 'wp_prepare_attachment_for_js', [ $this, 'wp_prepare_attachment_for_js' ], 10, 3 ); remove_filter( 'wp_handle_upload_prefilter', array( $this, 'wp_handle_upload_prefilter' ) ); } public function addSvgMimeType( $mime_types ) { $mime_types['svg'] = self::SVG_MIME; return $mime_types; } public function wp_handle_upload_prefilter( $file ) { if ( self::SVG_MIME !== $file['type'] ) { return $file; } $dirtySVG = file_get_contents( $file['tmp_name'] ); $sanitizer = new \enshrined\svgSanitize\Sanitizer(); $cleanSVG = $sanitizer->sanitize( $dirtySVG ); file_put_contents( $file['tmp_name'], $cleanSVG ); return $file; } /** * @param $data * @param $file * @param $filename * @param $mimes * @param $real_mime * * @return array */ public function wp_check_filetype_and_ext( $data, $file, $filename, $mimes ) { if ( ! $data['ext'] ) { $wp_filetype = wp_check_filetype( $filename, $mimes ); $ext = $wp_filetype['ext']; $type = $wp_filetype['type']; if ( $ext === 'svg' ) { return array( 'ext' => $ext, 'type' => $type, 'proper_filename' => false ); } } return $data; } /** * @param $attachment_data * @param $attachment * @param $meta * * @return mixed */ public function wp_prepare_attachment_for_js( $attachment_data, $attachment, $meta ) { if ( 'image' !== $attachment_data['type'] || 'svg+xml' !== $attachment_data['subtype'] ) { return $attachment_data; } if ( ! class_exists( 'SimpleXMLElement' ) ) { return $attachment_data; } $svg = file_get_contents( get_attached_file( $attachment->ID ) ); if ( ! $svg ) { return $attachment_data; } try { $svg = new \SimpleXMLElement( $svg ); $width = (int) $svg['width']; $height = (int) $svg['height']; } catch ( \Exception $e ) { return $attachment_data; } $src = $url = $attachment_data['url']; $orientation = $height > $width ? 'portrait' : 'landscape'; // Media Gallery $attachment_data['image'] = compact( 'src', 'width', 'height' ); $attachment_data['thumb'] = compact( 'src', 'width', 'height' ); $attachment_data['sizes']['full'] = compact( 'url', 'height', 'width', 'orientation' ); return $attachment_data; } }