PluginProbe
Tag Groups is the Advanced Way to Display Your Taxonomy Terms / trunk
Tag Groups is the Advanced Way to Display Your Taxonomy Terms vtrunk
2.2.2 2.2.1 2.2.0 trunk 1.40.0 1.40.2 1.41.0 1.42.1 1.43.0 1.43.1 1.43.10 1.43.10.1 1.43.2 1.43.3 1.43.4 1.43.5 1.43.6 1.43.7 1.43.9 1.44.0 1.44.1 1.44.3 1.44.3.1 2.0.0 2.0.1 All 36 releases
tag-groups / include / helpers / class.options.php

class.options.php in Tag Groups is the Advanced Way to Display Your Taxonomy Terms trunk, at include/helpers/class.options.php

833 lines 29.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * @package Tag Groups
5 * @author Christoph Amthor
6 * @copyright 2018 Christoph Amthor (@ Chatty Mango, chattymango.com)
7 * @license GPL-3.0+
8 */
9
10 // phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace, Squiz.Classes.ValidClassName.NotCamelCaps, PSR1.Methods.CamelCapsMethodName.NotCamelCaps
11 if (! class_exists('TagGroups_Options')) {
12
13 /**
14 * Provides all available options and methods to sanitize their values
15 */
16 class TagGroups_Options
17 {
18 public const TAG_GROUPS_PLUGIN = 1;
19 public const TAG_GROUPS_PREMIUM_PLUGIN = 2;
20 public const INTEGER = 'integer'; // also used for booleans
21 public const STRING = 'string'; // strips whitespace
22 public const STRING_HTML = 'string_html';
23 public const ARRAY_OF_STRINGS = 'array_of_strings';
24 public const ARRAY_OF_STRINGS_HTML = 'array_of_strings_html';
25 public const ARRAY_OF_INTEGERS = 'array_of_integers';
26 public const MIXED = 'MIXED'; // no sanitization available, use only for internally created content
27
28 /**
29 * allowed tags and attributes for sanitizing HTML
30 *
31 * requires PHP 5.6.0
32 */
33 public const ALLOWED_HTML = array(
34 'br' => array(),
35 'b' => array(),
36 'hr' => array(),
37 'i' => array(
38 'class' => array(),
39 ),
40 'strong' => array(),
41 'small' => array(),
42 'a' => array(
43 'href' => array(),
44 'class' => array(),
45 'rel' => array(),
46 'target' => array(),
47 'id' => array(),
48 'style' => array(),
49 ),
50 'header' => array(
51 'class' => array(),
52 'style' => array(),
53 ),
54 'div' => array(
55 'class' => array(),
56 'style' => array(),
57 'id' => array(),
58 ),
59 'p' => array(
60 'class' => array(),
61 'style' => array(),
62 ),
63 'span' => array(
64 'class' => array(),
65 'style' => array(),
66 ),
67 'h1' => array(
68 'class' => array(),
69 'style' => array(),
70 ),
71 'h2' => array(
72 'class' => array(),
73 'style' => array(),
74 ),
75 'h3' => array(
76 'class' => array(),
77 'style' => array(),
78 ),
79 'h4' => array(
80 'class' => array(),
81 'style' => array(),
82 ),
83 'h5' => array(
84 'class' => array(),
85 'style' => array(),
86 ),
87 'h6' => array(
88 'class' => array(),
89 'style' => array(),
90 ),
91 'img' => array(
92 'alt' => array(),
93 'class' => array(),
94 'src' => array(),
95 'height' => array(),
96 'width' => array(),
97 'style' => array(),
98 'id' => array()
99 ),
100 );
101
102 /**
103 * The list of all currently used options. Relevant for deleting, exporting, importing and sanitizing
104 *
105 * @param void
106 * @return array
107 */
108 public static function get_available_options()
109 {
110
111 $available_options = array();
112
113 $available_options['tag_group_taxonomy'] = array(
114 'origin' => self::TAG_GROUPS_PLUGIN,
115 'export' => true,
116 'type' => self::ARRAY_OF_STRINGS
117 );
118 $available_options['term_groups'] = array(
119 'origin' => self::TAG_GROUPS_PLUGIN,
120 'export' => true,
121 'type' => self::ARRAY_OF_INTEGERS
122 );
123 $available_options['term_group_positions'] = array(
124 'origin' => self::TAG_GROUPS_PLUGIN,
125 'export' => true,
126 'type' => self::ARRAY_OF_INTEGERS
127 );
128 $available_options['term_group_labels'] = array(
129 'origin' => self::TAG_GROUPS_PLUGIN,
130 'export' => true,
131 'type' => self::ARRAY_OF_STRINGS
132 );
133 $available_options['tag_group_theme'] = array(
134 'origin' => self::TAG_GROUPS_PLUGIN,
135 'export' => true,
136 'type' => self::STRING
137 );
138 $available_options['tag_group_mouseover'] = array(
139 'origin' => self::TAG_GROUPS_PLUGIN,
140 'export' => true,
141 'type' => self::INTEGER
142 );
143 $available_options['tag_group_collapsible'] = array(
144 'origin' => self::TAG_GROUPS_PLUGIN,
145 'export' => true,
146 'type' => self::INTEGER
147 );
148 $available_options['tag_group_enqueue_jquery'] = array(
149 'origin' => self::TAG_GROUPS_PLUGIN,
150 'export' => true,
151 'type' => self::INTEGER
152 );
153 $available_options['tag_group_shortcode_widget'] = array(
154 'origin' => self::TAG_GROUPS_PLUGIN,
155 'export' => true,
156 'type' => self::INTEGER
157 );
158 $available_options['tag_group_show_filter'] = array(
159 'origin' => self::TAG_GROUPS_PLUGIN,
160 'export' => true,
161 'type' => self::INTEGER
162 );
163 $available_options['tag_group_show_filter_tags'] = array(
164 'origin' => self::TAG_GROUPS_PLUGIN,
165 'export' => true,
166 'type' => self::INTEGER
167 );
168 $available_options['tag_group_enable_group_public_api_access'] = array(
169 'origin' => self::TAG_GROUPS_PLUGIN,
170 'export' => true,
171 'type' => self::INTEGER
172 );
173 $available_options['tag_group_enable_terms_public_api_access'] = array(
174 'origin' => self::TAG_GROUPS_PLUGIN,
175 'export' => true,
176 'type' => self::INTEGER
177 );
178 $available_options['tag_group_html_description'] = array(
179 'origin' => self::TAG_GROUPS_PLUGIN,
180 'export' => true,
181 'type' => self::INTEGER
182 );
183 $available_options['tag_group_admin_notice'] = array(
184 'origin' => self::TAG_GROUPS_PLUGIN,
185 'export' => false,
186 'type' => self::ARRAY_OF_STRINGS_HTML
187 );
188 $available_options['tag_group_shortcode_enqueue_always'] = array(
189 'origin' => self::TAG_GROUPS_PLUGIN,
190 'export' => true,
191 'type' => self::INTEGER
192 );
193 $available_options['tag_group_tags_filter'] = array(
194 'origin' => self::TAG_GROUPS_PLUGIN,
195 'export' => true,
196 'type' => self::ARRAY_OF_INTEGERS
197 );
198 $available_options['tag_group_base_version'] = array(
199 'origin' => self::TAG_GROUPS_PLUGIN,
200 'export' => true,
201 'type' => self::STRING
202 );
203 $available_options['tag_group_base_first_activation_time'] = array(
204 'origin' => self::TAG_GROUPS_PLUGIN,
205 'export' => true,
206 'type' => self::INTEGER
207 );
208 $available_options['tag_group_group_languages'] = array(
209 'origin' => self::TAG_GROUPS_PLUGIN,
210 'export' => true,
211 'type' => self::ARRAY_OF_STRINGS
212 );
213 $available_options['tag_group_sample_page_id'] = array(
214 'origin' => self::TAG_GROUPS_PLUGIN,
215 'export' => false,
216 'type' => self::INTEGER
217 );
218 $available_options['tag_group_used_transient_names'] = array(
219 'origin' => self::TAG_GROUPS_PLUGIN,
220 'export' => false,
221 'type' => self::ARRAY_OF_STRINGS
222 );
223 $available_options['tag_group_verbose_debug'] = array(
224 'origin' => self::TAG_GROUPS_PLUGIN,
225 'export' => false, // false, because import could unintentionally turn it off
226 'type' => self::INTEGER
227 );
228 $available_options['tag_group_multilingual_sync_groups'] = array(
229 'origin' => self::TAG_GROUPS_PLUGIN,
230 'export' => true,
231 'type' => self::INTEGER
232 );
233 $available_options['tag_group_run_term_migration_offset'] = array(
234 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
235 'export' => false,
236 'type' => self::INTEGER
237 );
238
239 /**
240 * Deprecated after 0.36 - don't export
241 */
242 $available_options['tag_group_labels'] = array(
243 'origin' => self::TAG_GROUPS_PLUGIN,
244 'export' => false,
245 'type' => self::ARRAY_OF_STRINGS
246 );
247 $available_options['tag_group_ids'] = array(
248 'origin' => self::TAG_GROUPS_PLUGIN,
249 'export' => false,
250 'type' => self::ARRAY_OF_INTEGERS
251 );
252 $available_options['max_tag_group_id'] = array(
253 'origin' => self::TAG_GROUPS_PLUGIN,
254 'export' => false,
255 'type' => self::INTEGER
256 );
257 $available_options['tag_group_server_side_render'] = array(
258 'origin' => self::TAG_GROUPS_PLUGIN,
259 'export' => true,
260 'type' => self::INTEGER
261 );
262
263 /**
264 * deprecated
265 */
266 $available_options['chatty_mango_cache'] = array(
267 'origin' => self::TAG_GROUPS_PLUGIN,
268 'export' => false,
269 'type' => self::MIXED
270 );
271 $available_options['tag_group_onboarding'] = array(
272 'origin' => self::TAG_GROUPS_PLUGIN,
273 'export' => false,
274 'type' => self::INTEGER
275 );
276
277 /**
278 * Options of the premium plugin; listed here so they survive uninstallation of premium plugin
279 */
280 $available_options['tag_group_meta_box_taxonomy'] = array(
281 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
282 'export' => true,
283 'type' => self::ARRAY_OF_STRINGS
284 );
285 $available_options['tag_group_object_cache'] = array(
286 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
287 'export' => true,
288 'type' => self::INTEGER
289 );
290 $available_options['tag_group_meta_box_add_term'] = array(
291 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
292 'export' => true,
293 'type' => self::INTEGER
294 );
295 $available_options['tag_group_meta_box_change_group'] = array(
296 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
297 'export' => true,
298 'type' => self::INTEGER
299 );
300 $available_options['tag_group_role_edit_groups'] = array(
301 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
302 'export' => true,
303 'type' => self::STRING
304 );
305 $available_options['tag_group_open_all_with_terms'] = array(
306 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
307 'export' => true,
308 'type' => self::INTEGER
309 );
310 $available_options['tag_group_role_mb_override'] = array(
311 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
312 'export' => true,
313 'type' => self::STRING
314 );
315 $available_options['tag_group_hide_tagsdiv'] = array(
316 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
317 'export' => true,
318 'type' => self::INTEGER
319 );
320 $available_options['tag_group_display_groups_under_posts'] = array(
321 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
322 'export' => true,
323 'type' => self::ARRAY_OF_INTEGERS
324 );
325 $available_options['tag_group_display_groups_under_posts_single'] = array(
326 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
327 'export' => true,
328 'type' => self::INTEGER
329 );
330 $available_options['tag_group_display_groups_under_posts_feed'] = array(
331 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
332 'export' => true,
333 'type' => self::INTEGER
334 );
335 $available_options['tag_group_display_groups_under_posts_home'] = array(
336 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
337 'export' => true,
338 'type' => self::INTEGER
339 );
340 $available_options['tag_group_display_groups_under_posts_archive'] = array(
341 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
342 'export' => true,
343 'type' => self::INTEGER
344 );
345 $available_options['tag_group_display_groups_under_posts_title'] = array(
346 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
347 'export' => true,
348 'type' => self::STRING_HTML
349 );
350 $available_options['tag_group_remove_the_post_terms'] = array(
351 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
352 'export' => true,
353 'type' => self::INTEGER
354 );
355 $available_options['tag_group_display_groups_under_posts_priority'] = array(
356 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
357 'export' => true,
358 'type' => self::INTEGER
359 );
360 $available_options['tag_group_display_groups_under_posts_separator'] = array(
361 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
362 'export' => true,
363 'type' => self::STRING_HTML
364 );
365 $available_options['tag_group_premium_version'] = array(
366 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
367 'export' => true,
368 'type' => self::STRING
369 );
370 $available_options['tag_group_premium_first_activation_time'] = array(
371 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
372 'export' => true,
373 'type' => self::INTEGER
374 );
375 $available_options['tag_group_dpf_template'] = array(
376 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
377 'export' => true,
378 'type' => self::STRING_HTML
379 );
380 $available_options['tag_group_add_product_tags_to_attributes'] = array(
381 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
382 'export' => true,
383 'type' => self::INTEGER
384 );
385 $available_options['tag_group_display_groups_under_products_separator'] = array(
386 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
387 'export' => true,
388 'type' => self::STRING_HTML
389 );
390 $available_options['tag_group_remove_the_product_tags'] = array(
391 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
392 'export' => true,
393 'type' => self::INTEGER
394 );
395 $available_options['tag_group_role_edit_tags'] = array(
396 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
397 'export' => true,
398 'type' => self::STRING
399 );
400 $available_options['tag_group_meta_box_include'] = array(
401 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
402 'export' => true,
403 'type' => self::ARRAY_OF_INTEGERS
404 );
405 $available_options['tag_group_meta_box_open_all'] = array(
406 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
407 'export' => true,
408 'type' => self::INTEGER
409 );
410 $available_options['tag_group_new_tag_default_groups'] = array(
411 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
412 'export' => false,
413 'type' => self::ARRAY_OF_INTEGERS
414 );
415 $available_options['tag_group_auto_clear_cache'] = array(
416 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
417 'export' => true,
418 'type' => self::INTEGER
419 );
420 $available_options['tag_groups_per_page'] = array(
421 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
422 'export' => true,
423 'type' => self::ARRAY_OF_INTEGERS
424 );
425 $available_options['tag_group_excerpt_length'] = array(
426 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
427 'export' => true,
428 'type' => self::INTEGER
429 );
430 $available_options['tag_group_excerpt_ellipsis'] = array(
431 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
432 'export' => true,
433 'type' => self::STRING_HTML
434 );
435 $available_options['term_group_parents'] = array(
436 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
437 'export' => true,
438 'type' => self::ARRAY_OF_INTEGERS
439 );
440 $available_options['tag_group_post_terms_with_parents'] = array(
441 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
442 'export' => true,
443 'type' => self::INTEGER
444 );
445 $available_options['tag_group_rebuild_post_counts_offset'] = array(
446 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
447 'export' => false,
448 'type' => self::INTEGER
449 );
450 $available_options['tag_group_run_post_migration_offset'] = array(
451 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
452 'export' => false,
453 'type' => self::INTEGER
454 );
455 $available_options['tag_group_run_fixing_post_meta_offset'] = array(
456 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
457 'export' => false,
458 'type' => self::INTEGER
459 );
460 $available_options['tag_group_meta_box_add_all'] = array(
461 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
462 'export' => true,
463 'type' => self::INTEGER
464 );
465 $available_options['tag_group_meta_box_remove_all'] = array(
466 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
467 'export' => true,
468 'type' => self::INTEGER
469 );
470 $available_options['tag_group_meta_box_staged_loading'] = array(
471 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
472 'export' => true,
473 'type' => self::INTEGER
474 );
475
476 /**
477 * deprecated
478 */
479 $available_options['chatty_mango_packages'] = array(
480 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
481 'export' => false,
482 'type' => self::ARRAY_OF_STRINGS
483 );
484 $available_options['tag_group_latest_version'] = array(
485 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
486 'export' => false,
487 'type' => self::ARRAY_OF_STRINGS
488 );
489 $available_options['tag_group_latest_version_url'] = array(
490 'origin' => self::TAG_GROUPS_PREMIUM_PLUGIN,
491 'export' => false,
492 'type' => self::STRING
493 );
494
495 // should be last:
496 $available_options['tag_group_reset_when_uninstall'] = array(
497 'origin' => self::TAG_GROUPS_PLUGIN,
498 'export' => true,
499 'type' => self::INTEGER
500 );
501
502 return $available_options;
503 }
504
505
506 /**
507 * wrapper for WP's native get_option that checks if option is on whitelist and applies appropriate sanitization
508 *
509 * @param string $option_name
510 * @param mixed $default_value
511 * @return mixed
512 */
513 public static function get_option($option_name, $default_value = null)
514 {
515
516 $option_name = (string) $option_name;
517
518 $available_options = self::get_available_options();
519
520 /**
521 * Check if whitelisted
522 */
523 if (! isset($available_options[ $option_name ]) && substr($option_name, 0, strlen('term_group_labels_')) != 'term_group_labels_') {
524 TagGroups_Error::log('[Tag Groups] Unknown option: %s', $option_name);
525
526 return false;
527 }
528
529 /**
530 * retrieve the saved WP option value
531 */
532 $value = get_option($option_name, $default_value);
533
534 if ($value === false) {
535 return false;
536 }
537
538 if (substr($option_name, 0, strlen('term_group_labels_')) == 'term_group_labels_') {
539 if (is_array($value)) {
540 $sanitized_value = $value;
541
542 array_walk_recursive($sanitized_value, function (&$value) {
543 $value = sanitize_text_field($value);
544 });
545 } else {
546 $sanitized_value = sanitize_text_field($value);
547 }
548 } else {
549 $sanitized_value = false;
550
551 /**
552 * sanitize
553 */
554 switch ($available_options[ $option_name ]['type']) {
555 case self::INTEGER:
556 if ($value === true) {
557 $sanitized_value = 1;
558 } else {
559 $sanitized_value = (int) $value;
560 }
561 break;
562
563 case self::STRING:
564 $sanitized_value = sanitize_text_field($value);
565 break;
566
567 case self::STRING_HTML:
568 $sanitized_value = self::wp_kses($value);
569 break;
570
571 case self::ARRAY_OF_INTEGERS:
572 if (! self::array_or_log($value, $option_name)) {
573 return false;
574 }
575
576 $sanitized_value = $value;
577
578 array_walk_recursive($sanitized_value, function (&$value) {
579 $value = (int) $value;
580 });
581
582 break;
583
584 case self::ARRAY_OF_STRINGS:
585 if (! self::array_or_log($value, $option_name)) {
586 return false;
587 }
588
589 $sanitized_value = $value;
590
591 array_walk_recursive($sanitized_value, function (&$value) {
592 $value = sanitize_text_field($value);
593 });
594
595
596 break;
597
598 case self::ARRAY_OF_STRINGS_HTML:
599 if (! self::array_or_log($value, $option_name)) {
600 return false;
601 }
602
603 $sanitized_value = $value;
604
605 array_walk_recursive($sanitized_value, function (&$value) {
606 $value = TagGroups_Options::wp_kses($value);
607 });
608 break;
609
610 case self::MIXED:
611 // We don't handle this case => not to be used to store user input
612 TagGroups_Error::log('[Tag Groups] MIXED type for %s', $option_name);
613
614 return $value;
615
616 break;
617 }
618 }
619
620 if ($sanitized_value !== $value && ! ( $available_options[ $option_name ]['type'] == self::INTEGER && $value == $sanitized_value )) {
621 TagGroups_Error::verbose_log('[Tag Groups] Sanitizing changed the value for %s: %s->%s', $option_name, $value, $sanitized_value);
622 }
623
624 return $sanitized_value;
625 }
626
627
628 /**
629 * wrapper for WP's native update_option that checks if option is on whitelist and applies appropriate sanitation
630 *
631 * @param string $option_name
632 * @param mixed $value
633 * @return mixed
634 */
635 public static function update_option($option_name, $value, $autoload = true)
636 {
637
638 $option_name = (string) $option_name;
639
640 if (substr($option_name, 0, strlen('term_group_labels_')) == 'term_group_labels_') {
641 if (is_array($value)) {
642 $sanitized_value = $value;
643
644 array_walk_recursive($sanitized_value, function (&$value) {
645 $value = sanitize_text_field($value);
646 });
647 } else {
648 $sanitized_value = sanitize_text_field($value);
649 }
650 } else {
651 $available_options = self::get_available_options();
652
653 /**
654 * Check if whitelisted
655 */
656 if (! isset($available_options[ $option_name ])) {
657 TagGroups_Error::log('[Tag Groups] Unknown option: %s', $option_name);
658
659 return false;
660 }
661
662 $sanitized_value = false;
663
664 /**
665 * sanitize
666 */
667 switch ($available_options[ $option_name ]['type']) {
668 case self::INTEGER:
669 if ($value === true) {
670 $sanitized_value = 1;
671 } elseif ($value === false) {
672 $sanitized_value = 0;
673 } else {
674 $sanitized_value = (int) $value;
675 }
676 break;
677
678 case self::STRING:
679 $sanitized_value = sanitize_text_field($value);
680 break;
681
682 case self::STRING_HTML:
683 $sanitized_value = self::wp_kses($value);
684 break;
685
686 case self::ARRAY_OF_INTEGERS:
687 if (! self::array_or_log($value, $option_name)) {
688 return false;
689 }
690
691 $sanitized_value = $value;
692
693 array_walk_recursive($sanitized_value, function (&$value) {
694 $value = (int) $value;
695 });
696
697 break;
698
699 case self::ARRAY_OF_STRINGS:
700 if (! self::array_or_log($value, $option_name)) {
701 return false;
702 }
703
704 $sanitized_value = $value;
705
706 array_walk_recursive($sanitized_value, function (&$value) {
707 $value = sanitize_text_field($value);
708 });
709 break;
710
711 case self::ARRAY_OF_STRINGS_HTML:
712 if (! self::array_or_log($value, $option_name)) {
713 return false;
714 }
715
716 $sanitized_value = $value;
717
718 array_walk_recursive($sanitized_value, function (&$value) {
719 $value = TagGroups_Options::wp_kses($value);
720 });
721 break;
722
723 case self::MIXED:
724 // We don't handle this case => not to be used to store user input
725 TagGroups_Error::log('[Tag Groups] MIXED type for %s', $option_name);
726
727 $sanitized_value = $value;
728
729 break;
730 }
731 }
732
733 if ($sanitized_value !== $value && ! ( $available_options[ $option_name ]['type'] == self::INTEGER && $value == $sanitized_value )) {
734 TagGroups_Error::verbose_log('[Tag Groups] Sanitizing changed the value for %s', $option_name);
735 }
736
737 /**
738 * save as WP option
739 */
740 return update_option($option_name, $sanitized_value, $autoload);
741 }
742
743
744 /**
745 * Checks if $value is an array, log if not
746 *
747 * @param mixed $value
748 * @param string $option_name
749 * @return void
750 */
751 public static function array_or_log($value, $option_name)
752 {
753
754 if (! is_array($value)) {
755 TagGroups_Error::verbose_log('[Tag Groups] Wrong data type: %s', $option_name);
756
757 return false;
758 }
759
760 return true;
761 }
762
763
764 /**
765 * intval to be used with array_walk_recursive
766 *
767 * to avoid PHP Warning: intval() expects parameter 2 to be int, because array_walk_recursive sends the key as second parameter, but intval expects second parameter to be a integer
768 *
769 * @deprecated 1.40.2
770 * @param mixed $value
771 * @return integer
772 */
773 private static function intval_one_parameter($value)
774 {
775
776 return (int) $value;
777 }
778
779
780 /**
781 * call wp_kses with extended parameters
782 *
783 * @param string $unsanitized_html
784 * @return string
785 */
786 public static function wp_kses($unsanitized_html)
787 {
788
789 add_filter('safe_style_css', function ($styles) {
790 $styles[] = 'position';
791 $styles[] = 'bottom';
792 $styles[] = 'top';
793 $styles[] = 'left';
794 $styles[] = 'right';
795 return $styles;
796 });
797
798 return wp_kses($unsanitized_html, array_merge(wp_kses_allowed_html('post'), self::ALLOWED_HTML));
799 }
800
801
802 /**
803 * Deletes all registered options
804 *
805 * @return void
806 */
807 public static function delete_all()
808 {
809
810 $option_count = 0;
811
812 $available_options = TagGroups_Options::get_available_options();
813
814 if (is_array(TagGroups_Options::get_option('tag_group_group_languages', false))) {
815 foreach (TagGroups_Options::get_option('tag_group_group_languages') as $language) {
816 if (delete_option('term_group_labels_' . $language)) {
817 $option_count++;
818 }
819 }
820 }
821
822 foreach ($available_options as $key => $value) {
823 if (delete_option($key)) {
824 $option_count++;
825 }
826 }
827
828 return $option_count;
829 }
830 }
831
832 }
833