<?php namespace ShortPixel\Controller\View; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log; use ShortPixel\Helper\UiHelper as UiHelper; use ShortPixel\Helper\UtilHelper as UtilHelper; use ShortPixel\Controller\OptimizeController as OptimizeController; use ShortPixel\Controller\ErrorController as ErrorController; use ShortPixel\Model\File\FileModel as FileModel; use ShortPixel\Helper\DownloadHelper as DownloadHelper; // Future contoller for the edit media metabox view. class EditMediaViewController extends \ShortPixel\ViewController { protected $template = 'view-edit-media'; // protected $model = 'image'; protected $post_id; protected $legacyViewObj; protected $imageModel; protected $hooked; protected static $instance; public function __construct() { parent::__construct(); } protected function loadHooks() { add_action( 'add_meta_boxes_attachment', array( $this, 'addMetaBox') ); $this->hooked = true; } public function load() { if (! $this->hooked) $this->loadHooks(); $fs = \wpSPIO()->filesystem(); $fs->startTrustedMode(); } public function addMetaBox() { add_meta_box( 'shortpixel_info_box', // this is HTML id of the box on edit screen __('ShortPixel Info', 'shortpixel-image-optimiser'), // title of the box array( $this, 'doMetaBox'), // function to be called to display the info null,//, // on which edit screen the box should appear 'side'//'normal', // part of page where the box should appear //'default' // priority of the box ); } public function dometaBox($post) { $this->post_id = $post->ID; $this->view->debugInfo = array(); $this->view->id = $this->post_id; $this->view->list_actions = ''; $fs = \wpSPIO()->filesystem(); $this->imageModel = $fs->getMediaImage($this->post_id); // Asking for something non-existing. if ($this->imageModel === false) { $this->view->status_message = __('File Error. This could be not an image or the file is missing', 'shortpixel-image-optimiser'); $this->loadView(); return false; } $this->view->status_message = null; $this->view->text = UiHelper::getStatusText($this->imageModel); $this->view->list_actions = UiHelper::getListActions($this->imageModel); if ( count($this->view->list_actions) > 0) $this->view->list_actions = UiHelper::renderBurgerList($this->view->list_actions, $this->imageModel); else $this->view->list_actions = ''; //$this->imageModel->cancelUserExclusions(); $this->view->actions = UiHelper::getActions($this->imageModel); $this->view->stats = $this->getStatistics(); if (! $this->userIsAllowed) { $this->view->actions = array(); $this->view->list_actions = ''; } if(true === \wpSPIO()->env()->is_debug ) { $this->view->debugInfo = $this->getDebugInfo(); } $this->loadView(); } protected function getStatusMessage() { return UIHelper::renderSuccessText($this->imageModel); } protected function getStatistics() { //$data = $this->data; $stats = array(); $imageObj = $this->imageModel; $did_keepExif = $imageObj->getMeta('did_keepExif'); $did_convert = $imageObj->getMeta()->convertMeta()->isConverted(); $resize = $imageObj->getMeta('resize'); // Not optimized, not data. if (! $imageObj->isOptimized()) return array(); if ($did_keepExif) $stats[] = array(__('EXIF kept', 'shortpixel-image-optimiser'), ''); elseif ( $did_keepExif === false) { $stats[] = array(__('EXIF removed', 'shortpixel-image-optimiser'), ''); } if (true === $did_convert ) { $ext = $imageObj->getMeta()->convertMeta()->getFileFormat(); $stats[] = array( sprintf(__('Converted from %s','shortpixel-image-optimiser'), $ext), ''); } elseif (false !== $imageObj->getMeta()->convertMeta()->didTry()) { $ext = $imageObj->getMeta()->convertMeta()->getFileFormat(); $error = $imageObj->getMeta()->convertMeta()->getError(); // error code. $stats[] = array(UiHelper::getConvertErrorReason($error, $ext), ''); } if ($resize == true) { $from = $imageObj->getMeta('originalWidth') . 'x' . $imageObj->getMeta('originalHeight'); $to = $imageObj->getMeta('resizeWidth') . 'x' . $imageObj->getMeta('resizeHeight'); $type = ($imageObj->getMeta('resizeType') !== null) ? '(' . $imageObj->getMeta('resizeType') . ')' : ''; $stats[] = array(sprintf(__('Resized %s %s to %s'), $type, $from, $to), ''); } $tsOptimized = $imageObj->getMeta('tsOptimized'); if ($tsOptimized !== null) $stats[] = array(__("Optimized on :", 'shortpixel-image-optimiser') . "<br /> ", UiHelper::formatTS($tsOptimized) ); if ($imageObj->isOptimized()) { $stats[] = array( sprintf(__('%s %s Read more about theses stats %s ', 'shortpixel-image-optimiser'), ' <p><img alt=' . esc_html('Info Icon', 'shortpixel-image-optimiser') . ' src=' . esc_url( wpSPIO()->plugin_url('res/img/info-icon.png' )) . ' style="margin-bottom: -4px;"/>', '<a href="https://shortpixel.com/knowledge-base/article/553-the-stats-from-the-shortpixel-column-in-the-media-library-explained" target="_blank">', '</a></p>'), ''); } return $stats; } protected function getDebugInfo() { if(! \wpSPIO()->env()->is_debug ) { return array(); } $meta = \wp_get_attachment_metadata($this->post_id); $fs = \wpSPIO()->filesystem(); $imageObj = $this->imageModel; if ($imageObj->isProcessable()) { $optimizeData = $imageObj->getOptimizeData(); $urls = $optimizeData['urls']; } $thumbnails = $imageObj->get('thumbnails'); $processable = ($imageObj->isProcessable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $imageObj->getReason('processable') . ')'; $anyFileType = ($imageObj->isProcessableAnyFileType()) ? '<span class="green">Yes</span>' : '<span class="red">No</span>'; $restorable = ($imageObj->isRestorable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $imageObj->getReason('restorable') . ')'; $hasrecord = ($imageObj->hasDBRecord()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> '; $debugInfo = array(); $debugInfo[] = array(__('URL (get attachment URL)', 'shortpixel_image_optiser'), wp_get_attachment_url($this->post_id)); $debugInfo[] = array(__('File (get attached)'), get_attached_file($this->post_id)); if ($imageObj->is_virtual()) { $virtual = $imageObj->get('virtual_status'); if($virtual == FileModel::$VIRTUAL_REMOTE) $vtext = 'Remote'; elseif($virtual == FileModel::$VIRTUAL_STATELESS) $vtext = 'Stateless'; else $vtext = 'Not set'; $debugInfo[] = array(__('Is Virtual: ') . $vtext, $imageObj->getFullPath() ); } $debugInfo[] = array(__('Size and Mime (ImageObj)'), $imageObj->get('width') . 'x' . $imageObj->get('height'). ' (' . $imageObj->get('mime') . ')'); $debugInfo[] = array(__('Status (ShortPixel)'), $imageObj->getMeta('status') . ' ' ); $debugInfo[] = array(__('Processable'), $processable); $debugInfo[] = array(__('Avif/Webp needed'), $anyFileType); $debugInfo[] = array(__('Restorable'), $restorable); $debugInfo[] = array(__('Record'), $hasrecord); if ($imageObj->getMeta()->convertMeta()->didTry()) { $debugInfo[] = array(__('Converted'), ($imageObj->getMeta()->convertMeta()->isConverted() ?'<span class="green">Yes</span>' : '<span class="red">No</span> ')); $debugInfo[] = array(__('Checksum'), $imageObj->getMeta()->convertMeta()->didTry()); $debugInfo[] = array(__('Error'), $imageObj->getMeta()->convertMeta()->getError()); } $debugInfo[] = array(__('WPML Duplicates'), json_encode($imageObj->getWPMLDuplicates()) ); if ($imageObj->getParent() !== false) { $debugInfo[] = array(__('WPML duplicate - Parent: '), $imageObj->getParent()); } if (isset($urls)) { $debugInfo[] = array(__('To Optimize URLS'), $urls); } if (isset($optimizeData)) { $debugInfo[] = array(__('Optimize Data'), $optimizeData); $optControl = new optimizeController(); $q = $optControl->getQueue($imageObj->get('type')); $debugInfo[] = array(__('Image to Queue'), $q->_debug_imageModelToQueue($imageObj) ); } $debugInfo['imagemetadata'] = array(__('ImageModel Metadata (ShortPixel)'), $imageObj); $debugInfo[] = array('', '<hr>'); $debugInfo['wpmetadata'] = array(__('WordPress Get Attachment Metadata'), $meta ); $debugInfo[] = array('', '<hr>'); if ($imageObj->hasBackup()) $backupFile = $imageObj->getBackupFile(); else { $backupFile = $fs->getFile($fs->getBackupDirectory($imageObj) . $imageObj->getBackupFileName()); } $debugInfo[] = array(__('Backup Folder'), (string) $backupFile->getFileDir() ); if ($imageObj->hasBackup()) $backupText = __('Backup File :'); else { $backupText = __('Target Backup File after optimization (no backup) '); } $debugInfo[] = array( $backupText, (string) $backupFile . '(' . UiHelper::formatBytes($backupFile->getFileSize()) . ')' ); $debugInfo[] = array(__("No Main File Backup Available"), ''); if ($imageObj->getMeta()->convertMeta()->isConverted()) { $convertedBackup = ($imageObj->hasBackup(array('forceConverted' => true))) ? '<span class="green">Yes</span>' : '<span class="red">No</span>'; $backup = $imageObj->getBackupFile(array('forceConverted' => true)); $debugInfo[] = array('Has converted backup', $convertedBackup); if (is_object($backup)) $debugInfo[] = array('Backup: ', $backup->getFullPath() ); } if ($or = $imageObj->hasOriginal()) { $original = $imageObj->getOriginalFile(); $debugInfo[] = array(__('Has Original File: '), $original->getFullPath() . '(' . UiHelper::formatBytes($original->getFileSize()) . ')'); $orbackup = $original->getBackupFile(); if ($orbackup) $debugInfo[] = array(__('Has Backup Original Image'), $orbackup->getFullPath() . '(' . UiHelper::formatBytes($orbackup->getFileSize()) . ')'); $debugInfo[] = array('', '<hr>'); } if (! isset($meta['sizes']) ) { $debugInfo[] = array('', __('Thumbnails were not generated', 'shortpixel-image-optimiser')); } else { foreach($thumbnails as $thumbObj) { $size = $thumbObj->get('size'); $display_size = ucfirst(str_replace("_", " ", $size)); //$thumbObj = $imageObj->getThumbnail($size); if ($thumbObj === false) { $debugInfo[] = array(__('Thumbnail not found / loaded: ', 'shortpixel-image-optimiser'), $size ); continue; } $url = $thumbObj->getURL(); //$fs->pathToURL($thumbObj); //wp_get_attachment_image_src($this->post_id, $size); $filename = $thumbObj->getFullPath(); $backupFile = $thumbObj->getBackupFile(); if ($thumbObj->hasBackup()) { $backup = $backupFile->getFullPath(); $backupText = __('Backup File :'); } else { $backupFile = $fs->getFile($fs->getBackupDirectory($thumbObj) . $thumbObj->getBackupFileName()); $backup = $backupFile->getFullPath(); $backupText = __('Target Backup File after optimization (no backup) '); } $width = $thumbObj->get('width'); $height = $thumbObj->get('height'); $processable = ($thumbObj->isProcessable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $thumbObj->getReason('processable') . ')'; $restorable = ($thumbObj->isRestorable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $thumbObj->getReason('restorable') . ')'; $hasrecord = ($thumbObj->hasDBRecord()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> '; $dbid = $thumbObj->getMeta('databaseID'); $debugInfo[] = array('', "<div class='$size previewwrapper'><img src='" . $url . "'><p class='label'> <b>URL:</b> $url ( $display_size - $width X $height ) <br><b>FileName:</b> $filename <br> <b> $backupText </b> $backup </p> <p><b>Processable: </b> $processable <br> <b>Restorable:</b> $restorable <br> <b>Record:</b> $hasrecord ($dbid) </p> <hr></div>"); } } return $debugInfo; } } // controller .