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