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