PluginProbe ʕ •ᴥ•ʔ
Widget Options – Advanced Conditional Visibility for Gutenberg Blocks & Classic Widgets / 3.9.6
Widget Options – Advanced Conditional Visibility for Gutenberg Blocks & Classic Widgets v3.9.6
4.2.5 4.2.4 trunk 3.7.10 3.7.11 3.7.12 3.7.13 3.7.14 3.7.2 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.8 3.8.1 3.8.10 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.8.8 3.8.9 3.8.9.1 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.5.1 4.0.6 4.0.6.1 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.2 4.1.3 4.2.0 4.2.1 4.2.2 4.2.3
widget-options / includes / widgets / display.php
widget-options / includes / widgets Last commit date
option-tabs 2 years ago display.php 2 years ago extras.php 2 years ago widgets.php 2 years ago
display.php
554 lines
1 <?php
2
3 /**
4 * Handles Front-end Display
5 *
6 * @copyright Copyright (c) 2015, Jeffrey Carandang
7 * @since 1.0
8 */
9 // Exit if accessed directly
10 if (!defined('ABSPATH')) exit;
11
12 /**
13 * Handles widget_display_callback filter
14 *
15 * @since 1.0
16 * @global $widget_options
17 * @return $instance
18 */
19
20 //check if function exists
21 if (!function_exists('widgetopts_display_callback')) :
22 function widgetopts_display_callback($instance, $widget, $args)
23 {
24 global $widget_options, $current_user;
25
26 // WPML FIX
27 $hasWPML = has_filter('wpml_current_language');
28 $hasWPML = (function_exists('pll_the_languages')) ? false : $hasWPML;
29 $default_language = $hasWPML ? apply_filters('wpml_default_language', NULL) : false;
30
31 $hidden = false;
32 $opts = (isset($instance['extended_widget_opts-' . $widget->id])) ? $instance['extended_widget_opts-' . $widget->id] : array();
33 $visibility = array('show' => array(), 'hide' => array());
34
35 //wordpress pages
36 $visibility = isset($opts['visibility']) ? $opts['visibility'] : array();
37 $visibility_opts = isset($opts['visibility']['options']) ? $opts['visibility']['options'] : 'hide';
38
39 $is_misc = ('activate' == $widget_options['visibility'] && isset($widget_options['settings']['visibility']) && isset($widget_options['settings']['visibility']['misc'])) ? true : false;
40 $is_types = ('activate' == $widget_options['visibility'] && isset($widget_options['settings']['visibility']) && isset($widget_options['settings']['visibility']['post_type'])) ? true : false;
41 $is_tax = ('activate' == $widget_options['visibility'] && isset($widget_options['settings']['visibility']) && isset($widget_options['settings']['visibility']['taxonomies'])) ? true : false;
42
43 $isWooPage = false;
44 if (class_exists('WooCommerce')) {
45 $wooPageID = 0;
46
47 $wooPageID = (is_shop()) ? get_option('woocommerce_shop_page_id') : $wooPageID;
48 if ($wooPageID) {
49 $isWooPage = true;
50
51 $visibility['pages'] = !empty($visibility['pages']) ? $visibility['pages'] : [];
52 if ($visibility_opts == 'hide' && (array_key_exists($wooPageID, $visibility['pages']) || in_array($wooPageID, $visibility['pages']))) {
53 $hidden = true; //hide if exists on hidden pages
54 } elseif ($visibility_opts == 'show' && !array_key_exists($wooPageID, $visibility['pages']) && !in_array($wooPageID, $visibility['pages'])) {
55 $hidden = true; //hide if doesn't exists on visible pages
56 }
57
58 //do return to bypass other conditions
59 $hidden = apply_filters('widget_options_visibility_page', $hidden);
60
61 if ($hidden) {
62 return false;
63 }
64 }
65 }
66
67 // Normal Pages
68 if (!$isWooPage) {
69 if ($is_misc && ((is_home() && is_front_page()) || is_front_page())) {
70 if (isset($visibility['misc']['home']) && $visibility_opts == 'hide') {
71 $hidden = true; //hide if checked on hidden pages
72 } elseif (!isset($visibility['misc']['home']) && $visibility_opts == 'show') {
73 $hidden = true; //hide if not checked on visible pages
74 }
75
76 //do return to bypass other conditions
77 $hidden = apply_filters('widget_options_visibility_home', $hidden);
78 if ($hidden) {
79 return false;
80 }
81 } elseif ($is_misc && is_home()) { //filter for blog page
82 if (isset($visibility['misc']['blog']) && $visibility_opts == 'hide') {
83 $hidden = true; //hide if checked on hidden pages
84 } elseif (!isset($visibility['misc']['blog']) && $visibility_opts == 'show') {
85 $hidden = true; //hide if not checked on visible pages
86 }
87
88 //do return to bypass other conditions
89 $hidden = apply_filters('widget_options_visibility_blog', $hidden);
90 if ($hidden) {
91 return false;
92 }
93 } elseif ($is_tax && is_category()) {
94 if (!isset($visibility['categories'])) {
95 $visibility['categories'] = array();
96 }
97
98 //for taxonomy category checking
99 if (!isset($visibility['taxonomies'])) {
100 $visibility['taxonomies'] = array();
101 }
102 //check first the category taxonomy
103 if ($visibility_opts == 'hide' && array_key_exists('category', $visibility['taxonomies'])) {
104 $hidden = true; //hide if exists on hidden pages
105 } elseif ($visibility_opts == 'show' && !array_key_exists('category', $visibility['taxonomies'])) {
106 $hidden = true; //hide if doesn't exists on visible pages
107 }
108
109 // WPML TRANSLATION OBJECT FIX
110 $category_id = ($hasWPML) ? apply_filters('wpml_object_id', get_query_var('cat'), 'category', true, $default_language) : get_query_var('cat');
111
112 if ($visibility_opts == 'hide' && ((array_key_exists($category_id, $visibility['categories']) && $visibility['categories'][$category_id] == '1') || in_array($category_id, $visibility['categories']))) {
113 $hidden = true; //hide if exists on hidden pages
114 } elseif ($visibility_opts == 'show' && ((!array_key_exists($category_id, $visibility['categories']) && empty($visibility['categories'][$category_id])) && !in_array($category_id, $visibility['categories']))) {
115 $hidden = true; //hide if doesn't exists on visible pages
116 } elseif (((array_key_exists($category_id, $visibility['categories']) && $visibility['categories'][$category_id] == '1') || in_array($category_id, $visibility['categories'])) && $visibility_opts == 'hide') {
117 $hidden = true; //hide to all categories
118 } elseif (((array_key_exists($category_id, $visibility['categories']) && $visibility['categories'][$category_id] == '1') || in_array($category_id, $visibility['categories'])) && $visibility_opts == 'show') {
119 $hidden = false; //hide to all categories
120 }
121
122 if ($visibility_opts == 'show' && array_key_exists('category', $visibility['taxonomies'])) {
123 $hidden = false; //hide if doesn't exists on visible pages
124 }
125
126 //do return to bypass other conditions
127 $hidden = apply_filters('widget_options_visibility_categories', $hidden);
128 if ($hidden) {
129 return false;
130 }
131 } elseif ($is_tax && is_tag()) {
132 if (!isset($visibility['tags'])) {
133 $visibility['tags'] = array();
134 }
135
136 if ((isset($visibility['taxonomies']['post_tag']) && $visibility_opts == 'hide') ||
137 (!isset($visibility['taxonomies']['post_tag']) && $visibility_opts == 'show')
138 ) {
139 $hidden = true; //hide to all tags
140 } elseif (isset($visibility['taxonomies']['post_tag']) && $visibility_opts == 'show') {
141 $hidden = false; //hide to all tags
142 }
143
144 //do return to bypass other conditions
145 $hidden = apply_filters('widget_options_visibility_tags', $hidden);
146 if ($hidden) {
147 return false;
148 }
149 } elseif ($is_tax && is_tax()) {
150 $term = get_queried_object();
151 if (!isset($visibility['taxonomies'])) {
152 $visibility['taxonomies'] = array();
153 }
154
155 if ($visibility_opts == 'hide' && array_key_exists($term->taxonomy, $visibility['taxonomies'])) {
156 $hidden = true; //hide if exists on hidden pages
157 } elseif ($visibility_opts == 'show' && !array_key_exists($term->taxonomy, $visibility['taxonomies'])) {
158 $hidden = true; //hide if doesn't exists on visible pages
159 }
160
161 //do return to bypass other conditions
162 $hidden = apply_filters('widget_options_visibility_taxonomies', $hidden);
163 if ($hidden) {
164 return false;
165 }
166 } elseif ($is_misc && is_archive()) {
167 if (isset($visibility['misc']['archives']) && $visibility_opts == 'hide') {
168 $hidden = true; //hide if checked on hidden pages
169 } elseif (!isset($visibility['misc']['archives']) && $visibility_opts == 'show') {
170 $hidden = true; //hide if not checked on visible pages
171 }
172
173 //do return to bypass other conditions
174 $hidden = apply_filters('widget_options_visibility_archives', $hidden);
175 if ($hidden) {
176 return false;
177 }
178 } elseif ($is_misc && is_404()) {
179 if (isset($visibility['misc']['404']) && $visibility_opts == 'hide') {
180 $hidden = true; //hide if checked on hidden pages
181 } elseif (!isset($visibility['misc']['404']) && $visibility_opts == 'show') {
182 $hidden = true; //hide if not checked on visible pages
183 }
184
185 //do return to bypass other conditions
186 $hidden = apply_filters('widget_options_visibility_404', $hidden);
187 if ($hidden) {
188 return false;
189 }
190 } elseif ($is_misc && is_search()) {
191 if (isset($visibility['misc']['search']) && $visibility_opts == 'hide') {
192 $hidden = true; //hide if checked on hidden pages
193 } elseif (!isset($visibility['misc']['search']) && $visibility_opts == 'show') {
194 $hidden = true; //hide if not checked on visible pages
195 }
196
197 //do return to bypass other conditions
198 $hidden = apply_filters('widget_options_visibility_search', $hidden);
199 if ($hidden) {
200 return false;
201 }
202 } elseif (is_single() && !is_page()) {
203 global $post;
204 $type = $post->post_type;
205
206 if (!isset($visibility['types'])) {
207 $visibility['types'] = array();
208 }
209 if ($visibility_opts == 'hide' && array_key_exists($type, $visibility['types'])) {
210 $hidden = true; //hide if exists on hidden pages
211 } elseif ($visibility_opts == 'show' && !array_key_exists($type, $visibility['types'])) {
212 $hidden = true; //hide if doesn't exists on visible pages
213 }
214 // do return to bypass other conditions
215 $hidden = apply_filters('widget_options_visibility_types', $hidden);
216 //hide posts assign on category
217 if (!isset($visibility['categories'])) {
218 $visibility['categories'] = array();
219 }
220 if (isset($visibility['categories']['all_categories']) && $visibility_opts == 'hide') {
221 $hidden = true; //hide to all categories
222 } elseif (isset($visibility['categories']['all_categories']) && $visibility_opts == 'show') {
223 $hidden = false; //hide to all categories
224 } elseif (!isset($visibility['categories']['all_categories']) && !empty($visibility['categories'])) {
225 $cats = wp_get_post_categories(get_the_ID());
226 if (is_array($cats) && !empty($cats)) {
227 $checked_cats = array_keys($visibility['categories']);
228 $checked_cats = (intval($checked_cats[0]) == 0) ? $visibility['categories'] : $checked_cats;
229 $intersect = array_intersect($cats, $checked_cats);
230 if (!empty($intersect) && $visibility_opts == 'hide') {
231 $hidden = true;
232 } elseif (!empty($intersect) && $visibility_opts == 'show') {
233 $hidden = false;
234 }
235 }
236 }
237 // do return to bypass other conditions
238 $hidden = apply_filters('widget_options_visibility_post_category', $hidden);
239 if ($hidden) {
240 return false;
241 }
242 // echo $type;
243 } elseif ($is_types && (is_page() || get_post_type(get_the_ID()) == 'page')) {
244 global $post;
245
246 // WPML FIX
247 $page_id = get_queried_object_id();
248 $parent_id = wp_get_post_parent_id($page_id);
249
250 $pageID = ($hasWPML) ? apply_filters('wpml_object_id', $page_id, 'page', true, $default_language) : $page_id;
251 $parentID = ($hasWPML) ? apply_filters('wpml_object_id', $parent_id, 'page', true, $default_language) : $parent_id;
252
253 //do post type condition first
254 if (isset($visibility['types']) && isset($visibility['types']['page'])) {
255 if ($visibility_opts == 'hide' && array_key_exists('page', $visibility['types'])) {
256 $hidden = true; //hide if exists on hidden pages
257 } elseif ($visibility_opts == 'show' && !array_key_exists('page', $visibility['types'])) {
258 $hidden = true; //hide if doesn't exists on visible pages
259 }
260 } else {
261 //do per pages condition
262 if (!isset($visibility['pages'])) {
263 $visibility['pages'] = array();
264 }
265
266 $page_in_array = in_array($pageID, $visibility['pages']);
267 //for the compatibility of the data of lower version 3.8.10 and below
268 if (array_key_exists($pageID, $visibility['pages'])) {
269 if ($visibility['pages'][$pageID] == 1) {
270 $page_in_array = true;
271 }
272 }
273
274 if ($visibility_opts == 'hide' && $page_in_array) {
275 $hidden = true; //hide if exists on hidden pages
276 } elseif ($visibility_opts == 'show' && $pageID == 0) {
277 //for old versin v3.8.10 and below, need to resave the widget option
278 if (!in_array($pageID, $visibility['pages'])) {
279 $hidden = true;
280 }
281 } elseif ($visibility_opts == 'show' && !$page_in_array) {
282 $hidden = true; //hide if doesn't exists on visible pages
283 }
284 }
285 //do return to bypass other conditions
286 $hidden = apply_filters('widget_options_visibility_page', $hidden);
287 if ($hidden) {
288 return false;
289 }
290 }
291 }
292 //end wordpress pages
293
294
295 //ACF
296 if (isset($widget_options['acf']) && 'activate' == $widget_options['acf']) {
297 if (isset($visibility['acf']['field']) && !empty($visibility['acf']['field'])) {
298 $acf = get_field_object($visibility['acf']['field']);
299 if ($acf && is_array($acf)) {
300 $acf_visibility = (isset($visibility['acf']) && isset($visibility['acf']['visibility'])) ? $visibility['acf']['visibility'] : 'hide';
301
302 //handle repeater fields
303 if (isset($acf['value'])) {
304 if (is_array($acf['value'])) {
305 $acf['value'] = implode(', ', array_map(function ($acf_array_value) {
306 $acf_implode = implode(',', array_filter($acf_array_value));
307 return $acf_implode;
308 }, $acf['value']));
309 }
310 }
311
312 switch ($visibility['acf']['condition']) {
313 case 'equal':
314 if (isset($acf['value'])) {
315 if ('show' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
316 $hidden = false;
317 } else if ('show' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
318 $hidden = true;
319 } else if ('hide' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
320 $hidden = true;
321 } else if ('hide' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
322 $hidden = false;
323 }
324 }
325 break;
326
327 case 'not_equal':
328 if (isset($acf['value'])) {
329 if ('show' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
330 $hidden = true;
331 } else if ('show' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
332 $hidden = false;
333 } else if ('hide' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
334 $hidden = false;
335 } else if ('hide' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
336 $hidden = true;
337 }
338 }
339 break;
340
341 case 'contains':
342 if (isset($acf['value'])) {
343 if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
344 $hidden = false;
345 } else if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
346 $hidden = true;
347 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
348 $hidden = true;
349 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
350 $hidden = false;
351 }
352 }
353 break;
354
355 case 'not_contains':
356 if (isset($acf['value'])) {
357 if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
358 $hidden = true;
359 } else if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
360 $hidden = false;
361 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
362 $hidden = false;
363 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
364 $hidden = true;
365 }
366 }
367 break;
368
369 case 'empty':
370 if ('show' == $acf_visibility && empty($acf['value'])) {
371 $hidden = false;
372 } else if ('show' == $acf_visibility && !empty($acf['value'])) {
373 $hidden = true;
374 } elseif ('hide' == $acf_visibility && empty($acf['value'])) {
375 $hidden = true;
376 } else if ('hide' == $acf_visibility && !empty($acf['value'])) {
377 $hidden = false;
378 }
379 break;
380
381 case 'not_empty':
382 if ('show' == $acf_visibility && empty($acf['value'])) {
383 $hidden = true;
384 } else if ('show' == $acf_visibility && !empty($acf['value'])) {
385 $hidden = false;
386 } elseif ('hide' == $acf_visibility && empty($acf['value'])) {
387 $hidden = false;
388 } else if ('hide' == $acf_visibility && !empty($acf['value'])) {
389 $hidden = true;
390 }
391 break;
392
393 default:
394 # code...
395 break;
396 }
397
398 // //do return to bypass other conditions
399 $hidden = apply_filters('widget_options_visibility_acf', $hidden);
400 if ($hidden) {
401 return false;
402 }
403 }
404 }
405 }
406
407 //login state
408 if (isset($widget_options['state']) && 'activate' == $widget_options['state'] && isset($opts['roles'])) {
409 if (isset($opts['roles']['state']) && !empty($opts['roles']['state'])) {
410 //do state action here
411 if ($opts['roles']['state'] == 'out' && is_user_logged_in()) {
412 return false;
413 } else if ($opts['roles']['state'] == 'in' && !is_user_logged_in()) {
414 return false;
415 }
416 }
417 }
418
419 if ('activate' == $widget_options['logic']) {
420 // display widget logic
421 if (isset($opts['class']) && isset($opts['class']['logic']) && !empty($opts['class']['logic'])) {
422 $display_logic = stripslashes(trim($opts['class']['logic']));
423 $display_logic = apply_filters('widget_options_logic_override', $display_logic);
424 $display_logic = apply_filters('extended_widget_options_logic_override', $display_logic);
425 if ($display_logic === false) {
426 return false;
427 }
428 if ($display_logic === true) {
429 return true;
430 }
431 if (stristr($display_logic, "return") === false) {
432 $display_logic = "return (" . $display_logic . ");";
433 }
434 $display_logic = htmlspecialchars_decode($display_logic, ENT_QUOTES);
435 try {
436 if (!eval($display_logic)) {
437 return false;
438 }
439 } catch (ParseError $e) {
440 return false;
441 }
442 }
443 }
444
445 if ('activate' == $widget_options['hide_title']) {
446 //hide widget title
447 if (isset($instance['title']) && isset($opts['class']) && isset($opts['class']['title']) && '1' == $opts['class']['title']) {
448 $instance['title'] = '';
449 }
450 }
451
452 return $instance;
453 }
454 add_filter('widget_display_callback', 'widgetopts_display_callback', 50, 3);
455 endif;
456
457 //Don't show widget title
458 if (!function_exists('widgetopts_remove_title')) :
459 function widgetopts_remove_title($widget_title, $instance = array(), $widget_id = '')
460 {
461 global $widget_options;
462 if ('activate' == $widget_options['hide_title'] && is_array($instance) && !empty($instance)) {
463 foreach ($instance as $key => $value) {
464 if (substr($key, 0, 20) == 'extended_widget_opts') {
465 $opts = (isset($instance[$key])) ? $instance[$key] : array();
466
467 if (isset($opts['class']) && isset($opts['class']['title']) && '1' == $opts['class']['title']) {
468 return;
469 }
470
471 break;
472 }
473 }
474 return $widget_title;
475 } else {
476 return ($widget_title);
477 }
478 }
479 add_filter('widget_title', 'widgetopts_remove_title', 10, 4);
480 endif;
481
482 /*
483 * Add custom classes on dynamic_sidebar_params filter
484 */
485 if (!function_exists('widgetopts_add_classes')) :
486 function widgetopts_add_classes($params)
487 {
488 global $widget_options, $wp_registered_widget_controls;
489 $classe_to_add = '';
490 $id_base = $wp_registered_widget_controls[$params[0]['widget_id']]['id_base'];
491 $instance = get_option('widget_' . $id_base);
492
493 $num = substr($params[0]['widget_id'], -1);
494 if (isset($wp_registered_widget_controls[$params[0]['widget_id']]['params'][0]['number'])) {
495 $num = $wp_registered_widget_controls[$params[0]['widget_id']]['params'][0]['number'];
496 } elseif (isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback']) && is_array($wp_registered_widget_controls[$params[0]['widget_id']]['callback'])) {
497 if (isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]) && isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]->number)) {
498 $num = $wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]->number;
499 }
500 }
501 if (isset($instance[$num])) {
502 $opts = (isset($instance[$num]['extended_widget_opts-' . $params[0]['widget_id']])) ? $instance[$num]['extended_widget_opts-' . $params[0]['widget_id']] : array();
503 } else {
504 $opts = array();
505 }
506
507 $custom_class = isset($opts['class']) ? $opts['class'] : '';
508 $widget_id_set = $params[0]['widget_id'];
509
510 if ('activate' == $widget_options['classes'] && isset($widget_options['settings']['classes'])) {
511 //don't add the IDs when the setting is set to NO
512 if (isset($widget_options['settings']['classes']['id'])) {
513 if (is_array($custom_class) && isset($custom_class['id']) && !empty($custom_class['id'])) {
514 $params[0]['before_widget'] = preg_replace('/id="[^"]*/', "id=\"{$custom_class['id']}", $params[0]['before_widget'], 1);
515 $widget_id_set = $custom_class['id'];
516 }
517 }
518 }
519
520 $get_classes = widgetopts_classes_generator($opts, $widget_options, $widget_options['settings']);
521
522 //double check array
523 if (!is_array($get_classes)) {
524 $get_classes = array();
525 }
526
527 if ('activate' == $widget_options['classes']) {
528 if (isset($widget_options['settings']['classes']['auto'])) {
529 //do nothing
530 } else {
531 //check if widget class exists
532 if ((strpos($params[0]['before_widget'], '"widget ') !== false) ||
533 (strpos($params[0]['before_widget'], ' widget ') !== false) ||
534 (strpos($params[0]['before_widget'], ' widget"') !== false)
535 ) {
536 //do nothing
537 } else {
538 $get_classes[] = 'widget';
539 }
540 }
541 }
542
543 if (!empty($get_classes)) {
544 $classes = 'class="' . (implode(' ', $get_classes)) . ' ';
545 $params[0]['before_widget'] = str_replace('class="', $classes, $params[0]['before_widget']);
546 }
547
548 // $params[0]['before_widget'] = str_replace('class="', ' data-animation="asdf" class="', $params[0]['before_widget']);
549
550 return $params;
551 }
552 add_filter('dynamic_sidebar_params', 'widgetopts_add_classes');
553 endif;
554