oont-contents/plugins/wp-optimize/webp/class-wp-optimize-webp-images.php
2025-02-10 13:57:45 +01:00

141 lines
3.2 KiB
PHP

<?php
if (!defined('WPO_VERSION')) die('No direct access allowed');
if (!class_exists('WP_Optimize_WebP_Images')) :
class WP_Optimize_WebP_Images {
private $directory = '';
private $filename = '';
private $original_extension = '';
private $webp_extension = '.webp';
private $meta = false;
private $sizes = array();
private $images = array();
/**
* Constructor
*/
private function __construct() {
add_action('delete_attachment', array($this, 'delete_related_images'), 10, 1);
}
/**
* Returns singleton instance
*
* @return WP_Optimize_WebP_Images
*/
public static function get_instance() {
static $instance = null;
if (null === $instance) {
$instance = new WP_Optimize_WebP_Images();
}
return $instance;
}
/**
* Deletes related image sizes and alternate webp format images
*
* @param int $attachment_id
* @return void
*/
public function delete_related_images($attachment_id) {
$this->set_meta($attachment_id);
$this->set_file_info_properties($attachment_id);
$this->set_sizes();
$this->set_images();
$this->delete_images();
$this->reset();
}
/**
* Sets meta property with attachment metadata
*
* @param int $attachment_id
* @return void
*/
private function set_meta($attachment_id) {
$this->meta = wp_get_attachment_metadata($attachment_id);
}
/**
* Sets file information properties
*
* @param int $attachment_id
* @return void
*/
private function set_file_info_properties($attachment_id) {
$file_path = get_attached_file($attachment_id);
$file_path_info = pathinfo($file_path);
$this->filename = $file_path_info['filename'];
$this->original_extension = '.' . $file_path_info['extension'];
$file = isset($this->meta['file']) ? $this->meta['file'] : '';
$basename = $file_path_info['basename'];
$sub_directory = '';
if (!empty($file)) {
$sub_directory = str_replace($basename, '', $file);
}
$uploads = wp_get_upload_dir();
$this->directory = $uploads['basedir'] . '/' . $sub_directory;
}
/**
* Returns all available image sizes for the given attachment id
*/
private function set_sizes() {
if (false !== $this->meta) {
$this->sizes = isset($this->meta['sizes']) ? $this->meta['sizes'] : array();
}
}
/**
* Sets images property
*
* @return void
*/
private function set_images() {
$webp_format = $this->directory . $this->filename . $this->original_extension . $this->webp_extension;
$this->images[] = $webp_format;
foreach ($this->sizes as $size) {
$original_format = $this->directory . $this->filename . '-' . $size['width'] . 'x' . $size['height'] . $this->original_extension;
$this->images[] = $original_format;
$webp_format = $this->directory . preg_replace('/-scaled$/', '', $this->filename) . '-' . $size['width'] . 'x' . $size['height'] . $this->original_extension . $this->webp_extension;
$this->images[] = $webp_format;
}
}
/**
* Delete related images
*
* @return void
*/
private function delete_images() {
foreach ($this->images as $image) {
wp_delete_file($image);
}
}
/**
* Reset class property values
*/
private function reset() {
$this->directory = '';
$this->filename = '';
$this->original_extension = '';
$this->meta = false;
$this->sizes = array();
$this->images = array();
}
}
endif;