Elementor Essential Addons - Version 2.9.5

Version Description

  • Fixed: Product grid featured products loop not working
  • Few minor bugfix and improvements
Download this release

Release Info

Developer re_enter_rupok
Plugin Icon 128x128 Elementor Essential Addons
Version 2.9.5
Comparing to
See all releases

Code changes from version 2.9.4 to 2.9.5

admin/assets/css/admin.css CHANGED
File without changes
admin/assets/images/wpsp-logo.svg CHANGED
@@ -1,5 +1,5 @@
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 960 960" style="enable-background:new 0 0 960 960;" xml:space="preserve">
3
  <style type="text/css">
4
  .st0{fill:#FFFFFF;}
5
  .st1{fill:#6c63ff;}
1
  <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg version="1.1" width="80px" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 960 960" style="enable-background:new 0 0 960 960;" xml:space="preserve">
3
  <style type="text/css">
4
  .st0{fill:#FFFFFF;}
5
  .st1{fill:#6c63ff;}
assets/sass/_particles.scss CHANGED
File without changes
elements/product-grid/product-grid.php CHANGED
@@ -2,517 +2,527 @@
2
  namespace Elementor;
3
 
4
  if (!defined('ABSPATH')) {
5
- exit;
6
  }
7
  // If this file is called directly, abort.
8
 
9
- class Widget_Eael_Product_Grid extends Widget_Base {
10
-
11
- public function get_name() {
12
- return 'eicon-woocommerce';
13
- }
14
-
15
- public function get_title() {
16
- return esc_html__('EA Product Grid', 'essential-addons-elementor');
17
- }
18
-
19
- public function get_icon() {
20
- return 'eicon-woocommerce';
21
- }
22
-
23
- public function get_categories() {
24
- return ['essential-addons-elementor'];
25
- }
26
-
27
- protected function _register_controls() {
28
-
29
- // Content Controls
30
- $this->start_controls_section(
31
- 'eael_section_product_grid_settings',
32
- [
33
- 'label' => esc_html__('Product Settings', 'essential-addons-elementor'),
34
- ]
35
- );
36
-
37
- $this->add_control(
38
- 'eael_product_grid_product_filter',
39
- [
40
- 'label' => esc_html__('Filter By', 'essential-addons-elementor'),
41
- 'type' => Controls_Manager::SELECT,
42
- 'default' => 'recent-products',
43
- 'options' => [
44
- 'recent-products' => esc_html__('Recent Products', 'essential-addons-elementor'),
45
- 'featured-products' => esc_html__('Featured Products', 'essential-addons-elementor'),
46
- 'best-selling-products' => esc_html__('Best Selling Products', 'essential-addons-elementor'),
47
- 'sale-products' => esc_html__('Sale Products', 'essential-addons-elementor'),
48
- 'top-products' => esc_html__('Top Rated Products', 'essential-addons-elementor'),
49
- ],
50
- ]
51
- );
52
-
53
- $this->add_control(
54
- 'eael_product_grid_column',
55
- [
56
- 'label' => esc_html__('Columns', 'essential-addons-elementor'),
57
- 'type' => Controls_Manager::SELECT,
58
- 'default' => '4',
59
- 'options' => [
60
- '1' => esc_html__('1', 'essential-addons-elementor'),
61
- '2' => esc_html__('2', 'essential-addons-elementor'),
62
- '3' => esc_html__('3', 'essential-addons-elementor'),
63
- '4' => esc_html__('4', 'essential-addons-elementor'),
64
- '5' => esc_html__('5', 'essential-addons-elementor'),
65
- '6' => esc_html__('6', 'essential-addons-elementor'),
66
- ],
67
- ]
68
- );
69
-
70
- $this->add_control(
71
- 'eael_product_grid_products_count',
72
- [
73
- 'label' => __('Products Count', 'essential-addons-elementor'),
74
- 'type' => Controls_Manager::NUMBER,
75
- 'default' => 4,
76
- 'min' => 1,
77
- 'max' => 1000,
78
- 'step' => 1,
79
- ]
80
- );
81
-
82
- $this->add_control(
83
- 'eael_product_grid_categories',
84
- [
85
- 'label' => esc_html__('Product Categories', 'essential-addons-elementor'),
86
- 'type' => Controls_Manager::SELECT2,
87
- 'label_block' => true,
88
- 'multiple' => true,
89
- 'options' => eael_woocommerce_product_categories(),
90
- ]
91
- );
92
-
93
- $this->add_control(
94
- 'eael_product_grid_style_preset',
95
- [
96
- 'label' => esc_html__( 'Style Preset', 'essential-addons-elementor' ),
97
- 'type' => Controls_Manager::SELECT,
98
- 'default' => 'eael-product-simple',
99
- 'options' => [
100
- 'eael-product-default' => esc_html__( 'Default', 'essential-addons-elementor' ),
101
- 'eael-product-simple' => esc_html__( 'Simple Style', 'essential-addons-elementor' ),
102
- 'eael-product-reveal' => esc_html__( 'Reveal Style', 'essential-addons-elementor' ),
103
- 'eael-product-overlay' => esc_html__( 'Overlay Style', 'essential-addons-elementor' ),
104
- ],
105
- ]
106
- );
107
-
108
- $this->add_control(
109
- 'eael_product_grid_rating',
110
- [
111
- 'label' => esc_html__('Show Product Rating?', 'essential-addons-elementor'),
112
- 'type' => Controls_Manager::SWITCHER,
113
- 'return_value' => 'yes',
114
- 'default' => 'yes',
115
- ]
116
- );
117
-
118
- $this->end_controls_section();
119
-
120
- $this->start_controls_section(
121
- 'eael_product_grid_styles',
122
- [
123
- 'label' => esc_html__('Products Styles', 'essential-addons-elementor'),
124
- 'tab' => Controls_Manager::TAB_STYLE,
125
- ]
126
- );
127
-
128
- $this->add_control(
129
- 'eael_product_grid_background_color',
130
- [
131
- 'label' => esc_html__('Content Background Color', 'essential-addons-elementor'),
132
- 'type' => Controls_Manager::COLOR,
133
- 'default' => '#fff',
134
- 'selectors' => [
135
- '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product' => 'background-color: {{VALUE}};',
136
- ],
137
- ]
138
- );
139
-
140
- $this->add_group_control(
141
- Group_Control_Border::get_type(),
142
- [
143
- 'name' => 'eael_peoduct_grid_border',
144
- 'fields_options' => [
145
- 'border' => [
146
- 'default' => 'solid',
147
- ],
148
- 'width' => [
149
- 'default' => [
150
- 'top' => '1',
151
- 'right' => '1',
152
- 'bottom' => '1',
153
- 'left' => '1',
154
- 'isLinked' => false,
155
- ],
156
- ],
157
- 'color' => [
158
- 'default' => '#eee',
159
- ],
160
- ],
161
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product',
162
- 'condition' => [
163
- 'eael_product_grid_style_preset' => ['eael-product-default', 'eael-product-simple', 'eael-product-overlay']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  ]
165
- ]
166
- );
167
-
168
- $this->add_control(
169
- 'eael_peoduct_grid_border_radius',
170
- [
171
- 'label' => esc_html__('Border Radius', 'essential-addons-elementor'),
172
- 'type' => Controls_Manager::DIMENSIONS,
173
- 'selectors' => [
174
- '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
175
- ],
176
- ]
177
- );
178
-
179
- $this->end_controls_section();
180
-
181
- $this->start_controls_section(
182
- 'eael_section_product_grid_typography',
183
- [
184
- 'label' => esc_html__('Color &amp; Typography', 'essential-addons-elementor'),
185
- 'tab' => Controls_Manager::TAB_STYLE,
186
- ]
187
- );
188
-
189
- $this->add_control(
190
- 'eael_product_grid_product_title_heading',
191
- [
192
- 'label' => __('Product Title', 'essential-addons-elementor'),
193
- 'type' => Controls_Manager::HEADING,
194
- ]
195
- );
196
-
197
- $this->add_control(
198
- 'eael_product_grid_product_title_color',
199
- [
200
- 'label' => esc_html__('Product Title Color', 'essential-addons-elementor'),
201
- 'type' => Controls_Manager::COLOR,
202
- 'default' => '#272727',
203
- 'selectors' => [
204
- '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .woocommerce-loop-product__title' => 'color: {{VALUE}};',
205
- ],
206
- ]
207
- );
208
-
209
- $this->add_group_control(
210
- Group_Control_Typography::get_type(),
211
- [
212
- 'name' => 'eael_product_grid_product_title_typography',
213
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .woocommerce-loop-product__title',
214
- ]
215
- );
216
-
217
- $this->add_control(
218
- 'eael_product_grid_product_price_heading',
219
- [
220
- 'label' => __('Product Price', 'essential-addons-elementor'),
221
- 'type' => Controls_Manager::HEADING,
222
- ]
223
- );
224
-
225
- $this->add_control(
226
- 'eael_product_grid_product_price_color',
227
- [
228
- 'label' => esc_html__('Product Price Color', 'essential-addons-elementor'),
229
- 'type' => Controls_Manager::COLOR,
230
- 'default' => '#272727',
231
- 'selectors' => [
232
- '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price' => 'color: {{VALUE}};',
233
- ],
234
- ]
235
- );
236
-
237
- $this->add_group_control(
238
- Group_Control_Typography::get_type(),
239
- [
240
- 'name' => 'eael_product_grid_product_price_typography',
241
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price',
242
- ]
243
- );
244
-
245
- $this->add_control(
246
- 'eael_product_grid_product_rating_heading',
247
- [
248
- 'label' => __('Star Rating', 'essential-addons-elementor'),
249
- 'type' => Controls_Manager::HEADING,
250
- ]
251
- );
252
-
253
- $this->add_control(
254
- 'eael_product_grid_product_rating_color',
255
- [
256
- 'label' => esc_html__('Rating Color', 'essential-addons-elementor'),
257
- 'type' => Controls_Manager::COLOR,
258
- 'default' => '#f2b01e',
259
- 'selectors' => [
260
- '{{WRAPPER}} .eael-product-grid .woocommerce .star-rating::before' => 'color: {{VALUE}};',
261
- '{{WRAPPER}} .eael-product-grid .woocommerce .star-rating span::before' => 'color: {{VALUE}};',
262
- ],
263
- ]
264
- );
265
-
266
- $this->add_group_control(
267
- Group_Control_Typography::get_type(),
268
- [
269
- 'name' => 'eael_product_grid_product_rating_typography',
270
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .star-rating',
271
- ]
272
- );
273
-
274
- $this->add_control(
275
- 'eael_product_grid_sale_badge_heading',
276
- [
277
- 'label' => __('Sale Badge', 'essential-addons-elementor'),
278
- 'type' => Controls_Manager::HEADING,
279
- ]
280
- );
281
-
282
- $this->add_control(
283
- 'eael_product_grid_sale_badge_color',
284
- [
285
- 'label' => esc_html__('Sale Badge Color', 'essential-addons-elementor'),
286
- 'type' => Controls_Manager::COLOR,
287
- 'default' => '#fff',
288
- 'selectors' => [
289
- '{{WRAPPER}} .woocommerce ul.products li.product .onsale' => 'color: {{VALUE}};',
290
- ],
291
- ]
292
- );
293
-
294
- $this->add_control(
295
- 'eael_product_grid_sale_badge_background',
296
- [
297
- 'label' => esc_html__('Sale Badge Background', 'essential-addons-elementor'),
298
- 'type' => Controls_Manager::COLOR,
299
- 'default' => '#ff2a13',
300
- 'selectors' => [
301
- '{{WRAPPER}} .woocommerce ul.products li.product .onsale' => 'background-color: {{VALUE}};',
302
- '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price ins' => 'color: {{VALUE}};',
303
- ],
304
- ]
305
- );
306
-
307
- $this->add_group_control(
308
- Group_Control_Typography::get_type(),
309
- [
310
- 'name' => 'eael_product_grid_sale_badge_typography',
311
- 'selector' => '{{WRAPPER}} .woocommerce ul.products li.product .onsale',
312
- ]
313
- );
314
-
315
- $this->end_controls_section();
316
-
317
- $this->start_controls_section(
318
- 'eael_section_product_grid_add_to_cart_styles',
319
- [
320
- 'label' => esc_html__('Add to Cart Button Styles', 'essential-addons-elementor'),
321
- 'tab' => Controls_Manager::TAB_STYLE,
322
- ]
323
- );
324
-
325
- $this->start_controls_tabs('eael_product_grid_add_to_cart_style_tabs');
326
-
327
- $this->start_controls_tab('normal', ['label' => esc_html__('Normal', 'essential-addons-elementor')]);
328
-
329
- $this->add_control(
330
- 'eael_product_grid_add_to_cart_color',
331
- [
332
- 'label' => esc_html__('Button Color', 'essential-addons-elementor'),
333
- 'type' => Controls_Manager::COLOR,
334
- 'default' => '#fff',
335
- 'selectors' => [
336
- '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button' => 'color: {{VALUE}};',
337
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link' => 'color: {{VALUE}};',
338
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart' => 'color: {{VALUE}};',
339
- ],
340
- ]
341
- );
342
-
343
- $this->add_control(
344
- 'eael_product_grid_add_to_cart_background',
345
- [
346
- 'label' => esc_html__('Button Background Color', 'essential-addons-elementor'),
347
- 'type' => Controls_Manager::COLOR,
348
- 'default' => '#333',
349
- 'selectors' => [
350
- '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button' => 'background-color: {{VALUE}};',
351
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link' => 'background-color: {{VALUE}};',
352
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart' => 'background-color: {{VALUE}};',
353
- ],
354
- ]
355
- );
356
-
357
- $this->add_group_control(
358
- Group_Control_Border::get_type(),
359
- [
360
- 'name' => 'eael_product_grid_add_to_cart_border',
361
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button, {{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link, {{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart',
362
- ]
363
- );
364
-
365
- $this->add_group_control(
366
- Group_Control_Typography::get_type(),
367
- [
368
- 'name' => 'eael_product_grid_add_to_cart_typography',
369
- 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button',
370
- 'condition' => [
371
- 'eael_product_grid_style_preset' => ['eael-product-default', 'eael-product-simple']
372
- ],
373
- ]
374
- );
375
-
376
- $this->end_controls_tab();
377
-
378
- $this->start_controls_tab('eael_product_grid_add_to_cart_hover_styles', ['label' => esc_html__('Hover', 'essential-addons-elementor')]);
379
-
380
- $this->add_control(
381
- 'eael_product_grid_add_to_cart_hover_color',
382
- [
383
- 'label' => esc_html__('Button Color', 'essential-addons-elementor'),
384
- 'type' => Controls_Manager::COLOR,
385
- 'default' => '#fff',
386
- 'selectors' => [
387
- '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'color: {{VALUE}};',
388
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'color: {{VALUE}};',
389
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'color: {{VALUE}};',
390
- ],
391
- ]
392
- );
393
-
394
- $this->add_control(
395
- 'eael_product_grid_add_to_cart_hover_background',
396
- [
397
- 'label' => esc_html__('Button Background Color', 'essential-addons-elementor'),
398
- 'type' => Controls_Manager::COLOR,
399
- 'default' => '#333',
400
- 'selectors' => [
401
- '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'background-color: {{VALUE}};',
402
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'background-color: {{VALUE}};',
403
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'background-color: {{VALUE}};',
404
- ],
405
- ]
406
- );
407
-
408
- $this->add_control(
409
- 'eael_product_grid_add_to_cart_hover_border_color',
410
- [
411
- 'label' => esc_html__('Border Color', 'essential-addons-elementor'),
412
- 'type' => Controls_Manager::COLOR,
413
- 'default' => '',
414
- 'selectors' => [
415
- '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'border-color: {{VALUE}};',
416
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'border-color: {{VALUE}};',
417
- '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'border-color: {{VALUE}};',
418
- ],
419
- ]
420
- );
421
-
422
- $this->end_controls_tab();
423
-
424
- $this->end_controls_tabs();
425
-
426
- $this->end_controls_section();
427
-
428
- }
429
-
430
- protected function render() {
431
- $settings = $this->get_settings();
432
- $show_rating = $settings['eael_product_grid_rating'];
433
-
434
- if ($settings['eael_product_grid_style_preset'] == 'eael-product-simple') {
435
- $grid_layout = 'eael-product-simple';
436
- } else if ($settings['eael_product_grid_style_preset'] == 'eael-product-reveal') {
437
- $grid_layout = 'eael-product-reveal';
438
- } else if ($settings['eael_product_grid_style_preset'] == 'eael-product-overlay') {
439
- $grid_layout = 'eael-product-overlay';
440
- } else {
441
- $grid_layout = 'eael-product-default';
442
- }
443
-
444
- $args = [
445
- 'post_type' => 'product',
446
- 'posts_per_page' => $settings['eael_product_grid_products_count'] ?: 4,
447
- 'order' => 'DESC',
448
- ];
449
-
450
- if (!empty($settings['eael_product_grid_categories'])) {
451
- $args['tax_query'] = [
452
- [
453
- 'taxonomy' => 'product_cat',
454
- 'field' => 'slug',
455
- 'terms' => $settings['eael_product_grid_categories'],
456
- 'operator' => 'IN',
457
- ],
458
- ];
459
- }
460
-
461
- if ($settings['eael_product_grid_product_filter'] == 'featured-products') {
462
- $args['tax_query'] = [
463
- 'taxonomy' => 'product_visibility',
464
- 'field' => 'name',
465
- 'terms' => 'featured',
466
- ];
467
- } else if ($settings['eael_product_grid_product_filter'] == 'best-selling-products') {
468
- $args['meta_key'] = 'total_sales';
469
- $args['orderby'] = 'meta_value_num';
470
- $args['order'] = 'DESC';
471
- } else if ($settings['eael_product_grid_product_filter'] == 'sale-products') {
472
- $args['meta_query'] = [
473
- 'relation' => 'OR',
474
- [
475
- 'key' => '_sale_price',
476
- 'value' => 0,
477
- 'compare' => '>',
478
- 'type' => 'numeric',
479
- ], [
480
- 'key' => '_min_variation_sale_price',
481
- 'value' => 0,
482
- 'compare' => '>',
483
- 'type' => 'numeric',
484
- ],
485
- ];
486
- } else if ($settings['eael_product_grid_product_filter'] == 'top-products') {
487
- $args['meta_key'] = '_wc_average_rating';
488
- $args['orderby'] = 'meta_value_num';
489
- $args['order'] = 'DESC';
490
- }
491
-
492
- global $woocommerce_loop;
493
- $woocommerce_loop['loop'] = $woocommerce_loop['columns'] = $settings['eael_product_grid_column'];
494
-
495
- echo '<div class="eael-product-grid ' . $grid_layout . '">
496
  <div class="woocommerce">
497
  <ul class="products eael-product-columns-' . $settings['eael_product_grid_column'] . '">';
498
- $query = new \WP_Query($args);
499
- if ($query->have_posts()) {
500
- while ($query->have_posts()): $query->the_post();
501
- include ESSENTIAL_ADDONS_EL_PATH . 'includes/templates/product-loop.php';
502
- endwhile;
503
- } else {
504
- echo __('No products found');
505
- }
506
- wp_reset_postdata();
507
- unset($woocommerce_loop);
508
- echo '</ul>
509
  </div>
510
  </div>';
511
- }
512
 
513
- protected function content_template() {
 
514
 
515
- }
516
  }
517
 
518
- Plugin::instance()->widgets_manager->register_widget_type(new Widget_Eael_Product_Grid());
2
  namespace Elementor;
3
 
4
  if (!defined('ABSPATH')) {
5
+ exit;
6
  }
7
  // If this file is called directly, abort.
8
 
9
+ class Widget_Eael_Product_Grid extends Widget_Base
10
+ {
11
+
12
+ public function get_name()
13
+ {
14
+ return 'eicon-woocommerce';
15
+ }
16
+
17
+ public function get_title()
18
+ {
19
+ return esc_html__('EA Product Grid', 'essential-addons-elementor');
20
+ }
21
+
22
+ public function get_icon()
23
+ {
24
+ return 'eicon-woocommerce';
25
+ }
26
+
27
+ public function get_categories()
28
+ {
29
+ return ['essential-addons-elementor'];
30
+ }
31
+
32
+ protected function _register_controls()
33
+ {
34
+
35
+ // Content Controls
36
+ $this->start_controls_section(
37
+ 'eael_section_product_grid_settings',
38
+ [
39
+ 'label' => esc_html__('Product Settings', 'essential-addons-elementor'),
40
+ ]
41
+ );
42
+
43
+ $this->add_control(
44
+ 'eael_product_grid_product_filter',
45
+ [
46
+ 'label' => esc_html__('Filter By', 'essential-addons-elementor'),
47
+ 'type' => Controls_Manager::SELECT,
48
+ 'default' => 'recent-products',
49
+ 'options' => [
50
+ 'recent-products' => esc_html__('Recent Products', 'essential-addons-elementor'),
51
+ 'featured-products' => esc_html__('Featured Products', 'essential-addons-elementor'),
52
+ 'best-selling-products' => esc_html__('Best Selling Products', 'essential-addons-elementor'),
53
+ 'sale-products' => esc_html__('Sale Products', 'essential-addons-elementor'),
54
+ 'top-products' => esc_html__('Top Rated Products', 'essential-addons-elementor'),
55
+ ],
56
+ ]
57
+ );
58
+
59
+ $this->add_control(
60
+ 'eael_product_grid_column',
61
+ [
62
+ 'label' => esc_html__('Columns', 'essential-addons-elementor'),
63
+ 'type' => Controls_Manager::SELECT,
64
+ 'default' => '4',
65
+ 'options' => [
66
+ '1' => esc_html__('1', 'essential-addons-elementor'),
67
+ '2' => esc_html__('2', 'essential-addons-elementor'),
68
+ '3' => esc_html__('3', 'essential-addons-elementor'),
69
+ '4' => esc_html__('4', 'essential-addons-elementor'),
70
+ '5' => esc_html__('5', 'essential-addons-elementor'),
71
+ '6' => esc_html__('6', 'essential-addons-elementor'),
72
+ ],
73
+ ]
74
+ );
75
+
76
+ $this->add_control(
77
+ 'eael_product_grid_products_count',
78
+ [
79
+ 'label' => __('Products Count', 'essential-addons-elementor'),
80
+ 'type' => Controls_Manager::NUMBER,
81
+ 'default' => 4,
82
+ 'min' => 1,
83
+ 'max' => 1000,
84
+ 'step' => 1,
85
+ ]
86
+ );
87
+
88
+ $this->add_control(
89
+ 'eael_product_grid_categories',
90
+ [
91
+ 'label' => esc_html__('Product Categories', 'essential-addons-elementor'),
92
+ 'type' => Controls_Manager::SELECT2,
93
+ 'label_block' => true,
94
+ 'multiple' => true,
95
+ 'options' => eael_woocommerce_product_categories(),
96
+ ]
97
+ );
98
+
99
+ $this->add_control(
100
+ 'eael_product_grid_style_preset',
101
+ [
102
+ 'label' => esc_html__('Style Preset', 'essential-addons-elementor'),
103
+ 'type' => Controls_Manager::SELECT,
104
+ 'default' => 'eael-product-simple',
105
+ 'options' => [
106
+ 'eael-product-default' => esc_html__('Default', 'essential-addons-elementor'),
107
+ 'eael-product-simple' => esc_html__('Simple Style', 'essential-addons-elementor'),
108
+ 'eael-product-reveal' => esc_html__('Reveal Style', 'essential-addons-elementor'),
109
+ 'eael-product-overlay' => esc_html__('Overlay Style', 'essential-addons-elementor'),
110
+ ],
111
+ ]
112
+ );
113
+
114
+ $this->add_control(
115
+ 'eael_product_grid_rating',
116
+ [
117
+ 'label' => esc_html__('Show Product Rating?', 'essential-addons-elementor'),
118
+ 'type' => Controls_Manager::SWITCHER,
119
+ 'return_value' => 'yes',
120
+ 'default' => 'yes',
121
+ ]
122
+ );
123
+
124
+ $this->end_controls_section();
125
+
126
+ $this->start_controls_section(
127
+ 'eael_product_grid_styles',
128
+ [
129
+ 'label' => esc_html__('Products Styles', 'essential-addons-elementor'),
130
+ 'tab' => Controls_Manager::TAB_STYLE,
131
+ ]
132
+ );
133
+
134
+ $this->add_control(
135
+ 'eael_product_grid_background_color',
136
+ [
137
+ 'label' => esc_html__('Content Background Color', 'essential-addons-elementor'),
138
+ 'type' => Controls_Manager::COLOR,
139
+ 'default' => '#fff',
140
+ 'selectors' => [
141
+ '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product' => 'background-color: {{VALUE}};',
142
+ ],
143
+ ]
144
+ );
145
+
146
+ $this->add_group_control(
147
+ Group_Control_Border::get_type(),
148
+ [
149
+ 'name' => 'eael_peoduct_grid_border',
150
+ 'fields_options' => [
151
+ 'border' => [
152
+ 'default' => 'solid',
153
+ ],
154
+ 'width' => [
155
+ 'default' => [
156
+ 'top' => '1',
157
+ 'right' => '1',
158
+ 'bottom' => '1',
159
+ 'left' => '1',
160
+ 'isLinked' => false,
161
+ ],
162
+ ],
163
+ 'color' => [
164
+ 'default' => '#eee',
165
+ ],
166
+ ],
167
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product',
168
+ 'condition' => [
169
+ 'eael_product_grid_style_preset' => ['eael-product-default', 'eael-product-simple', 'eael-product-overlay'],
170
+ ],
171
+ ]
172
+ );
173
+
174
+ $this->add_control(
175
+ 'eael_peoduct_grid_border_radius',
176
+ [
177
+ 'label' => esc_html__('Border Radius', 'essential-addons-elementor'),
178
+ 'type' => Controls_Manager::DIMENSIONS,
179
+ 'selectors' => [
180
+ '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
181
+ ],
182
+ ]
183
+ );
184
+
185
+ $this->end_controls_section();
186
+
187
+ $this->start_controls_section(
188
+ 'eael_section_product_grid_typography',
189
+ [
190
+ 'label' => esc_html__('Color &amp; Typography', 'essential-addons-elementor'),
191
+ 'tab' => Controls_Manager::TAB_STYLE,
192
+ ]
193
+ );
194
+
195
+ $this->add_control(
196
+ 'eael_product_grid_product_title_heading',
197
+ [
198
+ 'label' => __('Product Title', 'essential-addons-elementor'),
199
+ 'type' => Controls_Manager::HEADING,
200
+ ]
201
+ );
202
+
203
+ $this->add_control(
204
+ 'eael_product_grid_product_title_color',
205
+ [
206
+ 'label' => esc_html__('Product Title Color', 'essential-addons-elementor'),
207
+ 'type' => Controls_Manager::COLOR,
208
+ 'default' => '#272727',
209
+ 'selectors' => [
210
+ '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .woocommerce-loop-product__title' => 'color: {{VALUE}};',
211
+ ],
212
+ ]
213
+ );
214
+
215
+ $this->add_group_control(
216
+ Group_Control_Typography::get_type(),
217
+ [
218
+ 'name' => 'eael_product_grid_product_title_typography',
219
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .woocommerce-loop-product__title',
220
+ ]
221
+ );
222
+
223
+ $this->add_control(
224
+ 'eael_product_grid_product_price_heading',
225
+ [
226
+ 'label' => __('Product Price', 'essential-addons-elementor'),
227
+ 'type' => Controls_Manager::HEADING,
228
+ ]
229
+ );
230
+
231
+ $this->add_control(
232
+ 'eael_product_grid_product_price_color',
233
+ [
234
+ 'label' => esc_html__('Product Price Color', 'essential-addons-elementor'),
235
+ 'type' => Controls_Manager::COLOR,
236
+ 'default' => '#272727',
237
+ 'selectors' => [
238
+ '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price' => 'color: {{VALUE}};',
239
+ ],
240
+ ]
241
+ );
242
+
243
+ $this->add_group_control(
244
+ Group_Control_Typography::get_type(),
245
+ [
246
+ 'name' => 'eael_product_grid_product_price_typography',
247
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price',
248
+ ]
249
+ );
250
+
251
+ $this->add_control(
252
+ 'eael_product_grid_product_rating_heading',
253
+ [
254
+ 'label' => __('Star Rating', 'essential-addons-elementor'),
255
+ 'type' => Controls_Manager::HEADING,
256
+ ]
257
+ );
258
+
259
+ $this->add_control(
260
+ 'eael_product_grid_product_rating_color',
261
+ [
262
+ 'label' => esc_html__('Rating Color', 'essential-addons-elementor'),
263
+ 'type' => Controls_Manager::COLOR,
264
+ 'default' => '#f2b01e',
265
+ 'selectors' => [
266
+ '{{WRAPPER}} .eael-product-grid .woocommerce .star-rating::before' => 'color: {{VALUE}};',
267
+ '{{WRAPPER}} .eael-product-grid .woocommerce .star-rating span::before' => 'color: {{VALUE}};',
268
+ ],
269
+ ]
270
+ );
271
+
272
+ $this->add_group_control(
273
+ Group_Control_Typography::get_type(),
274
+ [
275
+ 'name' => 'eael_product_grid_product_rating_typography',
276
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .star-rating',
277
+ ]
278
+ );
279
+
280
+ $this->add_control(
281
+ 'eael_product_grid_sale_badge_heading',
282
+ [
283
+ 'label' => __('Sale Badge', 'essential-addons-elementor'),
284
+ 'type' => Controls_Manager::HEADING,
285
+ ]
286
+ );
287
+
288
+ $this->add_control(
289
+ 'eael_product_grid_sale_badge_color',
290
+ [
291
+ 'label' => esc_html__('Sale Badge Color', 'essential-addons-elementor'),
292
+ 'type' => Controls_Manager::COLOR,
293
+ 'default' => '#fff',
294
+ 'selectors' => [
295
+ '{{WRAPPER}} .woocommerce ul.products li.product .onsale' => 'color: {{VALUE}};',
296
+ ],
297
+ ]
298
+ );
299
+
300
+ $this->add_control(
301
+ 'eael_product_grid_sale_badge_background',
302
+ [
303
+ 'label' => esc_html__('Sale Badge Background', 'essential-addons-elementor'),
304
+ 'type' => Controls_Manager::COLOR,
305
+ 'default' => '#ff2a13',
306
+ 'selectors' => [
307
+ '{{WRAPPER}} .woocommerce ul.products li.product .onsale' => 'background-color: {{VALUE}};',
308
+ '{{WRAPPER}} .eael-product-grid .woocommerce ul.products li.product .price ins' => 'color: {{VALUE}};',
309
+ ],
310
+ ]
311
+ );
312
+
313
+ $this->add_group_control(
314
+ Group_Control_Typography::get_type(),
315
+ [
316
+ 'name' => 'eael_product_grid_sale_badge_typography',
317
+ 'selector' => '{{WRAPPER}} .woocommerce ul.products li.product .onsale',
318
+ ]
319
+ );
320
+
321
+ $this->end_controls_section();
322
+
323
+ $this->start_controls_section(
324
+ 'eael_section_product_grid_add_to_cart_styles',
325
+ [
326
+ 'label' => esc_html__('Add to Cart Button Styles', 'essential-addons-elementor'),
327
+ 'tab' => Controls_Manager::TAB_STYLE,
328
+ ]
329
+ );
330
+
331
+ $this->start_controls_tabs('eael_product_grid_add_to_cart_style_tabs');
332
+
333
+ $this->start_controls_tab('normal', ['label' => esc_html__('Normal', 'essential-addons-elementor')]);
334
+
335
+ $this->add_control(
336
+ 'eael_product_grid_add_to_cart_color',
337
+ [
338
+ 'label' => esc_html__('Button Color', 'essential-addons-elementor'),
339
+ 'type' => Controls_Manager::COLOR,
340
+ 'default' => '#fff',
341
+ 'selectors' => [
342
+ '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button' => 'color: {{VALUE}};',
343
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link' => 'color: {{VALUE}};',
344
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart' => 'color: {{VALUE}};',
345
+ ],
346
+ ]
347
+ );
348
+
349
+ $this->add_control(
350
+ 'eael_product_grid_add_to_cart_background',
351
+ [
352
+ 'label' => esc_html__('Button Background Color', 'essential-addons-elementor'),
353
+ 'type' => Controls_Manager::COLOR,
354
+ 'default' => '#333',
355
+ 'selectors' => [
356
+ '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button' => 'background-color: {{VALUE}};',
357
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link' => 'background-color: {{VALUE}};',
358
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart' => 'background-color: {{VALUE}};',
359
+ ],
360
+ ]
361
+ );
362
+
363
+ $this->add_group_control(
364
+ Group_Control_Border::get_type(),
365
+ [
366
+ 'name' => 'eael_product_grid_add_to_cart_border',
367
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button, {{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link, {{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart',
368
+ ]
369
+ );
370
+
371
+ $this->add_group_control(
372
+ Group_Control_Typography::get_type(),
373
+ [
374
+ 'name' => 'eael_product_grid_add_to_cart_typography',
375
+ 'selector' => '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button',
376
+ 'condition' => [
377
+ 'eael_product_grid_style_preset' => ['eael-product-default', 'eael-product-simple'],
378
+ ],
379
+ ]
380
+ );
381
+
382
+ $this->end_controls_tab();
383
+
384
+ $this->start_controls_tab('eael_product_grid_add_to_cart_hover_styles', ['label' => esc_html__('Hover', 'essential-addons-elementor')]);
385
+
386
+ $this->add_control(
387
+ 'eael_product_grid_add_to_cart_hover_color',
388
+ [
389
+ 'label' => esc_html__('Button Color', 'essential-addons-elementor'),
390
+ 'type' => Controls_Manager::COLOR,
391
+ 'default' => '#fff',
392
+ 'selectors' => [
393
+ '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'color: {{VALUE}};',
394
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'color: {{VALUE}};',
395
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'color: {{VALUE}};',
396
+ ],
397
+ ]
398
+ );
399
+
400
+ $this->add_control(
401
+ 'eael_product_grid_add_to_cart_hover_background',
402
+ [
403
+ 'label' => esc_html__('Button Background Color', 'essential-addons-elementor'),
404
+ 'type' => Controls_Manager::COLOR,
405
+ 'default' => '#333',
406
+ 'selectors' => [
407
+ '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'background-color: {{VALUE}};',
408
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'background-color: {{VALUE}};',
409
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'background-color: {{VALUE}};',
410
+ ],
411
+ ]
412
+ );
413
+
414
+ $this->add_control(
415
+ 'eael_product_grid_add_to_cart_hover_border_color',
416
+ [
417
+ 'label' => esc_html__('Border Color', 'essential-addons-elementor'),
418
+ 'type' => Controls_Manager::COLOR,
419
+ 'default' => '',
420
+ 'selectors' => [
421
+ '{{WRAPPER}} .eael-product-grid .woocommerce li.product .button.add_to_cart_button:hover' => 'border-color: {{VALUE}};',
422
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:hover' => 'border-color: {{VALUE}};',
423
+ '{{WRAPPER}} .eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:hover' => 'border-color: {{VALUE}};',
424
+ ],
425
+ ]
426
+ );
427
+
428
+ $this->end_controls_tab();
429
+
430
+ $this->end_controls_tabs();
431
+
432
+ $this->end_controls_section();
433
+
434
+ }
435
+
436
+ protected function render()
437
+ {
438
+ $settings = $this->get_settings();
439
+ $show_rating = $settings['eael_product_grid_rating'];
440
+
441
+ if ($settings['eael_product_grid_style_preset'] == 'eael-product-simple') {
442
+ $grid_layout = 'eael-product-simple';
443
+ } else if ($settings['eael_product_grid_style_preset'] == 'eael-product-reveal') {
444
+ $grid_layout = 'eael-product-reveal';
445
+ } else if ($settings['eael_product_grid_style_preset'] == 'eael-product-overlay') {
446
+ $grid_layout = 'eael-product-overlay';
447
+ } else {
448
+ $grid_layout = 'eael-product-default';
449
+ }
450
+
451
+ $args = [
452
+ 'post_type' => 'product',
453
+ 'posts_per_page' => $settings['eael_product_grid_products_count'] ?: 4,
454
+ 'order' => 'DESC',
455
+ ];
456
+
457
+ if (!empty($settings['eael_product_grid_categories'])) {
458
+ $args['tax_query'] = [
459
+ [
460
+ 'taxonomy' => 'product_cat',
461
+ 'field' => 'slug',
462
+ 'terms' => $settings['eael_product_grid_categories'],
463
+ 'operator' => 'IN',
464
+ ],
465
+ ];
466
+ }
467
+
468
+ if ($settings['eael_product_grid_product_filter'] == 'featured-products') {
469
+ $args['tax_query'] = [
470
+ [
471
+ 'taxonomy' => 'product_visibility',
472
+ 'field' => 'name',
473
+ 'terms' => 'featured'
474
  ]
475
+ ];
476
+ } else if ($settings['eael_product_grid_product_filter'] == 'best-selling-products') {
477
+ $args['meta_key'] = 'total_sales';
478
+ $args['orderby'] = 'meta_value_num';
479
+ $args['order'] = 'DESC';
480
+ } else if ($settings['eael_product_grid_product_filter'] == 'sale-products') {
481
+ $args['meta_query'] = [
482
+ 'relation' => 'OR',
483
+ [
484
+ 'key' => '_sale_price',
485
+ 'value' => 0,
486
+ 'compare' => '>',
487
+ 'type' => 'numeric',
488
+ ], [
489
+ 'key' => '_min_variation_sale_price',
490
+ 'value' => 0,
491
+ 'compare' => '>',
492
+ 'type' => 'numeric',
493
+ ],
494
+ ];
495
+ } else if ($settings['eael_product_grid_product_filter'] == 'top-products') {
496
+ $args['meta_key'] = '_wc_average_rating';
497
+ $args['orderby'] = 'meta_value_num';
498
+ $args['order'] = 'DESC';
499
+ }
500
+
501
+ global $woocommerce_loop;
502
+ $woocommerce_loop['loop'] = $woocommerce_loop['columns'] = $settings['eael_product_grid_column'];
503
+
504
+ echo '<div class="eael-product-grid ' . $grid_layout . '">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
505
  <div class="woocommerce">
506
  <ul class="products eael-product-columns-' . $settings['eael_product_grid_column'] . '">';
507
+ $query = new \WP_Query($args);
508
+ if ($query->have_posts()) {
509
+ while ($query->have_posts()): $query->the_post();
510
+ include ESSENTIAL_ADDONS_EL_PATH . 'includes/templates/product-loop.php';
511
+ endwhile;
512
+ } else {
513
+ echo __('No products found');
514
+ }
515
+ wp_reset_postdata();
516
+ unset($woocommerce_loop);
517
+ echo '</ul>
518
  </div>
519
  </div>';
520
+ }
521
 
522
+ protected function content_template()
523
+ {
524
 
525
+ }
526
  }
527
 
528
+ Plugin::instance()->widgets_manager->register_widget_type(new Widget_Eael_Product_Grid());
essential_adons_elementor.php CHANGED
@@ -4,7 +4,7 @@
4
  * Description: The ultimate elements library for Elementor page builder plugin for WordPress.
5
  * Plugin URI: https://essential-addons.com/elementor/
6
  * Author: WPDeveloper
7
- * Version: 2.9.4
8
  * Author URI: https://wpdeveloper.net/
9
  *
10
  * Text Domain: essential-addons-elementor
@@ -16,8 +16,8 @@ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
  define( 'ESSENTIAL_ADDONS_EL_URL', plugins_url( '/', __FILE__ ) );
17
  define( 'ESSENTIAL_ADDONS_EL_PATH', plugin_dir_path( __FILE__ ) );
18
  define( 'ESSENTIAL_ADDONS_EL_ROOT', __FILE__ );
19
- define( 'ESSENTIAL_ADDONS_VERSION', '2.9.4' );
20
- define( 'ESSENTIAL_ADDONS_STABLE_VERSION', '2.9.4' );
21
  define( 'ESSENTIAL_ADDONS_BASENAME', plugin_basename( __FILE__ ) );
22
 
23
 
@@ -37,7 +37,7 @@ require_once ESSENTIAL_ADDONS_EL_PATH.'includes/extensions.php';
37
  */
38
  function eael_activated_modules() {
39
 
40
- $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form', 'caldera-form', 'wisdom_registered_setting', 'twitter-feed', 'facebook-feed', 'data-table', 'filter-gallery', 'image-accordion','content-ticker', 'tooltip', 'adv-accordion', 'adv-tabs', 'progress-bar', 'section-particles' ];
41
 
42
  $eael_default_settings = array_fill_keys( $eael_default_keys, true );
43
  $eael_get_settings = get_option( 'eael_save_settings', $eael_default_settings );
@@ -315,7 +315,7 @@ if( ! function_exists( 'essential_addons_elementor_lite_start_plugin_tracking' )
315
  function essential_addons_elementor_lite_start_plugin_tracking() {
316
  $wisdom = new Eael_Plugin_Usage_Tracker(
317
  __FILE__,
318
- 'https://wpdeveloper.net',
319
  array(),
320
  true,
321
  true,
4
  * Description: The ultimate elements library for Elementor page builder plugin for WordPress.
5
  * Plugin URI: https://essential-addons.com/elementor/
6
  * Author: WPDeveloper
7
+ * Version: 2.9.5
8
  * Author URI: https://wpdeveloper.net/
9
  *
10
  * Text Domain: essential-addons-elementor
16
  define( 'ESSENTIAL_ADDONS_EL_URL', plugins_url( '/', __FILE__ ) );
17
  define( 'ESSENTIAL_ADDONS_EL_PATH', plugin_dir_path( __FILE__ ) );
18
  define( 'ESSENTIAL_ADDONS_EL_ROOT', __FILE__ );
19
+ define( 'ESSENTIAL_ADDONS_VERSION', '2.9.5' );
20
+ define( 'ESSENTIAL_ADDONS_STABLE_VERSION', '2.9.5' );
21
  define( 'ESSENTIAL_ADDONS_BASENAME', plugin_basename( __FILE__ ) );
22
 
23
 
37
  */
38
  function eael_activated_modules() {
39
 
40
+ $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form', 'caldera-form', 'twitter-feed', 'facebook-feed', 'data-table', 'filter-gallery', 'image-accordion','content-ticker', 'tooltip', 'adv-accordion', 'adv-tabs', 'progress-bar', 'section-particles' ];
41
 
42
  $eael_default_settings = array_fill_keys( $eael_default_keys, true );
43
  $eael_get_settings = get_option( 'eael_save_settings', $eael_default_settings );
315
  function essential_addons_elementor_lite_start_plugin_tracking() {
316
  $wisdom = new Eael_Plugin_Usage_Tracker(
317
  __FILE__,
318
+ 'http://app.wpdeveloper.net',
319
  array(),
320
  true,
321
  true,
extensions/eael-particle-section/eael-particle-section.php CHANGED
File without changes
extensions/eael-particle-section/particle-themes.php CHANGED
File without changes
includes/class-plugin-usage-tracker.php CHANGED
@@ -14,7 +14,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
14
 
15
  class Eael_Plugin_Usage_Tracker {
16
 
17
- private $wisdom_version = '1.1.2';
18
  private $home_url = '';
19
  private $plugin_file = '';
20
  private $plugin_name = '';
@@ -23,6 +23,13 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
23
  private $include_goodbye_form = true;
24
  private $marketing = false;
25
  private $collect_email = false;
 
 
 
 
 
 
 
26
 
27
  /**
28
  * Class constructor
@@ -62,13 +69,44 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
62
  $this->init();
63
 
64
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
  public function init() {
 
 
 
67
  // Check marketing
68
  if( $this->marketing == 3 ) {
69
  $this->set_can_collect_email( true, $this->plugin_name );
70
  }
71
-
72
  // Check whether opt-in is required
73
  // If not, then tracking is allowed
74
  if( ! $this->require_optin ) {
@@ -77,12 +115,14 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
77
  $this->update_block_notice();
78
  $this->do_tracking( true );
79
  }
80
-
81
  // Hook our do_tracking function to the daily action
 
 
82
  add_action( 'put_do_weekly_action', array( $this, 'do_tracking' ) );
83
 
84
- // Use this action for local testing
85
- // add_action( 'admin_init', array( $this, 'do_tracking' ) );
 
86
 
87
  // Display the admin notice on activation
88
  add_action( 'wpdeveloper_optin_notice', array( $this, 'optin_notice' ) );
@@ -108,7 +148,16 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
108
  wp_schedule_event( time(), 'daily', 'put_do_weekly_action' );
109
  }
110
  }
111
-
 
 
 
 
 
 
 
 
 
112
  /**
113
  * This is our function to get everything going
114
  * Check that user has opted in
@@ -143,7 +192,6 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
143
 
144
  // Send the data
145
  $this->send_data( $body );
146
-
147
  }
148
 
149
  /**
@@ -192,7 +240,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
192
  'site_version' => get_bloginfo( 'version' ),
193
  'site_language' => get_bloginfo( 'language' ),
194
  'charset' => get_bloginfo( 'charset' ),
195
- 'wisdom_version' => $this->wisdom_version,
196
  'php_version' => phpversion(),
197
  'multisite' => is_multisite(),
198
  'file_location' => __FILE__
@@ -266,7 +314,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
266
  foreach( $options as $option ) {
267
  $fields = get_option( $option );
268
  // Check for permission to send this option
269
- if( isset( $fields['wisdom_registered_setting'] ) ) {
270
  foreach( $fields as $key=>$value ) {
271
  $plugin_options[$key] = $value;
272
  }
@@ -323,11 +371,11 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
323
  $body['deactivated_date'] = time();
324
 
325
  // Add deactivation form data
326
- if( false !== get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ) ) {
327
- $body['deactivation_reason'] = get_option( 'wisdom_deactivation_reason_' . $this->plugin_name );
328
  }
329
- if( false !== get_option( 'wisdom_deactivation_details_' . $this->plugin_name ) ) {
330
- $body['deactivation_details'] = get_option( 'wisdom_deactivation_details_' . $this->plugin_name );
331
  }
332
 
333
  $this->send_data( $body );
@@ -345,8 +393,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
345
  $this->set_is_tracking_allowed( false, $this->plugin_name );
346
  return false;
347
  }
348
- // The wisdom_allow_tracking option is an array of plugins that are being tracked
349
- $allow_tracking = get_option( 'wisdom_allow_tracking' );
350
  // If this plugin is in the array, then tracking is allowed
351
  if( isset( $allow_tracking[$this->plugin_name] ) ) {
352
  return true;
@@ -365,8 +413,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
365
  if( empty( $plugin ) ) {
366
  $plugin = $this->plugin_name;
367
  }
368
- // The wisdom_allow_tracking option is an array of plugins that are being tracked
369
- $allow_tracking = get_option( 'wisdom_allow_tracking' );
370
 
371
  // If the user has decided to opt out
372
  if( $this->has_user_opted_out() ) {
@@ -387,7 +435,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
387
  unset( $allow_tracking[$plugin] );
388
  }
389
  }
390
- update_option( 'wisdom_allow_tracking', $allow_tracking );
391
  }
392
 
393
  /**
@@ -396,13 +444,13 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
396
  * @return Boolean
397
  */
398
  public function has_user_opted_out() {
399
- // Iterate through the options that are being tracked looking for wisdom_opt_out setting
400
  if( ! empty( $this->options ) ) {
401
  foreach( $this->options as $option_name ) {
402
  // Check each option
403
  $options = get_option( $option_name );
404
  // If we find the setting, return true
405
- if( ! empty( $options['wisdom_opt_out'] ) ) {
406
  return true;
407
  }
408
  }
@@ -416,7 +464,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
416
  */
417
  public function get_is_time_to_track() {
418
  // Let's see if we're due to track this plugin yet
419
- $track_times = get_option( 'wisdom_last_track_time', array() );
420
  if( ! isset( $track_times[$this->plugin_name] ) ) {
421
  // If we haven't set a time for this plugin yet, then we must track it
422
  return true;
@@ -435,10 +483,10 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
435
  */
436
  public function set_track_time() {
437
  // We've tracked, so record the time
438
- $track_times = get_option( 'wisdom_last_track_time', array() );
439
  // Set different times according to plugin, in case we are tracking multiple plugins
440
  $track_times[$this->plugin_name] = time();
441
- update_option( 'wisdom_last_track_time', $track_times );
442
  }
443
 
444
  /**
@@ -450,7 +498,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
450
  if( empty( $plugin ) ) {
451
  $plugin = $this->plugin_name;
452
  }
453
- $block_notice = get_option( 'wisdom_block_notice' );
454
  if( empty( $block_notice ) || ! is_array( $block_notice ) ) {
455
  // If nothing exists in the option yet, start a new array with the plugin name
456
  $block_notice = array( $plugin => $plugin );
@@ -458,7 +506,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
458
  // Else add the plugin name to the array
459
  $block_notice[$plugin] = $plugin;
460
  }
461
- update_option( 'wisdom_block_notice', $block_notice );
462
  }
463
 
464
  /**
@@ -466,8 +514,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
466
  * @since 1.0.0
467
  */
468
  public function get_can_collect_email() {
469
- // The wisdom_collect_email option is an array of plugins that are being tracked
470
- $collect_email = get_option( 'wisdom_collect_email' );
471
  // If this plugin is in the array, then we can collect the email address
472
  if( isset( $collect_email[$this->plugin_name] ) ) {
473
  return true;
@@ -486,8 +534,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
486
  if( empty( $plugin ) ) {
487
  $plugin = $this->plugin_name;
488
  }
489
- // The wisdom_collect_email option is an array of plugins that are being tracked
490
- $collect_email = get_option( 'wisdom_collect_email' );
491
  // If the user has agreed to allow tracking or if opt-in is not required
492
  if( $can_collect ) {
493
  if( empty( $collect_email ) || ! is_array( $collect_email ) ) {
@@ -502,7 +550,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
502
  unset( $collect_email[$plugin] );
503
  }
504
  }
505
- update_option( 'wisdom_collect_email', $collect_email );
506
  }
507
 
508
  /**
@@ -511,8 +559,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
511
  * @return Email address
512
  */
513
  public function get_admin_email() {
514
- // The wisdom_collect_email option is an array of plugins that are being tracked
515
- $email = get_option( 'wisdom_admin_emails' );
516
  // If this plugin is in the array, then we can collect the email address
517
  if( isset( $email[$this->plugin_name] ) ) {
518
  return $email[$this->plugin_name];
@@ -540,8 +588,8 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
540
  $email = $current_user->user_email;
541
  }
542
  }
543
- // The wisdom_admin_emails option is an array of admin email addresses
544
- $admin_emails = get_option( 'wisdom_admin_emails' );
545
  if( empty( $admin_emails ) || ! is_array( $admin_emails ) ) {
546
  // If nothing exists in the option yet, start a new array with the plugin name
547
  $admin_emails = array( $plugin => sanitize_email( $email ) );
@@ -549,15 +597,10 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
549
  // Else add the email address to the array, if not already set
550
  $admin_emails[$plugin] = sanitize_email( $email );
551
  }
552
- update_option( 'wisdom_admin_emails', $admin_emails );
553
  }
554
-
555
- /**
556
- * Display the admin notice to users to allow them to opt in
557
- *
558
- * @since 1.0.0
559
- */
560
- public function optin_notice() {
561
  // Check for plugin args
562
  if( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
563
  $plugin = sanitize_text_field( $_GET['plugin'] );
@@ -570,10 +613,17 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
570
  }
571
  $this->update_block_notice( $plugin );
572
  }
573
-
 
 
 
 
 
 
 
574
  // Check whether to block the notice, e.g. because we're in a local environment
575
- // wisdom_block_notice works the same as wisdom_allow_tracking, an array of plugin names
576
- $block_notice = get_option( 'wisdom_block_notice' );
577
  if( isset( $block_notice[$this->plugin_name] ) ) {
578
  return;
579
  }
@@ -584,7 +634,12 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
584
 
585
  // @credit EDD
586
  // Don't bother asking user to opt in if they're in local dev
587
- if ( stristr( network_site_url( '/' ), 'local' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) {
 
 
 
 
 
588
  $this->update_block_notice();
589
  } else {
590
 
@@ -622,7 +677,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
622
  $notice_text = __( 'Want to help make <strong>Essential Addons for Elementor</strong> even more awesome? You can get a <strong>25% discount coupon</strong> for Pro upgrade if you allow. <a class="insights-data-we-collect" href="#">What we collect.</a>', 'plugin-usage-tracker' );
623
  }
624
  // And we allow you to filter the text anyway
625
- $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
626
 
627
  <div class="notice notice-info updated put-dismiss-notice">
628
  <p><?php echo __( $notice_text ); ?></p>
@@ -671,7 +726,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
671
  ) );
672
 
673
  $marketing_text = __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this plugin, including details of new features and special offers?', 'plugin-usage-tracker' );
674
- $marketing_text = apply_filters( 'wisdom_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text ); ?>
675
 
676
  <div class="notice notice-info updated put-dismiss-notice">
677
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
@@ -695,8 +750,10 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
695
  }
696
  if( isset( $links['deactivate'] ) && $this->include_goodbye_form ) {
697
  $deactivation_link = $links['deactivate'];
 
 
698
  // Insert an onClick action to allow form before deactivating
699
- $deactivation_link = str_replace( '<a ', '<div class="put-goodbye-form-wrapper"><span class="put-goodbye-form" id="put-goodbye-form-' . esc_attr( $this->plugin_name ) . '"></span></div><a onclick="javascript:event.preventDefault();" id="put-goodbye-link-' . esc_attr( $this->plugin_name ) . '" ', $deactivation_link );
700
  $links['deactivate'] = $deactivation_link;
701
  }
702
  return $links;
@@ -711,16 +768,23 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
711
  $form = array();
712
  $form['heading'] = __( 'Sorry to see you go', 'plugin-usage-tracker' );
713
  $form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'plugin-usage-tracker' );
 
714
  $form['options'] = array(
715
- __( 'Set up is too difficult', 'plugin-usage-tracker' ),
716
- __( 'Lack of documentation', 'plugin-usage-tracker' ),
717
- __( 'Not the features I wanted', 'plugin-usage-tracker' ),
718
- __( 'Found a better plugin', 'plugin-usage-tracker' ),
719
- __( 'Installed by mistake', 'plugin-usage-tracker' ),
720
- __( 'Only required temporarily', 'plugin-usage-tracker' ),
721
- __( 'Didn\'t work', 'plugin-usage-tracker' )
 
 
 
 
 
 
722
  );
723
- $form['details'] = __( 'Details (optional)', 'plugin-usage-tracker' );
724
  return $form;
725
  }
726
 
@@ -732,7 +796,7 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
732
  */
733
  public function form_filterable_text() {
734
  $form = $this->form_default_text();
735
- return apply_filters( 'wisdom_form_text_' . esc_attr( $this->plugin_name ), $form );
736
  }
737
 
738
  /**
@@ -748,59 +812,105 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
748
  $form = $this->form_default_text();
749
  }
750
  // Build the HTML to go in the form
751
- $html = '<div class="put-goodbye-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
752
- $html .= '<div class="put-goodbye-form-body"><p>' . esc_html( $form['body'] ) . '</p>';
753
  if( is_array( $form['options'] ) ) {
754
- $html .= '<div class="put-goodbye-options"><p>';
755
  foreach( $form['options'] as $option ) {
756
- $html .= '<input type="checkbox" name="put-goodbye-options[]" id="' . str_replace( " ", "", esc_attr( $option ) ) . '" value="' . esc_attr( $option ) . '"> <label for="' . str_replace( " ", "", esc_attr( $option ) ) . '">' . esc_attr( $option ) . '</label><br>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
757
  }
758
- $html .= '</p><label for="put-goodbye-reasons">' . esc_html( $form['details'] ) .'</label><textarea name="put-goodbye-reasons" id="put-goodbye-reasons" rows="2" style="width:100%"></textarea>';
759
- $html .= '</div><!-- .put-goodbye-options -->';
760
  }
761
- $html .= '</div><!-- .put-goodbye-form-body -->';
762
  $html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'plugin-usage-tracker' ) . '</p>';
763
  ?>
764
- <div class="put-goodbye-form-bg"></div>
765
  <style type="text/css">
766
- .put-form-active .put-goodbye-form-bg {
767
- background: rgba( 0, 0, 0, .5 );
768
  position: fixed;
769
  top: 0;
770
  left: 0;
771
  width: 100%;
772
  height: 100%;
 
773
  }
774
- .put-goodbye-form-wrapper {
775
  position: relative;
776
- z-index: 999;
777
  display: none;
778
  }
779
- .put-form-active .put-goodbye-form-wrapper {
780
- display: block;
 
 
 
 
 
 
 
781
  }
782
- .put-goodbye-form {
783
  display: none;
784
  }
785
- .put-form-active .put-goodbye-form {
786
- position: absolute;
787
- bottom: 30px;
788
- left: 0;
789
- max-width: 400px;
790
  background: #fff;
 
 
791
  white-space: normal;
 
 
 
792
  }
793
- .put-goodbye-form-head {
794
- background: #0073aa;
795
- color: #fff;
796
- padding: 8px 18px;
 
 
797
  }
798
- .put-goodbye-form-body {
 
 
 
799
  padding: 8px 18px;
800
- color: #444;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
801
  }
802
  .deactivating-spinner {
803
- display: none;
 
804
  }
805
  .deactivating-spinner .spinner {
806
  float: none;
@@ -808,37 +918,80 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
808
  vertical-align: bottom;
809
  visibility: visible;
810
  }
811
- .put-goodbye-form-footer {
812
  padding: 8px 18px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
813
  }
814
  </style>
815
  <script>
816
  jQuery(document).ready(function($){
817
- $("#put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>").on("click",function(){
818
  // We'll send the user to this deactivation link when they've completed or dismissed the form
819
- var url = document.getElementById("put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>");
820
- $('body').toggleClass('put-form-active');
821
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeIn();
822
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").html( '<?php echo $html; ?>' + '<div class="put-goodbye-form-footer"><p><a id="put-submit-form" class="button primary" href="#"><?php _e( 'Submit and Deactivate', 'plugin-usage-tracker' ); ?></a>&nbsp;<a class="secondary button" href="'+url+'"><?php _e( 'Just Deactivate', 'plugin-usage-tracker' ); ?></a></p></div>');
823
  $('#put-submit-form').on('click', function(e){
824
  // As soon as we click, the body of the form should disappear
825
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-body").fadeOut();
826
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-footer").fadeOut();
827
  // Fade in spinner
828
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .deactivating-spinner").fadeIn();
829
  e.preventDefault();
830
- var values = new Array();
831
- $.each($("input[name='put-goodbye-options[]']:checked"), function(){
832
- values.push($(this).val());
833
- });
834
- var details = $('#put-goodbye-reasons').val();
 
 
 
 
 
 
 
 
 
835
  var data = {
836
  'action': 'goodbye_form',
837
- 'values': values,
838
  'details': details,
839
- 'security': "<?php echo wp_create_nonce ( 'wisdom_goodbye_form' ); ?>",
840
  'dataType': "json"
841
  }
 
842
  $.post(
843
  ajaxurl,
844
  data,
@@ -848,12 +1001,19 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
848
  }
849
  );
850
  });
 
 
 
 
 
851
  // If we click outside the form, the form will close
852
- $('.put-goodbye-form-bg').on('click',function(){
853
- $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeOut();
854
- $('body').removeClass('put-form-active');
855
  });
856
  });
 
 
857
  });
858
  </script>
859
  <?php }
@@ -863,14 +1023,14 @@ if( ! class_exists( 'Eael_Plugin_Usage_Tracker') ) {
863
  * @since 1.0.0
864
  */
865
  public function goodbye_form_callback() {
866
- check_ajax_referer( 'wisdom_goodbye_form', 'security' );
867
  if( isset( $_POST['values'] ) ) {
868
- $values = json_encode( wp_unslash( $_POST['values'] ) );
869
- update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
870
  }
871
  if( isset( $_POST['details'] ) ) {
872
  $details = sanitize_text_field( $_POST['details'] );
873
- update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
874
  }
875
  $this->do_tracking(); // Run this straightaway
876
  echo 'success';
14
 
15
  class Eael_Plugin_Usage_Tracker {
16
 
17
+ private $wpins_version = '1.1.3';
18
  private $home_url = '';
19
  private $plugin_file = '';
20
  private $plugin_name = '';
23
  private $include_goodbye_form = true;
24
  private $marketing = false;
25
  private $collect_email = false;
26
+ private $pro_plugin_name = 'Essential Addons for Elementor Pro';
27
+ /**
28
+ * for matching the deactivation form header color with plugins appearance.
29
+ * @var string
30
+ */
31
+ private $header_bg = '#3A56FF';
32
+ private $text_color = '#FFFFFF';
33
 
34
  /**
35
  * Class constructor
69
  $this->init();
70
 
71
  }
72
+ /**
73
+ * Migrate to the new Insights
74
+ * @return void
75
+ */
76
+ public function migrate_plan(){
77
+ $old_key = array_flip( [ 'wisdom_allow_tracking', 'wisdom_last_track_time', 'wisdom_block_notice', 'wisdom_collect_email', 'wisdom_admin_emails', 'wisdom_deactivation_reason_' . $this->plugin_name, 'wisdom_deactivation_details_' . $this->plugin_name ] );
78
+ $new_key = [ 'wpins_allow_tracking', 'wpins_last_track_time', 'wpins_block_notice', 'wpins_collect_email', 'wpins_admin_emails', 'wpins_deactivation_reason_' . $this->plugin_name, 'wpins_deactivation_details_' . $this->plugin_name ];
79
+
80
+ foreach( $old_key as $key => $value ) {
81
+ $old_data = get_option( $key );
82
+ if( ! $old_data ) {
83
+ continue;
84
+ }
85
+ update_option( $new_key[ $value ], $old_data );
86
+ delete_option( $key );
87
+ }
88
+ }
89
+ /**
90
+ * This function is fired for one time in a life time!
91
+ * if the data is not removed.
92
+ * @return void
93
+ */
94
+ public function force_track_for_one_time(){
95
+ $is_tracked = get_option( 'wpins_'. $this->plugin_name .'_force_tracked' );
96
+ if( ! $is_tracked ) {
97
+ $this->do_tracking( true );
98
+ update_option( 'wpins_'. $this->plugin_name .'_force_tracked', true );
99
+ }
100
+ }
101
 
102
  public function init() {
103
+ if( version_compare( $this->wpins_version, '1.1.2', '>' ) ) {
104
+ $this->migrate_plan();
105
+ }
106
  // Check marketing
107
  if( $this->marketing == 3 ) {
108
  $this->set_can_collect_email( true, $this->plugin_name );
109
  }
 
110
  // Check whether opt-in is required
111
  // If not, then tracking is allowed
112
  if( ! $this->require_optin ) {
115
  $this->update_block_notice();
116
  $this->do_tracking( true );
117
  }
 
118
  // Hook our do_tracking function to the daily action
119
+ add_action( 'wpdeveloper_notice_clicked', array( $this, 'clicked' ) );
120
+
121
  add_action( 'put_do_weekly_action', array( $this, 'do_tracking' ) );
122
 
123
+ // Use this action for local testing and for one time force tracking in a life time.
124
+ add_action( 'admin_init', array( $this, 'force_track_for_one_time' ) );
125
+ add_action( 'admin_init', array( $this, 'force_tracking' ) );
126
 
127
  // Display the admin notice on activation
128
  add_action( 'wpdeveloper_optin_notice', array( $this, 'optin_notice' ) );
148
  wp_schedule_event( time(), 'daily', 'put_do_weekly_action' );
149
  }
150
  }
151
+ /**
152
+ * This function is responsible for force tracking the plugin,
153
+ * if users are allowed to do!
154
+ *
155
+ * @return void
156
+ */
157
+ public function force_tracking(){
158
+ $this->do_tracking( true );
159
+ }
160
+
161
  /**
162
  * This is our function to get everything going
163
  * Check that user has opted in
192
 
193
  // Send the data
194
  $this->send_data( $body );
 
195
  }
196
 
197
  /**
240
  'site_version' => get_bloginfo( 'version' ),
241
  'site_language' => get_bloginfo( 'language' ),
242
  'charset' => get_bloginfo( 'charset' ),
243
+ 'wpins_version' => $this->wpins_version,
244
  'php_version' => phpversion(),
245
  'multisite' => is_multisite(),
246
  'file_location' => __FILE__
314
  foreach( $options as $option ) {
315
  $fields = get_option( $option );
316
  // Check for permission to send this option
317
+ if( isset( $fields['wpins_registered_setting'] ) ) {
318
  foreach( $fields as $key=>$value ) {
319
  $plugin_options[$key] = $value;
320
  }
371
  $body['deactivated_date'] = time();
372
 
373
  // Add deactivation form data
374
+ if( false !== get_option( 'wpins_deactivation_reason_' . $this->plugin_name ) ) {
375
+ $body['deactivation_reason'] = get_option( 'wpins_deactivation_reason_' . $this->plugin_name );
376
  }
377
+ if( false !== get_option( 'wpins_deactivation_details_' . $this->plugin_name ) ) {
378
+ $body['deactivation_details'] = get_option( 'wpins_deactivation_details_' . $this->plugin_name );
379
  }
380
 
381
  $this->send_data( $body );
393
  $this->set_is_tracking_allowed( false, $this->plugin_name );
394
  return false;
395
  }
396
+ // The wpins_allow_tracking option is an array of plugins that are being tracked
397
+ $allow_tracking = get_option( 'wpins_allow_tracking' );
398
  // If this plugin is in the array, then tracking is allowed
399
  if( isset( $allow_tracking[$this->plugin_name] ) ) {
400
  return true;
413
  if( empty( $plugin ) ) {
414
  $plugin = $this->plugin_name;
415
  }
416
+ // The wpins_allow_tracking option is an array of plugins that are being tracked
417
+ $allow_tracking = get_option( 'wpins_allow_tracking' );
418
 
419
  // If the user has decided to opt out
420
  if( $this->has_user_opted_out() ) {
435
  unset( $allow_tracking[$plugin] );
436
  }
437
  }
438
+ update_option( 'wpins_allow_tracking', $allow_tracking );
439
  }
440
 
441
  /**
444
  * @return Boolean
445
  */
446
  public function has_user_opted_out() {
447
+ // Iterate through the options that are being tracked looking for wpins_opt_out setting
448
  if( ! empty( $this->options ) ) {
449
  foreach( $this->options as $option_name ) {
450
  // Check each option
451
  $options = get_option( $option_name );
452
  // If we find the setting, return true
453
+ if( ! empty( $options['wpins_opt_out'] ) ) {
454
  return true;
455
  }
456
  }
464
  */
465
  public function get_is_time_to_track() {
466
  // Let's see if we're due to track this plugin yet
467
+ $track_times = get_option( 'wpins_last_track_time', array() );
468
  if( ! isset( $track_times[$this->plugin_name] ) ) {
469
  // If we haven't set a time for this plugin yet, then we must track it
470
  return true;
483
  */
484
  public function set_track_time() {
485
  // We've tracked, so record the time
486
+ $track_times = get_option( 'wpins_last_track_time', array() );
487
  // Set different times according to plugin, in case we are tracking multiple plugins
488
  $track_times[$this->plugin_name] = time();
489
+ update_option( 'wpins_last_track_time', $track_times );
490
  }
491
 
492
  /**
498
  if( empty( $plugin ) ) {
499
  $plugin = $this->plugin_name;
500
  }
501
+ $block_notice = get_option( 'wpins_block_notice' );
502
  if( empty( $block_notice ) || ! is_array( $block_notice ) ) {
503
  // If nothing exists in the option yet, start a new array with the plugin name
504
  $block_notice = array( $plugin => $plugin );
506
  // Else add the plugin name to the array
507
  $block_notice[$plugin] = $plugin;
508
  }
509
+ update_option( 'wpins_block_notice', $block_notice );
510
  }
511
 
512
  /**
514
  * @since 1.0.0
515
  */
516
  public function get_can_collect_email() {
517
+ // The wpins_collect_email option is an array of plugins that are being tracked
518
+ $collect_email = get_option( 'wpins_collect_email' );
519
  // If this plugin is in the array, then we can collect the email address
520
  if( isset( $collect_email[$this->plugin_name] ) ) {
521
  return true;
534
  if( empty( $plugin ) ) {
535
  $plugin = $this->plugin_name;
536
  }
537
+ // The wpins_collect_email option is an array of plugins that are being tracked
538
+ $collect_email = get_option( 'wpins_collect_email' );
539
  // If the user has agreed to allow tracking or if opt-in is not required
540
  if( $can_collect ) {
541
  if( empty( $collect_email ) || ! is_array( $collect_email ) ) {
550
  unset( $collect_email[$plugin] );
551
  }
552
  }
553
+ update_option( 'wpins_collect_email', $collect_email );
554
  }
555
 
556
  /**
559
  * @return Email address
560
  */
561
  public function get_admin_email() {
562
+ // The wpins_collect_email option is an array of plugins that are being tracked
563
+ $email = get_option( 'wpins_admin_emails' );
564
  // If this plugin is in the array, then we can collect the email address
565
  if( isset( $email[$this->plugin_name] ) ) {
566
  return $email[$this->plugin_name];
588
  $email = $current_user->user_email;
589
  }
590
  }
591
+ // The wpins_admin_emails option is an array of admin email addresses
592
+ $admin_emails = get_option( 'wpins_admin_emails' );
593
  if( empty( $admin_emails ) || ! is_array( $admin_emails ) ) {
594
  // If nothing exists in the option yet, start a new array with the plugin name
595
  $admin_emails = array( $plugin => sanitize_email( $email ) );
597
  // Else add the email address to the array, if not already set
598
  $admin_emails[$plugin] = sanitize_email( $email );
599
  }
600
+ update_option( 'wpins_admin_emails', $admin_emails );
601
  }
602
+
603
+ public function clicked(){
 
 
 
 
 
604
  // Check for plugin args
605
  if( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
606
  $plugin = sanitize_text_field( $_GET['plugin'] );
613
  }
614
  $this->update_block_notice( $plugin );
615
  }
616
+ }
617
+
618
+ /**
619
+ * Display the admin notice to users to allow them to opt in
620
+ *
621
+ * @since 1.0.0
622
+ */
623
+ public function optin_notice() {
624
  // Check whether to block the notice, e.g. because we're in a local environment
625
+ // wpins_block_notice works the same as wpins_allow_tracking, an array of plugin names
626
+ $block_notice = get_option( 'wpins_block_notice' );
627
  if( isset( $block_notice[$this->plugin_name] ) ) {
628
  return;
629
  }
634
 
635
  // @credit EDD
636
  // Don't bother asking user to opt in if they're in local dev
637
+ $is_local = false;
638
+ if( stristr( network_site_url( '/' ), '.test' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) {
639
+ $is_local = true;
640
+ }
641
+ $is_local = apply_filters( 'wpins_is_local_' . $this->plugin_name, $is_local );
642
+ if ( $is_local ) {
643
  $this->update_block_notice();
644
  } else {
645
 
677
  $notice_text = __( 'Want to help make <strong>Essential Addons for Elementor</strong> even more awesome? You can get a <strong>25% discount coupon</strong> for Pro upgrade if you allow. <a class="insights-data-we-collect" href="#">What we collect.</a>', 'plugin-usage-tracker' );
678
  }
679
  // And we allow you to filter the text anyway
680
+ $notice_text = apply_filters( 'wpins_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
681
 
682
  <div class="notice notice-info updated put-dismiss-notice">
683
  <p><?php echo __( $notice_text ); ?></p>
726
  ) );
727
 
728
  $marketing_text = __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this plugin, including details of new features and special offers?', 'plugin-usage-tracker' );
729
+ $marketing_text = apply_filters( 'wpins_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text ); ?>
730
 
731
  <div class="notice notice-info updated put-dismiss-notice">
732
  <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
750
  }
751
  if( isset( $links['deactivate'] ) && $this->include_goodbye_form ) {
752
  $deactivation_link = $links['deactivate'];
753
+
754
+
755
  // Insert an onClick action to allow form before deactivating
756
+ $deactivation_link = str_replace( '<a ', '<div class="eael-put-goodbye-form-wrapper"><div class="eael-put-goodbye-form-bg"></div><span class="eael-put-goodbye-form" id="eael-put-goodbye-form-' . esc_attr( $this->plugin_name ) . '"></span></div><a onclick="javascript:event.preventDefault();" id="eael-put-goodbye-link-' . esc_attr( $this->plugin_name ) . '" ', $deactivation_link );
757
  $links['deactivate'] = $deactivation_link;
758
  }
759
  return $links;
768
  $form = array();
769
  $form['heading'] = __( 'Sorry to see you go', 'plugin-usage-tracker' );
770
  $form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'plugin-usage-tracker' );
771
+
772
  $form['options'] = array(
773
+ __( 'I no longer need the plugin', 'plugin-usage-tracker' ),
774
+ [
775
+ 'label' => __( 'I found a better plugin', 'plugin-usage-tracker' ),
776
+ 'extra_field' => __( 'Please share which plugin', 'plugin-usage-tracker' )
777
+ ],
778
+ __( "I couldn't get the plugin to work", 'plugin-usage-tracker' ),
779
+ __( 'It\'s a temporary deactivation', 'plugin-usage-tracker' ),
780
+ __( 'I have '. $this->pro_plugin_name, 'plugin-usage-tracker' ),
781
+ [
782
+ 'label' => __( 'Other', 'plugin-usage-tracker' ),
783
+ 'extra_field' => __( 'Please share the reason', 'plugin-usage-tracker' ),
784
+ 'type' => 'textarea'
785
+ ]
786
  );
787
+
788
  return $form;
789
  }
790
 
796
  */
797
  public function form_filterable_text() {
798
  $form = $this->form_default_text();
799
+ return apply_filters( 'wpins_form_text_' . esc_attr( $this->plugin_name ), $form );
800
  }
801
 
802
  /**
812
  $form = $this->form_default_text();
813
  }
814
  // Build the HTML to go in the form
815
+ $html = '<div class="eael-put-goodbye-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
816
+ $html .= '<div class="eael-put-goodbye-form-body"><p class="eael-put-goodbye-form-caption">' . esc_html( $form['body'] ) . '</p>';
817
  if( is_array( $form['options'] ) ) {
818
+ $html .= '<div id="eael-put-goodbye-options" class="eael-put-goodbye-options"><ul>';
819
  foreach( $form['options'] as $option ) {
820
+ if( is_array( $option ) ) {
821
+ $id = strtolower( str_replace( " ", "_", esc_attr( $option['label'] ) ) );
822
+ $html .= '<li class="has-goodbye-extra">';
823
+ $html .= '<input type="radio" name="eael-put-goodbye-options" id="' . $id . '" value="' . esc_attr( $option['label'] ) . '">';
824
+ $html .= '<div><label for="' . $id . '">' . esc_attr( $option['label'] ) . '</label>';
825
+ if( isset( $option[ 'extra_field' ] ) && ! isset( $option['type'] )) {
826
+ $html .= '<input type="text" style="display: none" name="'. $id .'" id="' . str_replace( " ", "", esc_attr( $option['extra_field'] ) ) . '" placeholder="' . esc_attr( $option['extra_field'] ) . '">';
827
+ }
828
+ if( isset( $option[ 'extra_field' ] ) && isset( $option['type'] )) {
829
+ $html .= '<'. $option['type'] .' style="display: none" type="text" name="'. $id .'" id="' . str_replace( " ", "", esc_attr( $option['extra_field'] ) ) . '" placeholder="' . esc_attr( $option['extra_field'] ) . '"></' . $option['type'] . '>';
830
+ }
831
+ $html .= '</div></li>';
832
+ } else {
833
+ $id = strtolower( str_replace( " ", "_", esc_attr( $option ) ) );
834
+ $html .= '<li><input type="radio" name="eael-put-goodbye-options" id="' . $id . '" value="' . esc_attr( $option ) . '"> <label for="' . $id . '">' . esc_attr( $option ) . '</label></li>';
835
+ }
836
  }
837
+ $html .= '</ul></div><!-- .eael-put-goodbye-options -->';
 
838
  }
839
+ $html .= '</div><!-- .eael-put-goodbye-form-body -->';
840
  $html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'plugin-usage-tracker' ) . '</p>';
841
  ?>
 
842
  <style type="text/css">
843
+ .eael-put-form-active .eael-put-goodbye-form-bg {
844
+ background: rgba( 0, 0, 0, .8 );
845
  position: fixed;
846
  top: 0;
847
  left: 0;
848
  width: 100%;
849
  height: 100%;
850
+ z-index: 9;
851
  }
852
+ .eael-put-goodbye-form-wrapper {
853
  position: relative;
 
854
  display: none;
855
  }
856
+ .eael-put-form-active .eael-put-goodbye-form-wrapper {
857
+ display: flex !important;
858
+ align-items: center;
859
+ justify-content: center;
860
+ width: 100%;
861
+ height: 100%;
862
+ position: fixed;
863
+ left: 0px;
864
+ top: 0px;
865
  }
866
+ .eael-put-goodbye-form {
867
  display: none;
868
  }
869
+ .eael-put-form-active .eael-put-goodbye-form {
870
+ position: relative !important;
871
+ width: 550px;
872
+ max-width: 80%;
 
873
  background: #fff;
874
+ box-shadow: 2px 8px 23px 3px rgba(0,0,0,.2);
875
+ border-radius: 3px;
876
  white-space: normal;
877
+ overflow: hidden;
878
+ display: block;
879
+ z-index: 999999;
880
  }
881
+ .eael-put-goodbye-form-head {
882
+ background: #fff;
883
+ color: #495157;
884
+ padding: 18px;
885
+ box-shadow: 0 0 8px rgba(0,0,0,.1);
886
+ font-size: 15px;
887
  }
888
+ .eael-put-goodbye-form .eael-put-goodbye-form-head strong {
889
+ font-size: 15px;
890
+ }
891
+ .eael-put-goodbye-form-body {
892
  padding: 8px 18px;
893
+ color: #333;
894
+ }
895
+ .eael-put-goodbye-form-body label {
896
+ color: #6d7882;
897
+ padding-left: 5px;
898
+ }
899
+ .eael-put-goodbye-form-body .eael-put-goodbye-form-caption {
900
+ font-weight: 500;
901
+ font-size: 15px;
902
+ color: #495157;
903
+ line-height: 1.4;
904
+ }
905
+ .eael-put-goodbye-form-body #eael-put-goodbye-options {
906
+ padding-top: 5px;
907
+ }
908
+ .eael-put-goodbye-form-body #eael-put-goodbye-options ul > li {
909
+ margin-bottom: 15px;
910
  }
911
  .deactivating-spinner {
912
+ display: none;
913
+ padding-bottom: 20px !important;
914
  }
915
  .deactivating-spinner .spinner {
916
  float: none;
918
  vertical-align: bottom;
919
  visibility: visible;
920
  }
921
+ .eael-put-goodbye-form-footer {
922
  padding: 8px 18px;
923
+ margin-bottom: 15px;
924
+ }
925
+ .eael-put-goodbye-form-footer > .eael-put-goodbye-form-buttons {
926
+ display: flex;
927
+ align-items: center;
928
+ justify-content: space-between;
929
+ }
930
+ .eael-put-goodbye-form-footer .eael-put-submit-btn {
931
+ background-color: #d30c5c;
932
+ -webkit-border-radius: 3px;
933
+ border-radius: 3px;
934
+ color: #fff;
935
+ line-height: 1;
936
+ padding: 15px 20px;
937
+ font-size: 13px;
938
+ }
939
+ .eael-put-goodbye-form-footer .eael-put-deactivate-btn {
940
+ font-size: 13px;
941
+ color: #a4afb7;
942
+ background: none;
943
+ float: right;
944
+ padding-right: 10px;
945
+ width: auto;
946
+ text-decoration: underline;
947
+ }
948
+ #eael-put-goodbye-options ul li > div {
949
+ display: inline;
950
+ padding-left: 3px;
951
+ }
952
+ #eael-put-goodbye-options ul li > div > input, #eael-put-goodbye-options ul li > div > textarea {
953
+ margin: 10px 18px;
954
+ padding: 8px;
955
+ width: 80%;
956
  }
957
  </style>
958
  <script>
959
  jQuery(document).ready(function($){
960
+ $("#eael-put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>").on("click",function(){
961
  // We'll send the user to this deactivation link when they've completed or dismissed the form
962
+ var url = document.getElementById("eael-put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>");
963
+ $('body').toggleClass('eael-put-form-active');
964
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeIn();
965
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").html( '<?php echo $html; ?>' + '<div class="eael-put-goodbye-form-footer"><div class="eael-put-goodbye-form-buttons"><a id="put-submit-form" class="eael-put-submit-btn" href="#"><?php _e( 'Submit and Deactivate', 'plugin-usage-tracker' ); ?></a>&nbsp;<a class="eael-put-deactivate-btn" href="'+url+'"><?php _e( 'Just Deactivate', 'plugin-usage-tracker' ); ?></a></div></div>');
966
  $('#put-submit-form').on('click', function(e){
967
  // As soon as we click, the body of the form should disappear
968
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .eael-put-goodbye-form-body").fadeOut();
969
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .eael-put-goodbye-form-footer").fadeOut();
970
  // Fade in spinner
971
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .deactivating-spinner").fadeIn();
972
  e.preventDefault();
973
+ var checkedInput = $("input[name='eael-put-goodbye-options']:checked"),
974
+ checkedInputVal, details;
975
+ if( checkedInput.length > 0 ) {
976
+ checkedInputVal = checkedInput.val();
977
+ details = $('input[name="'+ checkedInput[0].id +'"], textarea[name="'+ checkedInput[0].id +'"]').val();
978
+ }
979
+
980
+ if( typeof details === 'undefined' ) {
981
+ details = '';
982
+ }
983
+ if( typeof checkedInputVal === 'undefined' ) {
984
+ checkedInputVal = 'No Reason';
985
+ }
986
+
987
  var data = {
988
  'action': 'goodbye_form',
989
+ 'values': checkedInputVal,
990
  'details': details,
991
+ 'security': "<?php echo wp_create_nonce ( 'wpins_goodbye_form' ); ?>",
992
  'dataType': "json"
993
  }
994
+
995
  $.post(
996
  ajaxurl,
997
  data,
1001
  }
1002
  );
1003
  });
1004
+ $('#eael-put-goodbye-options > ul ').on('click', 'li label, li > input', function( e ){
1005
+ var parent = $(this).parents('li');
1006
+ parent.siblings().find('label').next('input, textarea').css('display', 'none');
1007
+ parent.find('label').next('input, textarea').css('display', 'block');
1008
+ });
1009
  // If we click outside the form, the form will close
1010
+ $('.eael-put-goodbye-form-bg').on('click',function(){
1011
+ $("#eael-put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeOut();
1012
+ $('body').removeClass('eael-put-form-active');
1013
  });
1014
  });
1015
+
1016
+
1017
  });
1018
  </script>
1019
  <?php }
1023
  * @since 1.0.0
1024
  */
1025
  public function goodbye_form_callback() {
1026
+ check_ajax_referer( 'wpins_goodbye_form', 'security' );
1027
  if( isset( $_POST['values'] ) ) {
1028
+ $values = $_POST['values'];
1029
+ update_option( 'wpins_deactivation_reason_' . $this->plugin_name, $values );
1030
  }
1031
  if( isset( $_POST['details'] ) ) {
1032
  $details = sanitize_text_field( $_POST['details'] );
1033
+ update_option( 'wpins_deactivation_details_' . $this->plugin_name, $details );
1034
  }
1035
  $this->do_tracking(); // Run this straightaway
1036
  echo 'success';
includes/class-wpdev-core-install.php CHANGED
File without changes
includes/class-wpdev-notices.php CHANGED
@@ -108,6 +108,7 @@ class WPDeveloper_Notice {
108
  * @return void
109
  */
110
  public function hooks(){
 
111
  add_action( 'wp_ajax_wpdeveloper_upsale_notice_dissmiss', array( $this, 'upsale_notice_dissmiss' ) );
112
  add_action( 'wpdeveloper_before_notice', array( $this, 'before' ) );
113
  add_action( 'wpdeveloper_after_notice', array( $this, 'after' ) );
@@ -115,8 +116,8 @@ class WPDeveloper_Notice {
115
  add_action( 'wpdeveloper_after_upsale_notice', array( $this, 'after' ) );
116
  add_action( 'wpdeveloper_notices', array( $this, 'content' ) );
117
  if( current_user_can( 'install_plugins' ) ) {
118
- add_action( 'wpdeveloper_notice_clicked', array( $this, 'clicked' ) );
119
  if( isset( $_GET['plugin'] ) && $_GET['plugin'] == $this->plugin_name ) {
 
120
  /**
121
  * Redirect User To the Current URL, but without set query arguments.
122
  */
@@ -196,10 +197,7 @@ class WPDeveloper_Notice {
196
  * When links are clicked, this function will invoked.
197
  * @return void
198
  */
199
- public function clicked(){
200
- // if( ! isset( $_GET['plugin'] ) || ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_GET['_wpnonce'] ) ), 'wpdeveloper-nonce' ) ) {
201
- // return;
202
- // }
203
  if( isset( $_GET['plugin'] ) && $_GET['plugin'] === $this->plugin_name ) {
204
  $options_data = $this->get_options_data();
205
  $clicked_from = current( $this->next_notice() );
@@ -456,7 +454,6 @@ class WPDeveloper_Notice {
456
  */
457
  public function admin_notices(){
458
  $current_notice = current( $this->next_notice() );
459
- do_action( 'wpdeveloper_notice_clicked' );
460
  if( $current_notice == 'opt_in' ) {
461
  do_action( 'wpdeveloper_notices' );
462
  return;
108
  * @return void
109
  */
110
  public function hooks(){
111
+ add_action( 'wpdeveloper_notice_clicked', array( $this, 'clicked' ) );
112
  add_action( 'wp_ajax_wpdeveloper_upsale_notice_dissmiss', array( $this, 'upsale_notice_dissmiss' ) );
113
  add_action( 'wpdeveloper_before_notice', array( $this, 'before' ) );
114
  add_action( 'wpdeveloper_after_notice', array( $this, 'after' ) );
116
  add_action( 'wpdeveloper_after_upsale_notice', array( $this, 'after' ) );
117
  add_action( 'wpdeveloper_notices', array( $this, 'content' ) );
118
  if( current_user_can( 'install_plugins' ) ) {
 
119
  if( isset( $_GET['plugin'] ) && $_GET['plugin'] == $this->plugin_name ) {
120
+ do_action( 'wpdeveloper_notice_clicked' );
121
  /**
122
  * Redirect User To the Current URL, but without set query arguments.
123
  */
197
  * When links are clicked, this function will invoked.
198
  * @return void
199
  */
200
+ public function clicked(){
 
 
 
201
  if( isset( $_GET['plugin'] ) && $_GET['plugin'] === $this->plugin_name ) {
202
  $options_data = $this->get_options_data();
203
  $clicked_from = current( $this->next_notice() );
454
  */
455
  public function admin_notices(){
456
  $current_notice = current( $this->next_notice() );
 
457
  if( $current_notice == 'opt_in' ) {
458
  do_action( 'wpdeveloper_notices' );
459
  return;
includes/eael-rollback.php CHANGED
@@ -40,6 +40,8 @@ if( ! class_exists('EAEL_Rollback') ) {
40
  * @var array
41
  */
42
  public $versions = [
 
 
43
  '2.9.2',
44
  '2.9.1',
45
  '2.9.0',
40
  * @var array
41
  */
42
  public $versions = [
43
+ '2.9.4',
44
+ '2.9.3',
45
  '2.9.2',
46
  '2.9.1',
47
  '2.9.0',
includes/extensions.php CHANGED
File without changes
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: elementor, elements, addons, elementor addon, elementor widget, page build
4
  Requires at least: 4.0
5
  Tested up to: 5.0.3
6
  Requires PHP: 5.4
7
- Stable tag: 2.9.4
8
  License: GPLv3
9
  License URI: https://opensource.org/licenses/GPL-3.0
10
 
@@ -169,6 +169,11 @@ Your existing elements/content will work with premium version. So you won't lose
169
 
170
  == Changelog ==
171
 
 
 
 
 
 
172
  = 2.9.4 =
173
 
174
  - Product Grid layout issue fixed
4
  Requires at least: 4.0
5
  Tested up to: 5.0.3
6
  Requires PHP: 5.4
7
+ Stable tag: 2.9.5
8
  License: GPLv3
9
  License URI: https://opensource.org/licenses/GPL-3.0
10
 
169
 
170
  == Changelog ==
171
 
172
+ = 2.9.5 =
173
+
174
+ - Fixed: Product grid featured products loop not working
175
+ - Few minor bugfix and improvements
176
+
177
  = 2.9.4 =
178
 
179
  - Product Grid layout issue fixed