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