189 lines
4.3 KiB
PHP
189 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace ImageOptimization\Classes\Image;
|
|
|
|
use ImageOptimization\Classes\Image\Exceptions\Invalid_Image_Exception;
|
|
use WP_Post;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
class Image {
|
|
public const SIZE_FULL = 'full';
|
|
private const SUPPORTED_MIME_TYPES = [ 'image/jpeg', 'image/png', 'image/webp', 'image/gif', 'image/avif' ];
|
|
|
|
// Used for error messages
|
|
private const SUPPORTED_FORMATS = [ 'jpeg', 'png', 'webp', 'gif', 'avif' ];
|
|
private const MIME_TYPES_CANNOT_BE_OPTIMIZED = [ 'image/avif' ];
|
|
private const FORMATS_CANNOT_BE_OPTIMIZED = [ 'avif' ];
|
|
|
|
protected int $image_id;
|
|
protected $attachment_object;
|
|
|
|
/**
|
|
* Returns attachment post id.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function get_id(): int {
|
|
return $this->image_id;
|
|
}
|
|
|
|
/**
|
|
* Returns file URL for a specific image size.
|
|
*
|
|
* @param string $image_size Image size (e. g. 'full', 'thumbnail', etc)
|
|
* @return string|null
|
|
*/
|
|
public function get_url( string $image_size ): ?string {
|
|
$image_data = wp_get_attachment_image_src( $this->image_id, $image_size );
|
|
|
|
if ( empty( $image_data ) ) {
|
|
return null;
|
|
}
|
|
|
|
return $image_data[0];
|
|
}
|
|
|
|
/**
|
|
* Returns absolute file path for a specific image size.
|
|
*
|
|
* @param string $image_size Image size (e. g. 'full', 'thumbnail', etc)
|
|
* @return string|null
|
|
*/
|
|
public function get_file_path( string $image_size ): ?string {
|
|
if ( 'full' === $image_size ) {
|
|
$path = get_attached_file( $this->image_id );
|
|
return $path ?? null;
|
|
}
|
|
|
|
$path_data = image_get_intermediate_size( $this->image_id, $image_size );
|
|
|
|
if ( empty( $path_data ) ) {
|
|
return null;
|
|
}
|
|
|
|
return sprintf(
|
|
'%s/%s',
|
|
wp_get_upload_dir()['basedir'],
|
|
$path_data['path']
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Returns true if an image marked as optimized.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_optimized(): bool {
|
|
$meta = new Image_Meta( $this->image_id );
|
|
|
|
return $meta->get_status() === Image_Status::OPTIMIZED;
|
|
}
|
|
|
|
/**
|
|
* Returns true if an image can be restored from the backups.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function can_be_restored(): bool {
|
|
$meta = new Image_Meta( $this->image_id );
|
|
|
|
return (bool) count( $meta->get_image_backup_paths() );
|
|
}
|
|
|
|
/**
|
|
* Returns image's mime type.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_mime_type(): string {
|
|
return $this->attachment_object->post_mime_type;
|
|
}
|
|
|
|
/**
|
|
* Returns an original attachment WP_Post object.
|
|
*
|
|
* @return WP_Post
|
|
*/
|
|
public function get_attachment_object(): WP_Post {
|
|
return $this->attachment_object;
|
|
}
|
|
|
|
/**
|
|
* Updates WP_Post fields of the attachment.
|
|
*
|
|
* @return bool True if the post was updated successfully, false otherwise.
|
|
*/
|
|
public function update_attachment( array $update_query ): bool {
|
|
global $wpdb;
|
|
|
|
// Must use $wpdb here as `wp_update_post()` doesn't allow to rewrite guid.
|
|
$result = $wpdb->update(
|
|
$wpdb->posts,
|
|
$update_query,
|
|
[ 'ID' => $this->image_id ]
|
|
);
|
|
|
|
if ( 0 !== $result ) {
|
|
$this->attachment_object = get_post( $this->image_id );
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns the list of mime types supported by the plugin.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public static function get_supported_mime_types(): array {
|
|
return self::SUPPORTED_MIME_TYPES;
|
|
}
|
|
|
|
/**
|
|
* Returns the list of formats types supported by the plugin.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public static function get_supported_formats(): array {
|
|
return self::SUPPORTED_FORMATS;
|
|
}
|
|
|
|
/**
|
|
* Returns the list of mime types that are supported by the plugin, but cannot be optimized
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public static function get_mime_types_cannot_be_optimized(): array {
|
|
return self::MIME_TYPES_CANNOT_BE_OPTIMIZED;
|
|
}
|
|
|
|
/**
|
|
* Returns the list of formats that are supported by the plugin, but cannot be optimized
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public static function get_formats_cannot_be_optimized(): array {
|
|
return self::FORMATS_CANNOT_BE_OPTIMIZED;
|
|
}
|
|
|
|
/**
|
|
* @throws Invalid_Image_Exception
|
|
*/
|
|
public function __construct( int $image_id ) {
|
|
$this->image_id = $image_id;
|
|
$this->attachment_object = get_post( $image_id );
|
|
|
|
if ( ! $this->attachment_object ) {
|
|
throw new Invalid_Image_Exception( "There is no entity with id '$image_id'" );
|
|
}
|
|
|
|
if ( ! wp_attachment_is_image( $this->attachment_object ) ) {
|
|
throw new Invalid_Image_Exception( "Post '$image_id' is not an image" );
|
|
}
|
|
}
|
|
}
|