PluginProbe
Search Atlas SEO – OTTO AI SEO Automation for WordPress / 2.6.10
Search Atlas SEO – OTTO AI SEO Automation for WordPress v2.6.10
2.6.26 2.6.25 2.6.24 2.6.23 2.6.22 2.6.21 2.6.20 2.6.19 2.6.18 2.6.17 2.6.16 2.6.15 2.6.14 2.6.13 2.6.12 2.6.11 2.6.10 2.6.9 2.6.8 2.6.7 2.6.6 2.6.5 2.6.4 2.6.3 2.5.23 All 138 releases
metasync / media-optimization / class-media-settings.php

class-media-settings.php in Search Atlas SEO – OTTO AI SEO Automation for WordPress 2.6.10, at media-optimization/class-media-settings.php

131 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Metasync_Media_Settings
4 * Manages settings for the Media Optimization module.
5 * Settings are stored in the plugin's unified option system.
6 *
7 * @package Search Atlas SEO
8 * @copyright Copyright (C) 2021-2025, Search Atlas Group - support@searchatlas.com
9 * @since 2.6.0
10 */
11
12 if (!defined('ABSPATH')) {
13 exit;
14 }
15
16 class Metasync_Media_Settings {
17
18 const OPTION_KEY = 'metasync_media_optimization';
19
20 private static $defaults = [
21 // Image Conversion
22 'enable_conversion' => false,
23 'conversion_format' => 'webp', // 'webp' or 'avif'
24 'conversion_quality' => 82,
25 'conversion_strategy' => 'alongside', // 'replace' or 'alongside'
26 'convert_existing_sizes' => true,
27 // Lazy Loading
28 'enable_lazy_loading' => false,
29 'lazy_load_iframes' => true,
30 'lcp_skip_count' => 2,
31 // Dimension Injection
32 'enable_dimension_injection' => false,
33 // Exclusions
34 'exclude_classes' => '', // Comma-separated CSS classes to exclude
35 'exclude_urls' => '', // Comma-separated URL patterns to exclude
36 ];
37
38 /**
39 * Get merged settings with defaults.
40 */
41 public static function get_settings(): array {
42 $saved = get_option(self::OPTION_KEY, []);
43 return wp_parse_args($saved, self::$defaults);
44 }
45
46 /**
47 * Get default settings.
48 */
49 public static function get_defaults(): array {
50 return self::$defaults;
51 }
52
53 /**
54 * Save settings with sanitization.
55 */
56 public static function save_settings(array $input): bool {
57 $sanitized = self::sanitize($input);
58 return update_option(self::OPTION_KEY, $sanitized);
59 }
60
61 /**
62 * Sanitize and validate settings input.
63 */
64 public static function sanitize(array $input): array {
65 return [
66 'enable_conversion' => !empty($input['enable_conversion']),
67 'conversion_format' => in_array($input['conversion_format'] ?? '', ['webp', 'avif'], true) ? $input['conversion_format'] : 'webp',
68 'conversion_quality' => max(1, min(100, (int) ($input['conversion_quality'] ?? 82))),
69 'conversion_strategy' => in_array($input['conversion_strategy'] ?? '', ['replace', 'alongside'], true) ? $input['conversion_strategy'] : 'alongside',
70 'convert_existing_sizes' => !empty($input['convert_existing_sizes']),
71 'enable_lazy_loading' => !empty($input['enable_lazy_loading']),
72 'lazy_load_iframes' => !empty($input['lazy_load_iframes']),
73 'lcp_skip_count' => max(0, min(10, (int) ($input['lcp_skip_count'] ?? 2))),
74 'enable_dimension_injection' => !empty($input['enable_dimension_injection']),
75 'exclude_classes' => sanitize_text_field($input['exclude_classes'] ?? ''),
76 'exclude_urls' => sanitize_text_field($input['exclude_urls'] ?? ''),
77 ];
78 }
79
80 /**
81 * Check if the server supports AVIF conversion.
82 */
83 public static function supports_avif(): bool {
84 if (extension_loaded('imagick')) {
85 try {
86 $formats = \Imagick::queryFormats('AVIF');
87 return !empty($formats);
88 } catch (\Exception $e) {
89 return false;
90 }
91 }
92 if (function_exists('gd_info')) {
93 $info = gd_info();
94 return !empty($info['AVIF Support']);
95 }
96 return false;
97 }
98
99 /**
100 * Check if the server supports WebP conversion.
101 */
102 public static function supports_webp(): bool {
103 if (extension_loaded('imagick')) {
104 try {
105 $formats = \Imagick::queryFormats('WEBP');
106 return !empty($formats);
107 } catch (\Exception $e) {
108 return false;
109 }
110 }
111 if (function_exists('gd_info')) {
112 $info = gd_info();
113 return !empty($info['WebP Support']);
114 }
115 return false;
116 }
117
118 /**
119 * Get server capability info for display on admin page.
120 */
121 public static function get_server_capabilities(): array {
122 return [
123 'imagick' => extension_loaded('imagick'),
124 'gd' => extension_loaded('gd'),
125 'webp_support' => self::supports_webp(),
126 'avif_support' => self::supports_avif(),
127 'has_library' => extension_loaded('imagick') || extension_loaded('gd'),
128 ];
129 }
130 }
131