Files
medicalalert-web-reloaded/wp/wp-content/plugins/imagify/inc/3rd-party/enable-media-replace/classes/Main.php
2024-09-25 09:25:31 -04:00

153 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Imagify\ThirdParty\EnableMediaReplace;
use Imagify\Traits\InstanceGetterTrait;
use Imagify_Enable_Media_Replace_Deprecated;
use Imagify_Filesystem;
/**
* Compat class for Enable Media Replace plugin.
*
* @since 1.6.9
*/
class Main extends Imagify_Enable_Media_Replace_Deprecated {
use InstanceGetterTrait;
/**
* The media ID.
*
* @var int
* @since 1.9
*/
protected $media_id;
/**
* The process instance for the current attachment.
*
* @var ProcessInterface
* @since 1.9
*/
protected $process;
/**
* The path to the old backup file.
*
* @var string
* @since 1.6.9
*/
protected $old_backup_path;
/**
* List of paths to the old next-gen files.
*
* @var array
* @since 1.9.8
*/
protected $old_nextgen_paths = [];
/**
* Launch the hooks before the files and data are replaced.
*
* @since 1.6.9
* @since 1.9.10 The parameter changed from boolean to array. The method doesnt return anything.
*
* @param array $args An array containing the post ID.
*/
public function init( $args = [] ) {
if ( is_array( $args ) && ! empty( $args['post_id'] ) ) {
$this->media_id = $args['post_id'];
} else {
// Backward compatibility.
$this->media_id = (int) filter_input( INPUT_POST, 'ID' );
$this->media_id = max( 0, $this->media_id );
if ( ! $this->media_id ) {
return;
}
}
// Store the old backup file path.
$this->get_process();
if ( ! $this->process ) {
$this->media_id = 0;
return;
}
$this->old_backup_path = $this->process->get_media()->get_backup_path();
if ( ! $this->old_backup_path ) {
$this->media_id = 0;
return;
}
/**
* Keep track of existing next-gen files.
*
* Whether the user chooses to rename the files or not, we will need to delete the current next-gen files before creating new ones:
* - Rename the files: the old ones must be removed, they are useless now.
* - Do not rename the files: the thumbnails may still get new names because of the suffix containing the image dimensions, which may differ (for example when thumbnails are scaled, not cropped).
* In this last case, the thumbnails with the old dimensions are removed from the drive and from the WPs post meta, so there is no need of keeping orphan next-gen files that would stay on the drive for ever, even after the attachment is deleted from WP.
*/
foreach ( $this->process->get_media()->get_media_files() as $media_file ) {
foreach ( [ 'avif', 'webp' ] as $format ) {
$this->old_nextgen_paths[] = imagify_path_to_nextgen( $media_file['path'], $format );
}
}
// Delete the old backup file and old next-gen files.
add_action( 'imagify_before_auto_optimization', [ $this, 'delete_backup' ] );
add_action( 'imagify_not_optimized_attachment_updated', [ $this, 'delete_backup' ] );
}
/**
* Delete previous backup file and next-gen files.
* This is done after the images have been already replaced by Enable Media Replace.
*
* @since 1.8.4
*
* @param int $media_id The attachment ID.
*/
public function delete_backup( $media_id ) {
if ( ! $this->old_backup_path || ! $this->media_id || $media_id !== $this->media_id ) {
return;
}
$filesystem = Imagify_Filesystem::get_instance();
if ( $filesystem->exists( $this->old_backup_path ) ) {
// Delete old backup file.
$filesystem->delete( $this->old_backup_path );
$this->old_backup_path = false;
}
if ( ! empty( $this->old_nextgen_paths ) ) {
// Delete old next-gen files.
$this->old_nextgen_paths = array_filter( $this->old_nextgen_paths, [ $filesystem, 'exists' ] );
array_map( [ $filesystem, 'delete' ], $this->old_nextgen_paths );
$this->old_nextgen_paths = [];
}
}
/**
* Get the optimization process corresponding to the current media.
*
* @since 1.9
*
* @return ProcessInterface|bool False if invalid.
*/
protected function get_process() {
if ( isset( $this->process ) ) {
return $this->process;
}
$this->process = imagify_get_optimization_process( $this->media_id, 'wp' );
if ( ! $this->process->is_valid() ) {
$this->process = false;
}
return $this->process;
}
}