PluginProbe ʕ •ᴥ•ʔ
Robin Image Optimizer – Unlimited Image Optimization, WebP & AVIF / trunk
Robin Image Optimizer – Unlimited Image Optimization, WebP & AVIF vtrunk
2.0.5 trunk 1.3.7 1.4.0 1.4.1 1.4.2 1.4.6 1.5.0 1.5.3 1.5.6 1.5.8 1.6.5 1.6.6 1.6.9 1.7.0 1.7.4 1.8.1 1.8.2 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4
robin-image-optimizer / libs / factory / core / includes / class-factory-options.php
robin-image-optimizer / libs / factory / core / includes Last commit date
activation 5 months ago assets-managment 5 months ago components 5 months ago entities 5 months ago premium 5 months ago updates 5 months ago class-check-compatibility.php 6 months ago class-factory-migrations.php 5 months ago class-factory-notices.php 5 months ago class-factory-options.php 4 months ago class-factory-plugin-abstract.php 5 months ago class-factory-plugin-base.php 5 months ago class-factory-requests.php 5 months ago class-factory-requirements.php 5 months ago functions.php 5 months ago index.php 6 months ago
class-factory-options.php
446 lines
1 <?php
2
3 namespace WBCR\Factory_600;
4
5 // Exit if accessed directly
6 use Exception;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit;
10 }
11
12 /**
13 * Трейт используется для расширения базового класса плагина Wbcr_Factory600_Base, позволяя работать с опциями плагина.
14 *
15 * Этот трейт является оберткой для WordPress функций get_option, get_site_option, update_option, update_site_option,
16 * delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
17 * чтобы класс выполнял эту работу за программиста. В дополнение, трейт содержит методы для полной выгрузки все�
18 опций
19 * плагина, что позволяет при инициализации плагина автоматически выгрузить все существующие опции плагина в объектный
20 * кеш. Все опции, с которыми работает плагин, могут быть отфильтрованы.
21 *
22 * @since 4.0.8 - Добавлен
23 * @package factory-core
24 */
25 trait Options {
26
27 /**
28 * Абстрактный метод, должен быть реализован в классе использующем этот трейт. Метод позволяет получить префикс
29 * плагина для формирования имен опций в базе данны�
30 WordPress. У опций должно быть свое пространство имен,
31 * иначе может быть конфликт с другими плагинами или с сами ядром WordPress.
32 *
33 * @since 4.0.8 - Добавлен
34 * @return string Возвращает префикс плагина. Пример: wbcr_clearfy_
35 */
36 abstract public function getPrefix();
37
38 /**
39 * Выгружает все опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе данны�
40 .
41 * Метод ускоряет работу плагина, если опций очень много.
42 *
43 * Используется только один раз при инициализации плагина.
44 *
45 * @since 4.0.8 - Добавлен
46 */
47 public function loadAllOptions() {
48 global $wpdb;
49
50 $is_option_loaded = wp_cache_get( $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'options' );
51
52 if ( false === $is_option_loaded ) {
53 $result = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->getPrefix()}%'" );
54
55 $options = [];
56
57 if ( ! empty( $result ) ) {
58 wp_cache_add( $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'options' );
59
60 foreach ( $result as $option ) {
61 $value = maybe_unserialize( $option->option_value );
62 $value = $this->normalizeValue( $value );
63
64 wp_cache_add( $option->option_name, $value, $this->getPrefix() . 'options' );
65 $options[ $option->option_name ] = $value;
66 }
67
68 /**
69 * Действие, которое будет выполнено, когда все опции плагина будут выгружены.
70 *
71 * @since 4.0.9 - Добавлен
72 *
73 * @param array $options Ассоциативный массив опций плагина
74 * @param string $plugin_name Имя плагина
75 */
76 do_action( 'wbcr/factory/all_options_loaded', $options, $this->plugin_name );
77 }
78 }
79 }
80
81 /**
82 * Выгружает все сетевые опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе
83 * данны�
84 . Метод ускоряет работу плагина, если опций очень много.
85 *
86 * Используется и работает только в режиме мультисайтов, один раз при инициализации плагина.!
87 *
88 * @since 4.0.8 - Добавлен
89 * @return void
90 */
91 public function loadAllNetworkOptions() {
92 global $wpdb;
93
94 $network_id = (int) get_current_network_id();
95
96 $is_option_loaded = wp_cache_get( $network_id . ':' . $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'network_options' );
97
98 if ( false === $is_option_loaded ) {
99 wp_cache_add_global_groups( [ $this->getPrefix() . 'network_options' ] );
100
101 $result = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->getPrefix()}%'" );
102
103 $options = [];
104 if ( ! empty( $result ) ) {
105 wp_cache_add( $network_id . ':' . $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'network_options' );
106
107 foreach ( $result as $option ) {
108 $value = maybe_unserialize( $option->meta_value );
109 $value = $this->normalizeValue( $value );
110
111 $cache_key = $network_id . ':' . $option->meta_key;
112 wp_cache_add( $cache_key, $value, $this->getPrefix() . 'network_options' );
113 $options[ $option->meta_key ] = $value;
114 }
115
116 /**
117 *
118 * Действие, которое будет выполнено, когда все сетевые опции плагина будут выгружены.
119 *
120 * @since 4.0.9 - Добавлен
121 *
122 * @param array $options Ассоциативный массив опций плагина
123 * @param string $plugin_name Имя плагина
124 */
125 do_action( 'wbcr/factory/all_network_options_loaded', $options, $this->plugin_name );
126 }
127 }
128 }
129
130 /**
131 * Позволяет получить популярную опцию. В случае если плагин установлен для сети (в режиме мультисайтов),
132 * то метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта. Работает
133 * на основе self::getOption и self::getNetworkOption, смотрите полную реализацию в эти�
134 метода�
135 .
136 *
137 * @since 4.0.8 - Добавлен
138 *
139 * @param string $option_name Имя опции без префикса.
140 * @param mixed $default Значение по умолчанию. Если опции нет в базе данны�
141 , будет возвращено это значение. По умолчанию false
142 *
143 * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
144 */
145 public function getPopulateOption( $option_name, $default = false ) {
146 if ( $this->isNetworkActive() ) {
147 $option_value = $this->getNetworkOption( $option_name, $default );
148 } else {
149 $option_value = $this->getOption( $option_name, $default );
150 }
151
152 /**
153 * Фильтр позволяет отфильтровать возвращаемое значение популярной опции.
154 *
155 * @since 4.0.9 - Добавлен
156 *
157 * @param mixed $option_value Значение опции
158 * @param string $option_name Имя опции
159 * @param mixed $default Значение опции по умолчанию
160 */
161 return apply_filters( "wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default );
162 }
163
164 /**
165 * Позволяет получить сетевые опции. Если плагин установлен для сети (в режиме мультисайтов), то
166 * метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта.
167 *
168 * Опция вытаскивается из объектного кеша, после выполнения метода self:loadAllNetworkOptions,
169 * а не напрямую из базы данны�
170 , из-за чего при работе с некоторыми кеширующими плагинами,
171 * может быть странное поведение в работе плагина.
172 *
173 * @since 4.0.8 - Добавлен
174 *
175 * @param string $option_name Имя опции без префикса.
176 * @param mixed $default Значение по умолчанию. Если опции нет в базе данны�
177 , будет возвращено это значение. По умолчанию false
178 *
179 * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
180 */
181 public function getNetworkOption( $option_name, $default = false ) {
182 if ( empty( $option_name ) || ! is_string( $option_name ) ) {
183 throw new Exception( 'Option name must be a string and must not be empty.' );
184 }
185
186 if ( ! is_multisite() ) {
187 return $this->getOption( $option_name, $default );
188 }
189
190 $this->loadAllNetworkOptions();
191
192 $network_id = (int) get_current_network_id();
193 $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
194 $option_value = wp_cache_get( $cache_key, $this->getPrefix() . 'network_options' );
195
196 if ( false === $option_value ) {
197 $option_value = $default;
198 }
199
200 /**
201 * Фильтр позволяет отфильтровать возвращаемое значение сетевой опции.
202 *
203 * @since 4.0.9 - Добавлен
204 *
205 * @param mixed $option_value Значение опции
206 * @param string $option_name Имя опции
207 * @param mixed $default Значение опции по умолчанию
208 * @param int $network_id ID сети
209 */
210
211 return apply_filters( "wbcr/factory/network_option_{$option_name}", $option_value, $option_name, $default, $network_id );
212 }
213
214 /**
215 * Метод позволяет получить опцию для текущего сайта. Опция вытаскивается из объектного кеша, после выполнения метода
216 * self:loadAllOptions, а не напрямую из базы данны�
217 , из-за чего при работе с некоторыми кеширующими плагинами,
218 * может быть странное поведение в работе плагина.
219 *
220 * @since 4.0.0 - Добавлен
221 * @since 4.0.8 - Полностью переделан
222 *
223 * @param string $option_name Имя опции без префикса.
224 * @param mixed $default Значение по умолчанию. Если опции нет в базе данны�
225 , будет возвращено это значение. По умолчанию false
226 *
227 * @return mixed
228 */
229 public function getOption( $option_name, $default = false ) {
230 if ( empty( $option_name ) || ! is_string( $option_name ) ) {
231 throw new Exception( 'Option name must be a string and must not be empty.' );
232 }
233
234 $this->loadAllOptions();
235
236 $option_value = wp_cache_get( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
237
238 if ( false === $option_value ) {
239 $option_value = $default;
240 }
241
242 /**
243 * Фильтр позволяет отфильтровать возвращаемое значение опции сайта.
244 *
245 * @since 4.0.9 - Добавлен
246 *
247 * @param mixed $option_value Значение опции
248 * @param string $option_name Имя опции
249 * @param mixed $default Значение опции по умолчанию
250 */
251
252 return apply_filters( "wbcr/factory/option_{$option_name}", $option_value, $option_name, $default );
253 }
254
255 /**
256 * Позволяет обновить популярную опцию в базе данны�
257 . Если плагин установлен для сети (в режиме мультисайтов), то метод обновляет опцию
258 * только в таблице sitemeta, иначе в таблице options для текущего сайта.
259 *
260 * @param string $option_name Имя опции без префикса.
261 * @param mixed $option_value Значение опции. Может принимать массив или объект.
262 */
263 public function updatePopulateOption( $option_name, $option_value ) {
264 if ( $this->isNetworkActive() ) {
265 $this->updateNetworkOption( $option_name, $option_value );
266 } else {
267 $this->updateOption( $option_name, $option_value );
268 }
269 }
270
271 /**
272 * Обновляет сетевую опцию в БД таблица sitemeta. После успешного обновления опции в базе данны�
273 , метод добавляет опцию в объектный кеш,
274 * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
275 *
276 * @since 4.0.8 - Добавлен
277 *
278 * @param string $option_name Имя опции без префикса.
279 * @param mixed $option_value Значение опции. Может принимать массив или объект.
280 */
281 public function updateNetworkOption( $option_name, $option_value ) {
282 $network_id = (int) get_current_network_id();
283 $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
284 wp_cache_set( $cache_key, $option_value, $this->getPrefix() . 'network_options' );
285
286 update_site_option( $this->getPrefix() . $option_name, $option_value );
287
288 /**
289 * Действие будет выполнено, когда сетевая опция будет обновлена.
290 *
291 * @since 4.0.8 - Добавлен
292 *
293 * @param string $option_name Имя опции без префикса.
294 * @param mixed $option_value Значение опции. Может принимать массив или объект.
295 */
296 do_action( 'wbcr/factory/update_network_option', $option_name, $option_value );
297 }
298
299 /**
300 * Обновляет опцию сайта в БД таблица options. После успешного обновления опции в базе данны�
301 , метод добавляет опцию в объектный кеш,
302 * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
303 *
304 * @since 4.0.0 - Добавлен
305 * @since 4.0.8 - Полностью переделан
306 *
307 * @param string $option_name Имя опции без префикса.
308 * @param mixed $option_value Значение опции. Может принимать массив или объект.
309 *
310 * @return bool
311 */
312 public function updateOption( $option_name, $option_value ) {
313 wp_cache_set( $this->getPrefix() . $option_name, $option_value, $this->getPrefix() . 'options' );
314 $result = update_option( $this->getPrefix() . $option_name, $option_value );
315
316 /**
317 * @since 4.0.8
318 *
319 * @param string $option_name
320 *
321 * @param mixed $option_value
322 */
323 do_action( 'wbcr/factory/update_option', $option_name, $option_value );
324
325 return $result;
326 }
327
328 /**
329 * Позволяет удалять популярную опцию в базе данны�
330 . Если плагин установлен для сети (в режиме мультисайтов), то метод удаляет опцию
331 * только в таблице sitemeta, иначе в таблице options для текущего сайта.
332 *
333 * @since 4.0.0 - Добавлен
334 *
335 * @param string $option_name Имя опции без префикса.
336 */
337 public function deletePopulateOption( $option_name ) {
338 if ( $this->isNetworkActive() ) {
339 $this->deleteNetworkOption( $option_name );
340 } else {
341 $this->deleteOption( $option_name );
342 }
343 }
344
345 /**
346 * Удаляет сетевую.опцию в БД таблица sitemeta, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
347 *
348 * @since 4.0.0 - Добавлен
349 *
350 * @param string $option_name Имя опции без префикса.
351 *
352 * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
353 */
354 public function deleteNetworkOption( $option_name ) {
355 $network_id = (int) get_current_network_id();
356 $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
357 $delete_cache = wp_cache_delete( $cache_key, $this->getPrefix() . 'network_options' );
358
359 $delete_opt1 = delete_site_option( $this->getPrefix() . $option_name );
360
361 return $delete_cache && $delete_opt1;
362 }
363
364 /**
365 * Удаляет опцию сайта в БД таблица options, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
366 *
367 * @since 4.0.0 - Добавлен
368 *
369 * @param string $option_name Имя опции без префикса.
370 *
371 * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
372 */
373 public function deleteOption( $option_name ) {
374 $delete_cache = wp_cache_delete( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
375
376 // todo: удалить, когда большая часть пользователей обновятся до современны�
377 релизов
378 $delete_opt1 = delete_option( $this->getPrefix() . $option_name . '_is_active' );
379 $delete_opt2 = delete_option( $this->getPrefix() . $option_name );
380
381 return $delete_cache && $delete_opt1 && $delete_opt2;
382 }
383
384 /**
385 * Сбрасывает объектный кеш. Может использоваться для перезагрузки опций плагина и WordPress в целом.
386 *
387 * @since 4.0.0 - Добавлен
388 * @return bool Возвращает true, если кеш сброшен успешно, false в случае ошибки.
389 */
390 public function flushOptionsCache() {
391 return wp_cache_flush();
392 }
393
394 /**
395 * Позволяет получить полное имя опции с префиксом. Может быть использовано в те�
396 случая�
397 , где нужно получить
398 * полное имя опции.
399 *
400 * @since 4.0.0 - Добавлен
401 *
402 * @param string $option_name Имя опции без префикса.
403 *
404 * @return null|string Возвращает имя опции с префиксом. Например wbcr_clearfy_{options_name}
405 */
406 public function getOptionName( $option_name ) {
407 $option_name = trim( rtrim( $option_name ) );
408 if ( empty( $option_name ) || ! is_string( $option_name ) ) {
409 return null;
410 }
411
412 return $this->getPrefix() . $option_name;
413 }
414
415 /**
416 * Позволяет нормализовать данные. В некоторы�
417 метода�
418 этого трейта, ожидаются данные определенного типа, чтобы
419 * выполнить различные логические операции. Как раз в этом случае этот метод можно использовать, чтобы привести
420 * все сырые данные в строгий тип. Такое решение позволит избежать ошибок в работе программиста.
421 *
422 * @since 4.0.0 - Добавлен
423 *
424 * @param mixed $data Данные, которые нужно нормализовать.
425 *
426 * @return mixed Возвращает нормализованное значение.
427 * - Если передана строка "true" или "false" вернет булево значение.
428 * - Если передана строка "1" или "0" вернет число.
429 */
430 public function normalizeValue( $data ) {
431 if ( is_string( $data ) ) {
432 $check_string = rtrim( trim( $data ) );
433
434 if ( $check_string == '1' || $check_string == '0' ) {
435 return intval( $data );
436 } elseif ( $check_string === 'false' ) {
437 return false;
438 } elseif ( $check_string === 'true' ) {
439 return true;
440 }
441 }
442
443 return $data;
444 }
445 }
446