PluginProbe ʕ •ᴥ•ʔ
Widget Options – Advanced Conditional Visibility for Gutenberg Blocks & Classic Widgets / 3.9.5
Widget Options – Advanced Conditional Visibility for Gutenberg Blocks & Classic Widgets v3.9.5
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
546 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 if ($visibility_opts == 'hide' && (array_key_exists($pageID, $visibility['pages']) || in_array($pageID, $visibility['pages']))) {
267 $hidden = true; //hide if exists on hidden pages
268 } elseif ($visibility_opts == 'show' && (!array_key_exists($pageID, $visibility['pages']) && !in_array($pageID, $visibility['pages']))) {
269 $hidden = true; //hide if doesn't exists on visible pages
270 } elseif ($visibility_opts == 'show' && $pageID == 0) {
271 //for old versin v3.8.10 and below, need to resave the widget option
272 if (!in_array($pageID, $visibility['pages'])) {
273 $hidden = true;
274 }
275 }
276 }
277 //do return to bypass other conditions
278 $hidden = apply_filters('widget_options_visibility_page', $hidden);
279 if ($hidden) {
280 return false;
281 }
282 }
283 }
284 //end wordpress pages
285
286
287 //ACF
288 if (isset($widget_options['acf']) && 'activate' == $widget_options['acf']) {
289 if (isset($visibility['acf']['field']) && !empty($visibility['acf']['field'])) {
290 $acf = get_field_object($visibility['acf']['field']);
291 if ($acf && is_array($acf)) {
292 $acf_visibility = (isset($visibility['acf']) && isset($visibility['acf']['visibility'])) ? $visibility['acf']['visibility'] : 'hide';
293
294 //handle repeater fields
295 if (isset($acf['value'])) {
296 if (is_array($acf['value'])) {
297 $acf['value'] = implode(', ', array_map(function ($acf_array_value) {
298 $acf_implode = implode(',', array_filter($acf_array_value));
299 return $acf_implode;
300 }, $acf['value']));
301 }
302 }
303
304 switch ($visibility['acf']['condition']) {
305 case 'equal':
306 if (isset($acf['value'])) {
307 if ('show' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
308 $hidden = false;
309 } else if ('show' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
310 $hidden = true;
311 } else if ('hide' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
312 $hidden = true;
313 } else if ('hide' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
314 $hidden = false;
315 }
316 }
317 break;
318
319 case 'not_equal':
320 if (isset($acf['value'])) {
321 if ('show' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
322 $hidden = true;
323 } else if ('show' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
324 $hidden = false;
325 } else if ('hide' == $acf_visibility && $acf['value'] == $visibility['acf']['value']) {
326 $hidden = false;
327 } else if ('hide' == $acf_visibility && $acf['value'] != $visibility['acf']['value']) {
328 $hidden = true;
329 }
330 }
331 break;
332
333 case 'contains':
334 if (isset($acf['value'])) {
335 if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
336 $hidden = false;
337 } else if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
338 $hidden = true;
339 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
340 $hidden = true;
341 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
342 $hidden = false;
343 }
344 }
345 break;
346
347 case 'not_contains':
348 if (isset($acf['value'])) {
349 if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
350 $hidden = true;
351 } else if ('show' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
352 $hidden = false;
353 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) !== false) {
354 $hidden = false;
355 } else if ('hide' == $acf_visibility && strpos($acf['value'], $visibility['acf']['value']) === false) {
356 $hidden = true;
357 }
358 }
359 break;
360
361 case 'empty':
362 if ('show' == $acf_visibility && empty($acf['value'])) {
363 $hidden = false;
364 } else if ('show' == $acf_visibility && !empty($acf['value'])) {
365 $hidden = true;
366 } elseif ('hide' == $acf_visibility && empty($acf['value'])) {
367 $hidden = true;
368 } else if ('hide' == $acf_visibility && !empty($acf['value'])) {
369 $hidden = false;
370 }
371 break;
372
373 case 'not_empty':
374 if ('show' == $acf_visibility && empty($acf['value'])) {
375 $hidden = true;
376 } else if ('show' == $acf_visibility && !empty($acf['value'])) {
377 $hidden = false;
378 } elseif ('hide' == $acf_visibility && empty($acf['value'])) {
379 $hidden = false;
380 } else if ('hide' == $acf_visibility && !empty($acf['value'])) {
381 $hidden = true;
382 }
383 break;
384
385 default:
386 # code...
387 break;
388 }
389
390 // //do return to bypass other conditions
391 $hidden = apply_filters('widget_options_visibility_acf', $hidden);
392 if ($hidden) {
393 return false;
394 }
395 }
396 }
397 }
398
399 //login state
400 if (isset($widget_options['state']) && 'activate' == $widget_options['state'] && isset($opts['roles'])) {
401 if (isset($opts['roles']['state']) && !empty($opts['roles']['state'])) {
402 //do state action here
403 if ($opts['roles']['state'] == 'out' && is_user_logged_in()) {
404 return false;
405 } else if ($opts['roles']['state'] == 'in' && !is_user_logged_in()) {
406 return false;
407 }
408 }
409 }
410
411 if ('activate' == $widget_options['logic']) {
412 // display widget logic
413 if (isset($opts['class']) && isset($opts['class']['logic']) && !empty($opts['class']['logic'])) {
414 $display_logic = stripslashes(trim($opts['class']['logic']));
415 $display_logic = apply_filters('widget_options_logic_override', $display_logic);
416 $display_logic = apply_filters('extended_widget_options_logic_override', $display_logic);
417 if ($display_logic === false) {
418 return false;
419 }
420 if ($display_logic === true) {
421 return true;
422 }
423 if (stristr($display_logic, "return") === false) {
424 $display_logic = "return (" . $display_logic . ");";
425 }
426 $display_logic = htmlspecialchars_decode($display_logic, ENT_QUOTES);
427 try {
428 if (!eval($display_logic)) {
429 return false;
430 }
431 } catch (ParseError $e) {
432 return false;
433 }
434 }
435 }
436
437 if ('activate' == $widget_options['hide_title']) {
438 //hide widget title
439 if (isset($instance['title']) && isset($opts['class']) && isset($opts['class']['title']) && '1' == $opts['class']['title']) {
440 $instance['title'] = '';
441 }
442 }
443
444 return $instance;
445 }
446 add_filter('widget_display_callback', 'widgetopts_display_callback', 50, 3);
447 endif;
448
449 //Don't show widget title
450 if (!function_exists('widgetopts_remove_title')) :
451 function widgetopts_remove_title($widget_title, $instance = array(), $widget_id = '')
452 {
453 global $widget_options;
454 if ('activate' == $widget_options['hide_title'] && is_array($instance) && !empty($instance)) {
455 foreach ($instance as $key => $value) {
456 if (substr($key, 0, 20) == 'extended_widget_opts') {
457 $opts = (isset($instance[$key])) ? $instance[$key] : array();
458
459 if (isset($opts['class']) && isset($opts['class']['title']) && '1' == $opts['class']['title']) {
460 return;
461 }
462
463 break;
464 }
465 }
466 return $widget_title;
467 } else {
468 return ($widget_title);
469 }
470 }
471 add_filter('widget_title', 'widgetopts_remove_title', 10, 4);
472 endif;
473
474 /*
475 * Add custom classes on dynamic_sidebar_params filter
476 */
477 if (!function_exists('widgetopts_add_classes')) :
478 function widgetopts_add_classes($params)
479 {
480 global $widget_options, $wp_registered_widget_controls;
481 $classe_to_add = '';
482 $id_base = $wp_registered_widget_controls[$params[0]['widget_id']]['id_base'];
483 $instance = get_option('widget_' . $id_base);
484
485 $num = substr($params[0]['widget_id'], -1);
486 if (isset($wp_registered_widget_controls[$params[0]['widget_id']]['params'][0]['number'])) {
487 $num = $wp_registered_widget_controls[$params[0]['widget_id']]['params'][0]['number'];
488 } elseif (isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback']) && is_array($wp_registered_widget_controls[$params[0]['widget_id']]['callback'])) {
489 if (isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]) && isset($wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]->number)) {
490 $num = $wp_registered_widget_controls[$params[0]['widget_id']]['callback'][0]->number;
491 }
492 }
493 if (isset($instance[$num])) {
494 $opts = (isset($instance[$num]['extended_widget_opts-' . $params[0]['widget_id']])) ? $instance[$num]['extended_widget_opts-' . $params[0]['widget_id']] : array();
495 } else {
496 $opts = array();
497 }
498
499 $custom_class = isset($opts['class']) ? $opts['class'] : '';
500 $widget_id_set = $params[0]['widget_id'];
501
502 if ('activate' == $widget_options['classes'] && isset($widget_options['settings']['classes'])) {
503 //don't add the IDs when the setting is set to NO
504 if (isset($widget_options['settings']['classes']['id'])) {
505 if (is_array($custom_class) && isset($custom_class['id']) && !empty($custom_class['id'])) {
506 $params[0]['before_widget'] = preg_replace('/id="[^"]*/', "id=\"{$custom_class['id']}", $params[0]['before_widget'], 1);
507 $widget_id_set = $custom_class['id'];
508 }
509 }
510 }
511
512 $get_classes = widgetopts_classes_generator($opts, $widget_options, $widget_options['settings']);
513
514 //double check array
515 if (!is_array($get_classes)) {
516 $get_classes = array();
517 }
518
519 if ('activate' == $widget_options['classes']) {
520 if (isset($widget_options['settings']['classes']['auto'])) {
521 //do nothing
522 } else {
523 //check if widget class exists
524 if ((strpos($params[0]['before_widget'], '"widget ') !== false) ||
525 (strpos($params[0]['before_widget'], ' widget ') !== false) ||
526 (strpos($params[0]['before_widget'], ' widget"') !== false)
527 ) {
528 //do nothing
529 } else {
530 $get_classes[] = 'widget';
531 }
532 }
533 }
534
535 if (!empty($get_classes)) {
536 $classes = 'class="' . (implode(' ', $get_classes)) . ' ';
537 $params[0]['before_widget'] = str_replace('class="', $classes, $params[0]['before_widget']);
538 }
539
540 // $params[0]['before_widget'] = str_replace('class="', ' data-animation="asdf" class="', $params[0]['before_widget']);
541
542 return $params;
543 }
544 add_filter('dynamic_sidebar_params', 'widgetopts_add_classes');
545 endif;
546