PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.11.84
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.11.84
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 / admin / includes / feedback.php
premium-addons-for-elementor / admin / includes Last commit date
setup-wizard 1 day ago templates 1 day ago admin-bar.php 2 months ago admin-helper.php 1 day ago admin-notices.php 1 day ago beta-testers.php 2 months ago duplicator.php 1 month ago elements.php 3 weeks ago feedback.php 1 month ago keys.php 3 weeks ago pa-rollback.php 2 months ago
feedback.php
466 lines
1 <?php
2 /**
3 * PA Admin Bar
4 */
5
6 namespace PremiumAddons\Admin\Includes;
7
8 use PremiumAddons\Includes\Helper_Functions;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit;
12 }
13
14 /**
15 * Class Feedback
16 */
17 class Feedback {
18
19 /**
20 * Class instance
21 *
22 * @var instance
23 */
24 private static $instance = null;
25
26 /**
27 * Constructor for the class
28 */
29 private function __construct() {
30
31 add_action( 'admin_footer-plugins.php', array( $this, 'create_popup' ) );
32 add_action( 'wp_ajax_pa_handle_feedback_action', array( $this, 'send' ) );
33 }
34
35
36 public static function send() {
37
38 check_ajax_referer( 'pa-feedback-nonce', 'nonce' );
39
40 $response = array( 'success' => false );
41
42 if ( ! isset( $_POST['data'] ) || ! is_array( $_POST['data'] ) ) {
43 wp_send_json_error( 'Invalid data format' );
44 }
45
46 $data = array_map( 'sanitize_text_field', wp_unslash( $_POST['data'] ) );
47
48 $reason = '';
49 $suggestions = null;
50 $anonymous = false;
51
52 if ( isset( $data['feedback'] ) ) {
53 $reason = $data['feedback'];
54 $suggestions = isset( $data['suggestions'] ) ? $data['suggestions'] : null;
55 $anonymous = isset( $data['anonymous'] ) ? (bool) $data['anonymous'] : false;
56 }
57
58 if ( ! is_string( $reason ) || empty( $reason ) ) {
59 return false;
60 }
61
62 $wordpress = self::collect_wordpress_data( true );
63
64 $wordpress['deactivated_plugin']['uninstall_reason'] = $reason;
65 $wordpress['deactivated_plugin']['uninstall_details'] = '';
66
67 if ( ! empty( $suggestions ) ) {
68 $wordpress['deactivated_plugin']['uninstall_details'] .= $suggestions;
69 }
70
71 if ( ! $anonymous ) {
72 $wordpress['deactivated_plugin']['uninstall_details'] .= ( empty( $wordpress['deactivated_plugin']['uninstall_details'] ) ? '' : PHP_EOL . PHP_EOL ) . 'Domain: ' . self::get_site_domain();
73
74 $wordpress['used_widgets'] = array(
75 'widgets' => self::get_usage_count(),
76 );
77 }
78
79 $body = array(
80 'user' => self::collect_user_data( $anonymous ),
81 'wordpress' => $wordpress,
82 );
83
84 $api_url = 'https://feedbackpa.leap13.com/wp-json/feedback/v2/add';
85
86 $response = wp_safe_remote_request(
87 $api_url,
88 array(
89 'headers' => array(
90 'Content-Type' => 'application/json',
91 ),
92 'body' => wp_json_encode( $body ),
93 'timeout' => 20,
94 'method' => 'POST',
95 'httpversion' => '1.1',
96 )
97 );
98
99 if ( is_wp_error( $response ) ) {
100 wp_send_json_error( 'REQUEST ERR' );
101
102 }
103
104 if ( ! isset( $response['response'] ) || ! is_array( $response['response'] ) ) {
105 wp_send_json_error( 'REQUEST UNKNOWN' );
106
107 }
108
109 if ( ! isset( $response['body'] ) ) {
110 wp_send_json_error( 'REQUEST PAYLOAD EMPTY' );
111
112 }
113
114 wp_send_json_success( ( $response['body'] ) );
115 }
116
117 /**
118 * Method generates Feedback popup
119 */
120 public function create_popup() {
121
122 $plugin_data = get_plugin_data( PREMIUM_ADDONS_FILE );
123
124 ?>
125 <div class="pa-deactivation-popup hidden" data-type="wrapper" data-slug="<?php echo $plugin_data['TextDomain']; ?>">
126 <div class="overlay">
127 <div class="close"><i class="dashicons dashicons-no"></i></div>
128 <div class="body">
129 <section class="title-wrap">
130 <div class="pa-img-wrap">
131 <img src="<?php echo esc_url( PREMIUM_ADDONS_URL . 'admin/images/pa-logo-symbol.png' ); ?>">
132 </div>
133 <?php echo esc_html( __( 'Sorry to see you go', 'premium-addons-for-elementor' ) ); ?>
134 </section>
135 <section class="messages-wrap">
136 <p><?php echo esc_html( __( 'Would you quickly give us your reason for doing so?', 'premium-addons-for-elementor' ) ); ?></p>
137 </section>
138 <section class="options-wrap">
139 <label>
140 <input type="radio" name="feedback" value="temp">
141 <?php echo esc_html( __( 'Temporary deactivation', 'premium-addons-for-elementor' ) ); ?>
142 </label>
143 <label>
144 <input type="radio" name="feedback" value="setup">
145 <?php echo esc_html( __( 'Set up is too difficult', 'premium-addons-for-elementor' ) ); ?>
146 </label>
147 <label>
148 <input type="radio" name="feedback" value="e-issues">
149 <?php echo esc_html( __( 'Causes issues with Elementor', 'premium-addons-for-elementor' ) ); ?>
150 </label>
151 <label>
152 <input type="radio" name="feedback" value="documentation">
153 <?php echo esc_html( __( 'Lack of documentation', 'premium-addons-for-elementor' ) ); ?>
154 </label>
155 <label>
156 <input type="radio" name="feedback" value="features">
157 <?php echo esc_html( __( 'Not the features I wanted', 'premium-addons-for-elementor' ) ); ?>
158 </label>
159 <label>
160 <input type="radio" name="feedback" value="better-plugin">
161 <?php echo esc_html( __( 'Found a better plugin', 'premium-addons-for-elementor' ) ); ?>
162 </label>
163 <label>
164 <input type="radio" name="feedback" value="incompatibility">
165 <?php echo esc_html( __( 'Incompatible with theme or plugin', 'premium-addons-for-elementor' ) ); ?>
166 </label>
167 <label>
168 <input type="radio" name="feedback" value="maintenance">
169 <?php echo esc_html( __( 'Other', 'premium-addons-for-elementor' ) ); ?>
170 </label>
171 </section>
172 <section class="messages-wrap hidden" data-feedback>
173 <p class="hidden" data-feedback="setup"><?php echo esc_html( __( 'What was the difficult part?', 'premium-addons-for-elementor' ) ); ?></p>
174 <p class="hidden" data-feedback="e-issues"><?php echo esc_html( __( 'What was the issue?', 'premium-addons-for-elementor' ) ); ?></p>
175 <p class="hidden" data-feedback="documentation"><?php echo esc_html( __( 'What can we describe more?', 'premium-addons-for-elementor' ) ); ?></p>
176 <p class="hidden" data-feedback="features"><?php echo esc_html( __( 'How could we improve?', 'premium-addons-for-elementor' ) ); ?></p>
177 <p class="hidden" data-feedback="better-plugin"><?php echo esc_html( __( 'Can you mention it?', 'premium-addons-for-elementor' ) ); ?></p>
178 <p class="hidden" data-feedback="incompatibility"><?php echo esc_html( __( 'With what plugin or theme is incompatible?', 'premium-addons-for-elementor' ) ); ?></p>
179 <p class="hidden" data-feedback="maintenance"><?php echo esc_html( __( 'Please specify:', 'premium-addons-for-elementor' ) ); ?></p>
180 </section>
181 <section class="options-wrap hidden" data-feedback>
182 <label>
183 <textarea name="suggestions" rows="2"></textarea>
184 </label>
185 </section>
186 <section class="messages-wrap" data-feedback>
187
188 <p class="options-wrap pa-info-notice">
189 <?php
190 $link = Helper_Functions::get_campaign_link( 'https://premiumaddons.com/docs/fix-elementor-editor-panel-loading-issues/', 'plugins-page', 'wp-dash', 'deactivate-form' );
191 echo __( 'Having speed issues or Elementor editor not loading? Your website PHP limits might be the reason. Here\'s ', 'premium-addons-for-elementor' ) .
192 sprintf( '<a target="_blank" href="%s">%s</a>', $link, __( 'how to increase the PHP limits', 'premium-addons-for-elementor' ) );
193 ?>
194 </p>
195
196 <p><?php echo esc_html( __( 'Would you like to share your e-mail and elements usage with us so that we can write you back?', 'premium-addons-for-elementor' ) ); ?></p>
197 </section>
198 <section class="options-wrap hidden" data-feedback>
199 <label>
200 <input type="checkbox" name="anonymous" value="1">
201 <?php echo esc_html( __( 'No, I\'d like to stay anonymous', 'premium-addons-for-elementor' ) ); ?>
202 </label>
203 </section>
204
205 <section class="buttons-wrap clearfix">
206 <button class="pa-deactivate-btn" data-action="deactivation"><?php echo esc_html( __( 'Deactivate', 'premium-addons-for-elementor' ) ); ?></button>
207 </section>
208 </div>
209
210 </div>
211 </div>
212 <?php
213 }
214
215 private static function collect_wordpress_data( $detailed = true ) {
216
217 $current_plugin = get_plugin_data( PREMIUM_ADDONS_FILE );
218
219 // Plugin data
220 $data = array(
221 'deactivated_plugin' => array(
222 'version' => $current_plugin['Version'],
223 'memory' => 'Memory: ' . size_format( wp_convert_hr_to_bytes( ini_get( 'memory_limit' ) ) ),
224 'time' => 'Time: ' . ini_get( 'max_execution_time' ),
225 'install' => 'Activation: ' . get_option( 'pa_install_time' ),
226 'deactivate' => 'Deactivation: ' . gmdate( 'j F, Y', time() ),
227 ),
228 );
229
230 if ( Helper_Functions::check_papro_version() ) {
231 $data['deactivated_plugin']['papro'] = 'PAPRO: ' . PREMIUM_PRO_ADDONS_VERSION . get_option( 'papro_license_key', false );
232 }
233
234 if ( $detailed ) {
235
236 $data['extra'] = array(
237 'locale' => ( get_bloginfo( 'version' ) >= 4.7 ) ? get_user_locale() : get_locale(),
238 'themes' => self::get_themes(),
239 'plugins' => self::get_plugins(),
240 );
241
242 }
243
244 return $data;
245 }
246
247 /**
248 * Get a list of installed plugins
249 */
250 private static function get_plugins() {
251
252 if ( ! function_exists( 'get_plugins' ) ) {
253 include ABSPATH . '/wp-admin/includes/plugin.php';
254 }
255
256 // $plugins = get_plugins();
257 $option = get_option( 'active_plugins', array() );
258 $active = array();
259
260 foreach ( $option as $id ) {
261 $id = explode( '/', $id );
262 $id = ucwords( str_replace( '-', ' ', $id[0] ) );
263
264 $active[] = $id;
265 }
266
267 return array(
268 // 'installed' => $installed,
269 'active' => $active,
270 );
271 }
272
273 /**
274 * Get current themes
275 *
276 * @return array
277 */
278 private static function get_themes() {
279
280 $theme = wp_get_theme();
281
282 return array(
283 // 'installed' => self::get_installed_themes(),
284 'active' => array(
285 'name' => $theme->get( 'Name' ),
286 ),
287 );
288 }
289
290 /**
291 * Get an array of installed themes
292 *
293 * @return array
294 */
295 private static function get_installed_themes() {
296 $installed = wp_get_themes();
297 $theme = get_stylesheet();
298 $data = array();
299
300 foreach ( $installed as $slug => $info ) {
301 if ( $slug === $theme ) {
302 continue;
303 }
304
305 $data[ $slug ] = array(
306 'name' => $info->get( 'Name' ),
307 );
308 }
309
310 return $data;
311 }
312
313 /**
314 * Collect user data.
315 *
316 * @param bool $anonymous
317 *
318 * @return array
319 */
320 private static function collect_user_data( $anonymous ) {
321 $user = wp_get_current_user();
322
323 $return = array(
324 'email' => '',
325 'first_name' => '',
326 'last_name' => '',
327 'domain' => '',
328 );
329
330 if ( $user && ! $anonymous ) {
331 $return['email'] = $user->user_email;
332 $return['first_name'] = $user->first_name;
333 $return['last_name'] = $user->last_name;
334 $return['domain'] = self::get_site_domain();
335 }
336
337 return $return;
338 }
339
340 public static function get_usage_count() {
341
342 $usage_count = array();
343
344 // First, try to get data from Elementor options.
345 $all_usage = get_option( 'elementor_controls_usage', array() );
346
347 if ( ! empty( $all_usage ) && is_array( $all_usage ) ) {
348 $usage_count = self::get_elements_from_controls_usage( $all_usage );
349 }
350
351 return $usage_count;
352 }
353
354 /**
355 * Extract Elements Usage From Usage
356 *
357 * @since 4.10.61
358 *
359 * @param array $all_elements All usage data.
360 */
361 private static function get_elements_from_controls_usage( $all_elements ) {
362
363 $used_elements = array();
364
365 foreach ( $all_elements as $doc_type => $elements ) {
366
367 if ( ! is_array( $elements ) ) {
368 continue;
369 }
370
371 // Iterate through element types within each document type
372 foreach ( $elements as $element_type => $element_data ) {
373 if ( ! is_array( $element_data ) || ! isset( $element_data['count'] ) ) {
374 continue;
375 }
376
377 $element_name = $element_type;
378 $count = (int) $element_data['count'];
379
380 // Only count our elements.
381 if ( strpos( $element_name, 'premium-' ) === 0 ) {
382 $used_elements[ $element_name ] = isset( $used_elements[ $element_name ] )
383 ? $used_elements[ $element_name ] + $count
384 : $count;
385 }
386
387 // Check for extension usage in controls data
388 if ( isset( $element_data['controls'] ) && is_array( $element_data['controls'] ) ) {
389 self::get_addons_from_controls_usage( $element_data['controls'], $used_elements );
390 }
391 }
392 }
393
394 return $used_elements;
395 }
396
397 /**
398 * Extract Addons Usage From Controls Usage
399 *
400 * @since 4.10.61
401 *
402 * @param array $controls Controls usage data.
403 * @param array $used_elements Reference to used elements array.
404 */
405 private static function get_addons_from_controls_usage( $controls, &$used_elements ) {
406
407 $map = array(
408 'pa_display_conditions_switcher' => 'display-conditions',
409 'premium_eq_height_switcher' => 'equal-height',
410 'premium_fe_switcher' => 'floating-effects',
411 'premium_glass_switcher' => 'glass-effect',
412 'premium_global_divider_sw' => 'shape-divider',
413 'premium_tooltip_switcher' => 'tooltips',
414 'premium_wrapper_link_switcher' => 'wrapper-link',
415 'premium_global_badge_switcher' => 'badge',
416 'premium_global_cursor_switcher' => 'custom-cursor',
417 'premium_mscroll_switcher' => 'mscroll',
418 'premium_blob_switcher' => 'blob',
419 'premium_gradient_switcher' => 'animated-gradient',
420 'premium_kenburns_switcher' => 'kenburns',
421 'premium_lottie_switcher' => 'lottie',
422 'premium_parallax_switcher' => 'parallax',
423 'premium_particles_switcher' => 'particles',
424 );
425
426 array_walk_recursive(
427 $controls,
428 function ( $value, $key ) use ( &$used_elements, $map ) {
429
430 if ( ! isset( $map[ $key ] ) ) {
431 return;
432 }
433
434 $element_name = $map[ $key ];
435
436 $used_elements[ $element_name ] = isset( $used_elements[ $element_name ] )
437 ? $used_elements[ $element_name ] + $value
438 : $value;
439 }
440 );
441 }
442
443 private static function get_site_domain() {
444 return function_exists( 'parse_url' ) ? parse_url( get_home_url(), PHP_URL_HOST ) : false;
445 }
446
447 /**
448 * Creates and returns an instance of the class
449 *
450 * @since 3.20.9
451 * @access public
452 *
453 * @return object
454 */
455 public static function get_instance() {
456
457 if ( ! isset( self::$instance ) ) {
458
459 self::$instance = new self();
460
461 }
462
463 return self::$instance;
464 }
465 }
466