converter = $converter ?: new IWAC_Converter(); $this->logs = $logs ?: new IWAC_Logs(); add_action('wp_ajax_iwac_convert_single', array($this, 'convert_single')); add_action('wp_ajax_iwac_convert_image', array($this, 'convert_single')); add_action('wp_ajax_iwac_convert_bulk', array($this, 'convert_bulk')); add_action('wp_ajax_iwac_bulk_convert', array($this, 'convert_bulk')); add_action('wp_ajax_iwac_get_conversion_status', array($this, 'get_conversion_status')); add_action('wp_ajax_iwac_delete_conversion', array($this, 'delete_conversion')); add_action('wp_ajax_iwac_get_logs', array($this, 'get_logs')); add_action('wp_ajax_iwac_clear_logs', array($this, 'clear_logs')); } /** * Validate the current AJAX request. * * @return true */ private function validate_request() { if (! current_user_can('manage_options')) { wp_send_json_error(__('Insufficient permissions.', 'infinico-image-optimizer'), 403); } return true; } /** * Convert single image */ public function convert_single() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); $attachment_id = isset($_POST['attachment_id']) ? absint($_POST['attachment_id']) : 0; $format = isset($_POST['format']) ? sanitize_text_field(wp_unslash($_POST['format'])) : ''; $quality = isset($_POST['quality']) ? absint(wp_unslash($_POST['quality'])) : 0; $replace_original = ! empty($_POST['replace_original']); $keep_original = ! empty($_POST['keep_original']); if (! $attachment_id || ! in_array($format, array('webp', 'avif'), true)) { wp_send_json_error(__('Invalid parameters.', 'infinico-image-optimizer')); } $result = $this->converter->convert_attachment( $attachment_id, $format, array( 'quality' => $quality, 'replace_original' => $replace_original, 'keep_original' => $keep_original, ) ); if (is_wp_error($result)) { wp_send_json_error($result->get_error_message()); } wp_send_json_success(array( 'message' => sprintf(/* translators: Number of images. */ __('Image converted to %s successfully.', 'infinico-image-optimizer'), strtoupper($format)), 'data' => $result, )); } /** * Convert bulk images */ public function convert_bulk() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); $attachment_ids = isset($_POST['attachment_ids']) ? map_deep(wp_unslash($_POST['attachment_ids']), 'sanitize_text_field') : array(); $format = isset($_POST['format']) ? sanitize_text_field(wp_unslash($_POST['format'])) : ''; $quality = isset($_POST['quality']) ? absint(wp_unslash($_POST['quality'])) : 0; $replace_original = ! empty($_POST['replace_original']); $keep_original = ! empty($_POST['keep_original']); $skip_existing = ! empty($_POST['skip_existing']); if (is_string($attachment_ids)) { $attachment_ids = array_filter(array_map('trim', explode(',', $attachment_ids))); } $attachment_ids = array_filter(array_map('absint', (array) $attachment_ids)); if (empty($attachment_ids) || ! in_array($format, array('webp', 'avif'), true)) { wp_send_json_error(__('Invalid parameters.', 'infinico-image-optimizer')); } $results = $this->converter->bulk_convert_with_options( $attachment_ids, $format, array( 'quality' => $quality, 'replace_original' => $replace_original, 'keep_original' => $keep_original, 'skip_existing' => $skip_existing, ) ); $success_count = 0; $error_count = 0; $skipped_count = 0; $errors = array(); foreach ($results as $id => $result) { if (is_array($result) && ! empty($result['skipped'])) { $skipped_count++; } elseif (is_wp_error($result)) { $error_count++; $errors[$id] = $result->get_error_message(); } else { $success_count++; } } wp_send_json_success(array( 'message' => sprintf( /* translators: 1: Successful conversions, 2: Skipped images, 3: Failed conversions. */ __('Bulk conversion completed. %1$d successful, %2$d skipped, %3$d failed.', 'infinico-image-optimizer'), $success_count, $skipped_count, $error_count ), 'success_count' => $success_count, 'skipped_count' => $skipped_count, 'error_count' => $error_count, 'errors' => $errors, )); } /** * Get conversion status */ public function get_conversion_status() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); $attachment_id = isset($_POST['attachment_id']) ? absint($_POST['attachment_id']) : 0; if (! $attachment_id) { wp_send_json_error(__('Invalid attachment ID.', 'infinico-image-optimizer')); } $status = $this->converter->get_conversion_status($attachment_id); wp_send_json_success(array( 'status' => $status, )); } /** * Delete optimized conversion for an attachment. */ public function delete_conversion() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); $attachment_id = isset($_POST['attachment_id']) ? absint($_POST['attachment_id']) : 0; $format = isset($_POST['format']) ? sanitize_text_field(wp_unslash($_POST['format'])) : ''; if (! $attachment_id || ! in_array($format, array('webp', 'avif'), true)) { wp_send_json_error(__('Invalid parameters.', 'infinico-image-optimizer')); } $result = $this->converter->delete_conversion($attachment_id, $format); if (is_wp_error($result)) { wp_send_json_error($result->get_error_message()); } wp_send_json_success( array( 'message' => sprintf(/* translators: Image format, such as WebP or AVIF. */ __('Optimized %s file deleted successfully.', 'infinico-image-optimizer'), strtoupper($format)), ) ); } /** * Return recent log entries. */ public function get_logs() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); wp_send_json_success( array( 'logs' => $this->logs->get_recent_logs(200), ) ); } /** * Clear stored logs. */ public function clear_logs() { if (! check_ajax_referer('iwac_ajax_nonce', 'nonce', false)) { wp_send_json_error(__('Security check failed.', 'infinico-image-optimizer'), 403); } $this->validate_request(); wp_send_json_success( array( 'message' => $this->logs->clear_logs() ? __('Logs cleared successfully.', 'infinico-image-optimizer') : __('There were no logs to clear.', 'infinico-image-optimizer'), ) ); } }