<?php
namespace Resmush\Controller;
use \reSmushitUI as reSmushitUI;
use \reSmushit as reSmushit;
use \Resmush\ShortPixelLogger\ShortPixelLogger as Log;
if (! defined('ABSPATH')) {
exit; // Exit if accessed directly.
}
class ProcessController
{
protected static $instance;
public static function getInstance()
{
if (is_null(self::$instance))
self::$instance = new static();
return self::$instance;
}
public function __construct()
{
$this->initHooks();
}
protected function initHooks()
{
add_action( 'delete_attachment', array($this,'delete_attachment') );
if(get_option('resmushit_on_upload'))
{
add_action('add_attachment', array($this,'get_meta_id') );
}
$cronController = CronController::getInstance();
$doing_cron = $cronController->doing_cron();
//Automatically optimize images if option is checked
if(get_option('resmushit_on_upload') OR ( isset($_POST['action']) AND ($_POST['action'] === "resmushit_bulk_process_image" OR $_POST['action'] === "resmushit_optimize_single_attachment" )) OR (defined( 'WP_CLI' ) && WP_CLI ) OR ($doing_cron) )
{
add_filter('wp_generate_attachment_metadata', array($this,'process_images'), 10, 2);
}
}
public function unHookProcessor()
{
Log::addTemp('Unhooking Process Filter');
remove_filter('wp_generate_attachment_metadata', array($this,'process_images'), 10, 2 );
}
/**
*
* Delete also -unsmushed file (ie. Original file) when deleting an attachment
*
* @param int postID
* @return none
*/
public function delete_attachment($postid) {
reSmushit::deleteOriginalFile($postid);
}
/**
*
* Make current attachment available
*
* @param attachment object
* @return attachment object
*/
public function get_meta_id($result){
global $attachment_id;
$attachment_id = $result;
}
//Automatically retrieve image attachment ID if option is checked
/**
*
* Call resmush.it optimization for attachments
*
* @param attachment object
* @param boolean preserve original file
* @return attachment object
*/
public function process_images($attachments, $attachment_id) {
$cumulated_original_sizes = 0;
$cumulated_optimized_sizes = 0;
$error = FALSE;
if(reSmushit::getDisabledState($attachment_id))
return $attachments;
if(empty($attachments)) {
Log::addError("Error! The image #$attachment_id has no corresponding file on disk.", 'WARNING');
return $attachments;
}
$fileInfo = pathinfo(get_attached_file( $attachment_id ));
if(!isset($fileInfo['dirname'])) {
Log::addError("Error! Incorrect file provided." . print_r($fileInfo, TRUE), 'WARNING');
return $attachments;
}
$basepath = $fileInfo['dirname'] . '/';
$extension = isset($fileInfo['extension']) ? $fileInfo['extension'] : NULL;
// Optimize only pictures/files accepted by the API
if( !in_array(strtolower($extension), resmushit::authorizedExtensions()) ) {
return $attachments;
}
if(!isset($attachments[ 'file' ])) {
Log::addError("Error! Incorrect image " . print_r($attachments, TRUE), 'WARNING');
return $attachments;
}
$basefile = basename($attachments[ 'file' ]);
$statsObj = reSmushit::optimize($basepath . $basefile,true );
$attachments['filesize'] = $statsObj->dest_size;
$statistics[] = $statsObj;
if(!isset($attachments[ 'sizes' ])) {
Log::addError("Error! Unable to find image sizes." . print_r($attachments, TRUE), 'WARNING');
return $attachments;
}
foreach($attachments['sizes'] as $thumbnail_name => $image_style) {
$statsObj = reSmushit::optimize($basepath . $image_style['file'], FALSE );
// Update Filesize in the WP metadata
if (isset($attachments['sizes'][$thumbnail_name]))
{
$attachments['sizes'][$thumbnail_name]['filesize'] = $statsObj->dest_size;
}
$statistics[] = $statsObj;
}
$count = 0;
foreach($statistics as $stat){
if($stat && !isset($stat->error)){
$cumulated_original_sizes += $stat->src_size;
$cumulated_optimized_sizes += $stat->dest_size;
$count++;
} else {
$error = TRUE;
}
}
if(!$error) {
$optimizations_successful_count = get_option('resmushit_total_optimized');
update_option( 'resmushit_total_optimized', $optimizations_successful_count + $count );
update_post_meta($attachment_id,'resmushed_quality', resmushit::getPictureQualitySetting());
update_post_meta($attachment_id,'resmushed_cumulated_original_sizes', $cumulated_original_sizes);
update_post_meta($attachment_id,'resmushed_cumulated_optimized_sizes', $cumulated_optimized_sizes);
}
update_post_meta( $attachment_id, '_wp_attachment_metadata', $attachments );
return $attachments;
}
} // class