PluginProbe
Image Optimization – Compress Images and Convert to WebP or AVIF / 1.6.5
Image Optimization – Compress Images and Convert to WebP or AVIF v1.6.5
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 1.6.6 All 32 releases
image-optimization / modules / optimization / classes / validate-image.php

validate-image.php in Image Optimization – Compress Images and Convert to WebP or AVIF 1.6.5, at modules/optimization/classes/validate-image.php

137 lines 4.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace ImageOptimization\Modules\Optimization\Classes;
4
5 use ImageOptimization\Classes\Image\{
6 Exceptions\Invalid_Image_Exception,
7 Image,
8 Image_Meta,
9 WP_Image_Meta,
10 };
11 use ImageOptimization\Classes\File_System\Exceptions\File_System_Operation_Error;
12 use ImageOptimization\Classes\File_System\File_System;
13 use ImageOptimization\Classes\File_Utils;
14 use ImageOptimization\Modules\Optimization\Classes\Exceptions\Image_Validation_Error;
15 use ImageOptimization\Plugin;
16
17 if ( ! defined( 'ABSPATH' ) ) {
18 exit; // Exit if accessed directly.
19 }
20
21 class Validate_Image {
22 public const MAX_FILE_SIZE = 10 * 1024 * 1024;
23 public const MAX_BIG_FILE_SIZE = 25 * 1024 * 1024;
24
25 /**
26 * Returns true if $image_id provided associated with an image that can be optimized.
27 *
28 * @param int $image_id Attachment id.
29 *
30 * @return true
31 * @throws Image_Validation_Error
32 * @throws Invalid_Image_Exception
33 */
34 public static function is_valid( int $image_id ): bool {
35 $attachment_object = get_post( $image_id );
36
37 if ( ! $attachment_object ) {
38 throw new Image_Validation_Error(
39 __( 'Can\'t optimize this file. If the issue persists, Contact Support', 'image-optimization' )
40 );
41 }
42
43 if ( ! wp_attachment_is_image( $attachment_object ) ||
44 ! in_array( $attachment_object->post_mime_type, Image::get_supported_mime_types(), true ) ||
45 (
46 in_array( $attachment_object->post_mime_type, Image::get_mime_types_cannot_be_optimized(), true ) &&
47 ! get_post_meta( $image_id, Image_Meta::IMAGE_OPTIMIZER_METADATA_KEY, true )
48 )
49 ) {
50 throw new Image_Validation_Error( self::prepare_supported_formats_list_error() );
51 }
52
53 if ( ! file_exists( get_attached_file( $image_id ) ) ) {
54 throw new Image_Validation_Error(
55 esc_html__( 'File is missing. Verify the upload', 'image-optimization' )
56 );
57 }
58
59 $wp_meta = new WP_Image_Meta( $image_id );
60
61 try {
62 $image_size = $wp_meta->get_file_size( Image::SIZE_FULL )
63 ?? File_System::size( ( new Image( $image_id ) )->get_file_path( Image::SIZE_FULL ) );
64 } catch ( File_System_Operation_Error $e ) {
65 throw new Image_Validation_Error(
66 esc_html__( 'File is missing. Verify the upload', 'image-optimization' )
67 );
68 }
69
70 if ( $image_size > self::MAX_FILE_SIZE ) {
71 if ( ! self::are_big_files_supported() ) {
72 throw new Image_Validation_Error(
73 sprintf(
74 __( 'File is too large. Max size is %s', 'image-optimization' ),
75 File_Utils::format_file_size( self::MAX_FILE_SIZE, 0 ),
76 )
77 );
78 }
79
80 if ( $image_size > self::MAX_BIG_FILE_SIZE ) {
81 throw new Image_Validation_Error(
82 sprintf(
83 __( 'File is too large. Max size is %s', 'image-optimization' ),
84 File_Utils::format_file_size( self::MAX_BIG_FILE_SIZE, 0 ),
85 )
86 );
87 }
88 }
89
90 return true;
91 }
92
93 /**
94 * Prepares the error message for the unsupported file formats.
95 *
96 * @return string The error message.
97 */
98 private static function prepare_supported_formats_list_error(): string {
99 $formats = Image::get_supported_formats();
100 $formats = array_filter(
101 $formats,
102 fn ( $format ) => ! in_array( $format, Image::get_formats_cannot_be_optimized(), true )
103 );
104 $last_item = strtoupper( array_pop( $formats ) );
105
106 $formats_list = join( ', ', array_map( 'strtoupper', $formats ) );
107
108 return sprintf(
109 __( 'Unsupported file format. Only %1$s, or %2$s are supported', 'image-optimization' ),
110 $formats_list,
111 $last_item
112 );
113 }
114
115 public static function are_big_files_supported(): bool {
116 static $is_allowed = null;
117 $connect_manager = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
118
119 if ( null === $is_allowed ) {
120 if ( ! $connect_manager->connect_instance->is_connected() ) {
121 $is_allowed = false;
122 return $is_allowed;
123 }
124
125 $plan_data = $connect_manager->connect_instance->get_connect_status();
126
127 if ( ! isset( $plan_data->subscription_plan->features->large_upload_allowed ) ) {
128 $is_allowed = false;
129 } else {
130 $is_allowed = (bool) $plan_data->subscription_plan->features->large_upload_allowed;
131 }
132 }
133
134 return $is_allowed;
135 }
136 }
137