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