PluginProbe
Image Optimizer – Compress Images and Convert to WebP or AVIF / 1.7.7
Image Optimizer – Compress Images and Convert to WebP or AVIF v1.7.7
1.7.7 1.7.6 1.7.5 1.7.4 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.2.0 1.2.1 1.3.0 1.4.0 1.4.1 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 All 33 releases
← All changes | modules/optimization/classes/validate-image.php +80 -26 1.5.01.7.7 View file →
@@ -5,14 +5,15 @@
5 5 use ImageOptimization\Classes\Image\{
6 6 Exceptions\Invalid_Image_Exception,
7 7 Image,
8 8 Image_Meta,
9 - WP_Image_Meta
9 + WP_Image_Meta,
10 10 };
11 11 use ImageOptimization\Classes\File_System\Exceptions\File_System_Operation_Error;
12 12 use ImageOptimization\Classes\File_System\File_System;
13 13 use ImageOptimization\Classes\File_Utils;
14 14 use ImageOptimization\Modules\Optimization\Classes\Exceptions\Image_Validation_Error;
15 +use ImageOptimization\Plugin;
15 16
16 17 if ( ! defined( 'ABSPATH' ) ) {
17 18 exit; // Exit if accessed directly.
18 19 }
@@ -18,8 +19,9 @@
18 19 }
19 20
20 21 class Validate_Image {
21 22 public const MAX_FILE_SIZE = 10 * 1024 * 1024;
23 + public const MAX_BIG_FILE_SIZE = 25 * 1024 * 1024;
22 24
23 25 /**
24 26 * Returns true if $image_id provided associated with an image that can be optimized.
25 27 *
@@ -33,14 +35,13 @@
33 35 $attachment_object = get_post( $image_id );
34 36
35 37 if ( ! $attachment_object ) {
36 38 throw new Image_Validation_Error(
37 - __( 'Can\'t optimize this file. If the issue persists, Contact Support', 'image-optimization' )
39 + esc_html__( 'Can\'t optimize this file. If the issue persists, Contact Support', 'image-optimization' )
38 40 );
39 41 }
40 42
41 - if (
42 - ! wp_attachment_is_image( $attachment_object ) ||
43 + if ( ! wp_attachment_is_image( $attachment_object ) ||
43 44 ! in_array( $attachment_object->post_mime_type, Image::get_supported_mime_types(), true ) ||
44 45 (
45 46 in_array( $attachment_object->post_mime_type, Image::get_mime_types_cannot_be_optimized(), true ) &&
46 47 ! get_post_meta( $image_id, Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY, true )
@@ -45,9 +46,9 @@
45 46 in_array( $attachment_object->post_mime_type, Image::get_mime_types_cannot_be_optimized(), true ) &&
46 47 ! get_post_meta( $image_id, Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY, true )
47 48 )
48 49 ) {
49 - throw new Image_Validation_Error( self::prepare_supported_formats_list_error() );
50 + throw new Image_Validation_Error( esc_html( self::prepare_supported_formats_list_error() ) );
50 51 }
51 52
52 53 if ( ! file_exists( get_attached_file( $image_id ) ) ) {
53 54 throw new Image_Validation_Error(
@@ -54,28 +55,10 @@
54 55 esc_html__( 'File is missing. Verify the upload', 'image-optimization' )
55 56 );
56 57 }
57 58
58 - $wp_meta = new WP_Image_Meta( $image_id );
59 + self::validate_file_size( $image_id );
59 60
60 - try {
61 - $image_size = $wp_meta->get_file_size( Image::SIZE_FULL )
62 - ?? File_System::size( ( new Image( $image_id ) )->get_file_path( Image::SIZE_FULL ) );
63 - } catch ( File_System_Operation_Error $e ) {
64 - throw new Image_Validation_Error(
65 - esc_html__( 'File is missing. Verify the upload', 'image-optimization' )
66 - );
67 - }
68 -
69 - if ( $image_size > self::MAX_FILE_SIZE ) {
70 - throw new Image_Validation_Error(
71 - sprintf(
72 - __( 'File is too large. Max size is %s', 'image-optimization' ),
73 - File_Utils::format_file_size( self::MAX_FILE_SIZE, 0 ),
74 - )
75 - );
76 - }
77 -
78 61 return true;
79 62 }
80 63
81 64 /**
@@ -86,9 +69,9 @@
86 69 private static function prepare_supported_formats_list_error(): string {
87 70 $formats = Image::get_supported_formats();
88 71 $formats = array_filter(
89 72 $formats,
90 - fn ( $format) => ! in_array( $format, Image::get_formats_cannot_be_optimized(), true )
73 + fn ( $format ) => ! in_array( $format, Image::get_formats_cannot_be_optimized(), true )
91 74 );
92 75 $last_item = strtoupper( array_pop( $formats ) );
93 76
94 77 $formats_list = join( ', ', array_map( 'strtoupper', $formats ) );
@@ -93,10 +76,81 @@
93 76
94 77 $formats_list = join( ', ', array_map( 'strtoupper', $formats ) );
95 78
96 79 return sprintf(
97 - __( 'Wrong file format. Only %1$s, or %2$s are accepted', 'image-optimization' ),
80 + __( 'Unsupported file format. Only %1$s, or %2$s are supported', 'image-optimization' ),
98 81 $formats_list,
99 82 $last_item
100 83 );
84 + }
85 +
86 + /**
87 + * @throws Invalid_Image_Exception
88 + * @throws Image_Validation_Error
89 + */
90 + public static function validate_file_size( int $image_id, string $image_size = Image::SIZE_FULL ) {
91 + try {
92 + $wp_meta = new WP_Image_Meta( $image_id );
93 + $image_size = $wp_meta->get_file_size( $image_size )
94 + ?? File_System::size( ( new Image( $image_id ) )->get_file_path( $image_size ) );
95 + } catch ( File_System_Operation_Error $e ) {
96 + throw new Image_Validation_Error(
97 + esc_html__( 'File is missing. Verify the upload', 'image-optimization' )
98 + );
99 + }
100 +
101 + if ( $image_size > self::MAX_FILE_SIZE ) {
102 + if ( ! self::are_big_files_supported() ) {
103 + throw new Image_Validation_Error(
104 + esc_html(
105 + sprintf(
106 + __( 'File is too large. Max size is %s', 'image-optimization' ),
107 + File_Utils::format_file_size( self::MAX_FILE_SIZE, 0 ),
108 + )
109 + )
110 + );
111 + }
112 +
113 + if ( $image_size > self::MAX_BIG_FILE_SIZE ) {
114 + throw new Image_Validation_Error(
115 + esc_html(
116 + sprintf(
117 + __( 'File is too large. Max size is %s', 'image-optimization' ),
118 + File_Utils::format_file_size( self::MAX_BIG_FILE_SIZE, 0 ),
119 + )
120 + )
121 + );
122 + }
123 + }
124 + }
125 +
126 + /**
127 + * Returns the max file size allowed by the current plan.
128 + *
129 + * @return int File size in bytes.
130 + */
131 + public static function get_max_file_size(): int {
132 + return self::are_big_files_supported() ? self::MAX_BIG_FILE_SIZE : self::MAX_FILE_SIZE;
133 + }
134 +
135 + public static function are_big_files_supported(): bool {
136 + static $is_allowed = null;
137 + $connect_manager = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
138 +
139 + if ( null === $is_allowed ) {
140 + if ( ! $connect_manager->connect_instance->is_connected() ) {
141 + $is_allowed = false;
142 + return $is_allowed;
143 + }
144 +
145 + $plan_data = $connect_manager->connect_instance->get_connect_status();
146 +
147 + if ( ! isset( $plan_data->subscription_plan->features->large_upload_allowed ) ) {
148 + $is_allowed = false;
149 + } else {
150 + $is_allowed = (bool) $plan_data->subscription_plan->features->large_upload_allowed;
151 + }
152 + }
153 +
154 + return $is_allowed;
101 155 }
102 156 }