PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.11.34
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.11.34
4.11.84 4.11.83 4.11.82 4.11.80 4.11.81 4.11.79 4.11.78 4.11.77 4.11.76 4.11.75 3.20.5 4.11.69 3.20.6 4.11.7 3.20.7 4.11.70 3.20.8 4.11.71 3.20.9 4.11.72 3.21.1 4.11.73 3.21.2 4.11.74 3.21.3 4.11.8 3.21.4 4.11.9 3.21.5 4.2.0 3.21.6 4.2.1 3.3.0 4.2.2 3.3.1 4.2.3 3.3.2 4.2.4 3.3.3 4.2.5 3.3.4 4.2.6 3.3.5 4.2.7 3.3.6 4.2.8 3.3.7 4.2.9 3.3.8 4.3.0 3.3.9 4.3.1 3.4.0 4.3.2 3.4.1 4.3.3 3.4.2 4.3.4 3.4.3 4.3.5 3.4.4 4.3.6 3.4.5 4.3.7 3.4.6 4.3.8 3.4.7 4.3.9 3.4.8 4.4.0 3.4.9 4.4.1 3.5.0 4.4.2 3.5.1 4.4.3 3.5.2 4.4.4 3.5.3 4.4.5 3.5.4 4.4.6 3.5.5 4.4.7 3.5.6 4.4.8 3.5.7 4.4.9 3.5.8 4.5.0 3.5.9 4.5.1 3.6.0 4.5.2 3.6.1 4.5.3 3.6.2 4.5.4 3.6.3 4.5.5 3.6.4 4.5.6 3.6.5 4.5.7 3.6.6 4.5.8 3.6.7 4.5.9 3.6.8 4.6.0 3.6.9 4.6.1 3.7.0 4.7.0 3.7.1 4.7.1 3.7.2 4.7.2 3.7.3 4.7.3 3.7.4 4.7.4 3.7.5 4.7.5 3.7.6 4.7.6 3.7.7 4.7.7 3.7.8 4.7.8 3.7.9 4.7.9 3.8.0 4.8.0 3.8.1 4.8.1 3.8.2 4.8.10 3.8.3 4.8.11 3.8.4 4.8.2 3.8.5 4.8.3 3.8.6 4.8.4 3.8.7 4.8.5 3.8.8 4.8.6 3.8.9 4.8.7 3.9.0 4.8.8 3.9.1 4.8.9 3.9.2 4.9.0 3.9.3 4.9.0-beta1 3.9.4 4.9.0-beta2 3.9.5 4.9.1 3.9.6 4.9.10 3.9.7 4.9.11 3.9.8 4.9.12 3.9.9 4.9.13 4.0.1 4.9.14 4.0.3 4.9.15 4.0.4 4.9.16 4.0.5 4.9.17 4.0.6 4.9.18 4.0.7 4.9.19 4.0.8 4.9.2 4.0.9 4.9.20 4.1.0 4.9.21 4.1.1 4.9.22 4.1.2 4.9.23 4.1.3 4.9.24 trunk 4.1.4 4.9.25 1.0 4.1.5 4.9.26 1.01 4.1.6 4.9.27 1.02 4.1.7 4.9.28 1.03 4.1.8 4.9.29 1.04 4.1.9 4.9.3 1.05 4.10.0 4.9.30 1.06 4.10.1 4.9.31 1.07 4.10.10 4.9.32 1.08 4.10.11 4.9.33 1.09 4.10.12 4.9.34 2.0 4.10.13 4.9.35 2.0.1 4.10.14 4.9.36 2.0.2 4.10.15 4.9.37 2.0.3 4.10.16 4.9.38 2.0.4 4.10.17 4.9.39 2.0.5 4.10.18 4.9.4 2.0.6 4.10.19 4.9.40 2.0.7 4.10.2 4.9.41 2.0.8 4.10.20 4.9.42 2.0.9 4.10.21 4.9.43 2.1.0 4.10.22 4.9.45 2.1.1 4.10.23 4.9.46 2.1.2 4.10.24 4.9.47 2.1.3 4.10.25 4.9.48 2.1.4 4.10.26 4.9.49 2.1.5 4.10.27 4.9.5 2.1.5-beta1 4.10.28 4.9.50 2.1.6 4.10.29 4.9.51 2.1.7 4.10.3 4.9.52 2.1.8 4.10.30 4.9.53 2.1.9 4.10.31 4.9.54 2.2.0 4.10.32 4.9.55 2.2.1 4.10.33 4.9.56 2.2.2 4.10.34 4.9.57 2.2.3 4.10.35 4.9.6 2.2.4 4.10.36 4.9.7 2.2.5 4.10.37 4.9.8 2.2.6 4.10.38 4.9.9 2.2.7 4.10.39 2.2.8 4.10.4 2.2.9 4.10.40 2.3.0 4.10.41 2.3.1 4.10.42 2.3.2 4.10.43 2.3.3 4.10.44 2.3.4 4.10.45 2.3.5 4.10.46 2.3.6 4.10.47 2.3.7 4.10.48 2.3.8 4.10.49 2.3.9 4.10.5 2.4.0 4.10.50 2.4.1 4.10.51 2.5.0 4.10.52 2.5.1 4.10.53 2.5.2 4.10.54 2.5.3 4.10.55 2.5.4 4.10.56 2.5.5 4.10.57 2.5.6 4.10.58 2.5.7 4.10.59 2.5.8 4.10.6 2.5.9 4.10.60 2.6.0 4.10.61 2.6.1 4.10.62 2.6.2 4.10.63 2.6.3 4.10.64 2.6.4 4.10.65 2.6.5 4.10.66 2.6.6 4.10.67 2.6.7 4.10.68 2.6.8 4.10.69 2.6.9 4.10.7 2.7.0 4.10.70 2.7.1 4.10.71 2.7.2 4.10.72 2.7.3 4.10.73 2.7.4 4.10.74 2.7.5 4.10.75 2.7.6 4.10.76 2.7.7 4.10.77 2.7.8 4.10.78 2.7.9 4.10.79 2.8.0 4.10.8 2.8.1 4.10.80 2.8.2 4.10.81 2.8.3 4.10.82 2.8.4 4.10.83 2.8.5 4.10.84 2.8.6 4.10.85 2.8.7 4.10.86 2.8.8 4.10.87 2.8.9 4.10.88 2.9.0 4.10.89 2.9.1 4.10.9 2.9.2 4.10.90 2.9.3 4.11.0 2.9.4 4.11.1 2.9.5 4.11.10 2.9.6 4.11.11 2.9.7 4.11.12 2.9.8 4.11.13 2.9.9 4.11.14 3.0.0 4.11.15 3.0.1 4.11.16 3.0.2 4.11.17 3.0.3 4.11.18 3.0.4 4.11.19 3.0.5 4.11.2 3.0.6 4.11.20 3.0.7 4.11.21 3.0.8 4.11.22 3.0.9 4.11.23 3.1.0 4.11.24 3.1.1 4.11.25 3.1.2 4.11.26 3.1.3 4.11.27 3.1.4 4.11.28 3.1.5 4.11.29 3.1.6 4.11.3 3.1.7 4.11.30 3.1.8 4.11.31 3.1.9 4.11.32 3.10.0 4.11.33 3.10.1 4.11.34 3.10.2 4.11.35 3.10.3 4.11.36 3.10.4 4.11.37 3.10.5 4.11.38 3.10.6 4.11.39 3.10.7 4.11.4 3.10.8 4.11.40 3.10.9 4.11.41 3.11.0 4.11.42 3.11.1 4.11.43 3.11.2 4.11.44 3.11.3 4.11.45 3.11.4 4.11.46 3.11.5 4.11.47 3.11.6 4.11.48 3.11.7 4.11.49 3.11.8 4.11.5 3.11.9 4.11.50 3.12.0 4.11.51 3.12.1 4.11.52 3.12.2 4.11.53 3.12.3 4.11.54 3.2.0 4.11.55 3.2.1 4.11.56 3.2.2 4.11.57 3.2.3 4.11.58 3.2.4 4.11.59 3.2.5 4.11.6 3.2.6 4.11.60 3.2.7 4.11.61 3.2.8 4.11.62 3.2.9 4.11.63 3.20.0 4.11.64 3.20.1 4.11.65 3.20.2 4.11.66 3.20.3 4.11.67 3.20.4 4.11.68
premium-addons-for-elementor / includes / pa-display-conditions / pa-controls-handler.php
premium-addons-for-elementor / includes / pa-display-conditions Last commit date
conditions 9 months ago lang-locale.php 9 months ago mobile-detector.php 9 months ago pa-controls-handler.php 9 months ago
pa-controls-handler.php
415 lines
1 <?php
2 /**
3 * PA Display Conditions::Control-Handler.
4 * Handles controls used in PA Display Conditions Addon.
5 */
6
7 namespace PremiumAddons\Includes;
8
9 use Elementor\Controls_Manager;
10 use Elementor\Repeater;
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit; // Exit if accessed directly.
14 }
15
16 /**
17 * Class PA_Controls_Handler
18 *
19 * @since 4.7.0
20 */
21 class PA_Controls_Handler {
22
23 /**
24 * Contains Conditions Classes.
25 *
26 * @access public
27 * @var array condition classes
28 */
29 public static $conditions_classes = array();
30
31 /**
32 * Contains Conditions Keys.
33 *
34 * @access public
35 * @var array condition keys
36 */
37 public static $conditions_keys = array();
38
39 /**
40 * Holds all the conditions.
41 * Contains Conditions.
42 *
43 * @access public
44 * @var array condition.
45 */
46 public static $conditions = array();
47
48 /**
49 * Holds all the conditions.
50 *
51 * @since 4.7.0
52 * @access protected
53 * @var array condition results holder.
54 */
55 protected $conditions_results_holder = array();
56
57 /**
58 * Class Constructor.
59 */
60 public function __construct() {
61
62 $this->init_conditions();
63 $this->init_conditions_classes();
64
65 $is_edit_mode = \Elementor\Plugin::$instance->editor->is_edit_mode();
66
67 // Trigger should_rendr filters only on the frontend.
68 if ( ! $is_edit_mode ) {
69 $this->init_actions();
70 }
71 }
72
73 /**
74 * Initialize condition classes.
75 *
76 * @access public
77 * @since 4.7.0
78 */
79 public function init_conditions() {
80
81 static::$conditions = array(
82 'system' => array(
83 'label' => __( 'System', 'premium-addons-for-elementor' ),
84 'options' => array(
85 'browser' => __( 'Browser', 'premium-addons-for-elementor' ),
86 'device' => __( 'Device', 'premium-addons-for-elementor' ),
87 'operating_system' => __( 'Operating System', 'premium-addons-for-elementor' ),
88 ),
89 ),
90
91 'time' => array(
92 'label' => __( 'Date & Time', 'premium-addons-for-elementor' ),
93 'options' => array(
94 'day' => __( 'Day', 'premium-addons-for-elementor' ),
95 'date' => __( 'Date', 'premium-addons-for-elementor' ),
96 'date_range' => __( 'Date Range', 'premium-addons-for-elementor' ),
97 'time_range' => __( 'Time Range', 'premium-addons-for-elementor' ),
98 ),
99 ),
100
101 'userdata' => array(
102 'label' => __( 'User', 'premium-addons-for-elementor' ),
103 'options' => array(
104 'ip_location' => __( 'Location', 'premium-addons-for-elementor' ),
105 'login_status' => __( 'Login Status', 'premium-addons-for-elementor' ),
106 'user_role' => __( 'Role', 'premium-addons-for-elementor' ),
107 'return_visitor' => __( 'Returning Visitor', 'premium-addons-for-elementor' ),
108 ),
109 ),
110
111 'other' => array(
112 'label' => __( 'Other', 'premium-addons-for-elementor' ),
113 'options' => array(
114 'lang' => __( 'Site Language', 'premium-addons-for-elementor' ),
115 ),
116 ),
117
118 'postdata' => array(
119 'label' => __( 'Post/Page', 'premium-addons-for-elementor' ),
120 'options' => array(
121 'post' => __( 'Post', 'premium-addons-for-elementor' ),
122 'post_type' => __( 'Post Type', 'premium-addons-for-elementor' ),
123 'post_format' => __( 'Post Format', 'premium-addons-for-elementor' ),
124 'post_category' => __( 'Post Category', 'premium-addons-for-elementor' ),
125 'page' => __( 'Page', 'premium-addons-for-elementor' ),
126 'static_page' => __( 'Website Static Pages', 'premium-addons-for-elementor' ),
127 ),
128 ),
129
130 'urlparams' => array(
131 'label' => __( 'URL (PRO)', 'premium-addons-for-elementor' ),
132 'options' => array(
133 'url_string' => __( 'String in URL', 'premium-addons-for-elementor' ),
134 'url_referer' => __( 'URL Parameters', 'premium-addons-for-elementor' ),
135 ),
136 ),
137
138 'misc' => array(
139 'label' => __( 'Misc (PRO)', 'premium-addons-for-elementor' ),
140 'options' => array(
141 'shortcode' => __( 'Shortcode', 'premium-addons-for-elementor' ),
142 ),
143 ),
144
145 );
146 }
147
148 /**
149 * Initialize condition classes.
150 *
151 * @access public
152 * @since 4.7.0
153 */
154 public function init_conditions_classes() {
155
156 self::$conditions_keys = apply_filters(
157 'pa_display_conditions_keys',
158 array(
159 'browser',
160 'device',
161 'day',
162 'date',
163 'date_range',
164 'time_range',
165 'ip_location',
166 'lang',
167 'login_status',
168 'return_visitor',
169 'post',
170 'post_type',
171 'post_format',
172 'post_category',
173 'page',
174 'static_page',
175 'operating_system',
176 'user_role',
177 )
178 );
179
180 include_once PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/condition.php';
181
182 foreach ( self::$conditions_keys as $condition_key ) {
183
184 $file_name = str_replace( '_', '-', strtolower( $condition_key ) );
185
186 if ( file_exists( PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/' . $file_name . '.php' ) ) {
187 include_once PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/' . $file_name . '.php';
188 }
189
190 $class_name = str_replace( '-', ' ', $condition_key );
191 $class_name = str_replace( ' ', '', ucwords( $class_name ) );
192 $class_name = __NAMESPACE__ . '\PA_Display_Conditions\Conditions\\' . $class_name;
193
194 if ( class_exists( $class_name ) ) {
195 static::$conditions_classes[ $condition_key ] = new $class_name();
196 }
197 }
198 }
199
200 /**
201 * Set render function to action filter.
202 *
203 * @access public
204 * @since 4.7.0
205 */
206 public function init_actions() {
207
208 add_filter( 'elementor/frontend/widget/should_render', array( $this, 'should_render' ), 10, 2 );
209 add_filter( 'elementor/frontend/column/should_render', array( $this, 'should_render' ), 10, 2 );
210 add_filter( 'elementor/frontend/section/should_render', array( $this, 'should_render' ), 10, 2 );
211 add_filter( 'elementor/frontend/container/should_render', array( $this, 'should_render' ), 10, 2 );
212
213 add_action( 'elementor/frontend/before_render', array( $this, 'before_render' ) );
214 }
215
216 public function before_render( $element ) {
217
218 $settings = $element->get_settings_for_display();
219
220 if ( 'yes' === $element->get_settings_for_display('pa_display_conditions_switcher') ) {
221
222 $display_conditions = $settings['pa_condition_repeater'];
223 $action = $settings['pa_display_action'];
224
225 foreach ( $display_conditions as $key => $list ) {
226
227 if ( 'return_visitor' === $list['pa_condition_key'] ) {
228
229 $element->add_render_attribute( '_wrapper', array(
230 'class' => 'elementor-hidden',
231 'data-returning-condition' => $action
232 ));
233
234 }
235
236 }
237
238 }
239 }
240
241 /**
242 * Adds repeater source controls
243 *
244 * @since 4.7.0
245 * @access public
246 *
247 * @param object $repeater Elementor Repeater Object.
248 */
249 public function add_repeater_source_controls( $repeater ) {
250
251 $additional_ids = array( 'pa_condition_shortcode', 'pa_condition_acf_text', 'pa_condition_acf_boolean', 'pa_condition_acf_choice', 'pa_condition_woo_orders', 'pa_condition_woo_category', 'pa_condition_woo_total_price', 'pa_condition_time_range' );
252
253 foreach ( static::$conditions_classes as $condition_class_name => $condition_obj ) {
254
255 $control_id = 'pa_condition_' . $condition_class_name;
256
257 if ( in_array( $control_id, $additional_ids, true ) ) {
258 $repeater->add_control(
259 'pa_condition_val' . $condition_class_name,
260 $condition_obj->add_value_control()
261 );
262 }
263 }
264 }
265
266 /**
267 * Adds repeater compare controls
268 *
269 * @since 4.7.0
270 * @access public
271 *
272 * @param object $repeater Elementor Repeater Object.
273 */
274 public function add_repeater_compare_controls( $repeater ) {
275
276 foreach ( static::$conditions_classes as $condition_class_name => $condition_obj ) {
277
278 $control_id = 'pa_condition_' . $condition_class_name;
279
280 $repeater->add_control(
281 $control_id,
282 $condition_obj->get_control_options()
283 );
284
285 }
286 }
287
288 /**
289 * Determines whether the element content should be rendered.
290 *
291 * @param bool $should_render should render.
292 * @param object $element Elementor Repeater Object.
293 *
294 * @since 4.7.0
295 * @access public
296 */
297 public function should_render( $should_render, $element ) {
298
299 $settings = $element->get_settings_for_display();
300
301 if ( 'yes' === $element->get_settings_for_display( 'pa_display_conditions_switcher' ) ) {
302
303 $element_id = $element->get_id();
304 $conditions_list = $settings['pa_condition_repeater'];
305 $action = $settings['pa_display_action'];
306
307 $contains_is_return_visitor = $this->store_condition_results( $settings, $element_id, $conditions_list );
308
309 // Return visitor will be handled via JS.
310 if( $contains_is_return_visitor ) {
311 return true;
312 }
313
314 return $this->check_visiblity( $element_id, $settings['pa_display_when'], $action );
315
316 }
317
318 return $should_render;
319 }
320
321 /**
322 * Store conditions results
323 *
324 * @since 4.7.0
325 * @access protected
326 *
327 * @param array $settings elements settings.
328 * @param string $element_id elements id.
329 * @param array $lists conditions.
330 */
331 protected function store_condition_results( $settings, $element_id, $lists = array() ) {
332
333 if ( ! $lists ) {
334 return;
335 }
336
337 foreach ( $lists as $key => $list ) {
338
339 if ( ! in_array( $list['pa_condition_key'], self::$conditions_keys, true ) ) {
340 continue;
341 }
342
343 // We will handle this using JS to prevent huge number of cookies.
344 if( 'return_visitor' === $list['pa_condition_key'] ) {
345 return true;
346 }
347
348 $class = static::$conditions_classes[ $list['pa_condition_key'] ];
349 $operator = $list['pa_condition_operator'];
350 $item_key = 'pa_condition_' . $list['pa_condition_key'];
351 $value = isset( $list[ $item_key ] ) ? $list[ $item_key ] : '';
352
353 $compare_val = isset( $list[ 'pa_condition_val' . $list['pa_condition_key'] ] ) ? $list[ 'pa_condition_val' . $list['pa_condition_key'] ] : '';
354
355 if ( 'shortcode' !== $list['pa_condition_key'] ) {
356 $compare_val = esc_html( $compare_val );
357 }
358
359 $id = $item_key . '_' . $list['_id'];
360 $time_zone = in_array( $list['pa_condition_key'], array( 'date_range', 'time_range', 'date', 'day' ), true ) ? $list['pa_condition_timezone'] : false;
361
362 if ( 'ip_location' !== $list['pa_condition_key'] ) {
363
364 // If ACF Text or Time Range, comparison must triggered.
365 $check = ( in_array( $list['pa_condition_key'], array( 'time_range', 'acf_text' ) ) || '' !== $value ) ? $class->compare_value( $settings, $operator, $value, $compare_val, $time_zone ) : true;
366 } else {
367
368 $detect_method = $list['pa_condition_loc_method'];
369
370 $check = $class->compare_location( $settings, $operator, $value, $compare_val, $time_zone, $detect_method );
371
372 }
373
374 $this->conditions_results_holder[ $element_id ][ $id ] = $check;
375 }
376 }
377
378 /**
379 * Check Element Visibility
380 *
381 * @since 4.7.0
382 * @access public
383 *
384 * @param string $element_id element id.
385 * @param string $relation condition relation.
386 * @param string $action action to make if the conditions are met.
387 *
388 * @return bool
389 */
390 public function check_visiblity( $element_id, $relation, $action ) {
391 $result = true;
392
393 if ( ! array_key_exists( $element_id, $this->conditions_results_holder ) ) {
394 return;
395 }
396
397 if ( 'all' === $relation ) {
398
399 $result = in_array( false, $this->conditions_results_holder[ $element_id ], true ) ? false : true;
400 } else {
401
402 $result = in_array( true, $this->conditions_results_holder[ $element_id ], true ) ? true : false;
403 }
404
405 if ( ( 'show' === $action && $result ) || ( 'hide' === $action && false === $result ) ) {
406 $should_render = true;
407 } elseif ( ( 'show' === $action && false === $result ) || ( 'hide' === $action && $result ) ) {
408
409 $should_render = false;
410 }
411
412 return $should_render;
413 }
414 }
415