PluginProbe ʕ •ᴥ•ʔ
ElementsKit Elementor Addons – Advanced Widgets & Templates Addons for Elementor / 4.0.1
ElementsKit Elementor Addons – Advanced Widgets & Templates Addons for Elementor v4.0.1
4.0.2 4.0.1 4.0.0 3.10.02 3.10.01 3.9.10 3.9.9 3.9.8 3.9.7 3.9.5 3.9.6 3.9.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.3.1 2.3.1.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.4.0 2.5.0 2.5.1 2.5.10 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.5 2.8.6 2.8.7 2.8.8 2.9.0 2.9.1 2.9.2 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 3.5.5 3.5.6 3.6.0 3.6.1 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.8.0 3.8.1 3.8.2 3.9.0 3.9.1 3.9.2 trunk 1.2.6 1.2.7 1.2.9 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.11 1.5.12 1.5.2 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.0.9.1 2.0.9.2 2.0.9.3
elementskit-lite / core / plugin-unsubscribe.php
elementskit-lite / core Last commit date
activation-actions.php 4 years ago build-inline-scripts.php 3 weeks ago build-modules.php 4 months ago build-widgets.php 4 months ago config-list.php 4 months ago editor-promotion.php 3 weeks ago handler-api.php 6 months ago handler-widget.php 4 years ago plugin-unsubscribe.php 3 weeks ago
plugin-unsubscribe.php
548 lines
1 <?php
2 /**
3 * Plugin Unsubscribe / Deactivation Feedback Handler
4 *
5 * Renders a feedback modal on plugin deactivation, collects user input,
6 * and sends telemetry to the ElementsKit API.
7 *
8 * @package ElementsKit_Lite\Core
9 * @since 3.9.5
10 */
11
12 namespace ElementsKit_Lite\Core;
13
14 use ElementsKit_Lite\Libs\Framework\Classes\Utils;
15 use ElementsKit\Libs\Framework\Classes\License;
16
17 defined( 'ABSPATH' ) || exit;
18 class Plugin_Unsubscribe {
19
20 use \ElementsKit_Lite\Traits\Singleton;
21
22 /**
23 * Constructor.
24 *
25 * Registers all admin-side hooks required by this feature.
26 *
27 * @since 3.9.5
28 */
29 public function __construct() {
30 if ( ! is_admin() ) {
31 return;
32 }
33
34 add_action( 'admin_footer', array( $this, 'render_modal' ) );
35 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
36
37 add_action( 'wp_ajax_elementskit_deactivation_feedback', array( $this, 'handle_feedback' ) );
38 }
39
40
41 /**
42 * Enqueue CSS and JS assets for the deactivation feedback modal.
43 *
44 * Passes localised data (nonce, AJAX URL, plugin URL)
45 * to the front-end script via {@see wp_localize_script()}.
46 *
47 * @since 3.9.5
48 *
49 * @return void
50 */
51 public function enqueue_scripts( $hook_suffix ) {
52 if ( 'plugins.php' !== $hook_suffix ) {
53 return;
54 }
55
56 $plugin_url = \ElementsKit_Lite::plugin_url();
57 $version = \ElementsKit_Lite::version();
58
59 wp_enqueue_style(
60 'elementskit-deactivation-modal',
61 $plugin_url . 'assets/css/deactivation-modal.css',
62 array(),
63 $version
64 );
65
66 wp_enqueue_script(
67 'elementskit-deactivation-modal',
68 $plugin_url . 'assets/js/deactivation-modal.js',
69 array( 'jquery' ),
70 $version,
71 true
72 );
73
74 wp_localize_script(
75 'elementskit-deactivation-modal',
76 'ElementsKitDeactivation',
77 array(
78 'nonce' => wp_create_nonce( 'elementskit-deactivation' ),
79 'ajaxurl' => admin_url( 'admin-ajax.php' ),
80 'plugin_url' => $plugin_url,
81 )
82 );
83 }
84
85
86 /**
87 * Output the deactivation feedback modal markup in the admin footer.
88 *
89 * @since 3.9.5
90 *
91 * @return void
92 */
93 public function render_modal() {
94 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
95
96 if ( ! $screen || 'plugins' !== $screen->id ) {
97 return;
98 }
99
100 $reasons = $this->get_deactivation_reasons();
101 ?>
102 <div id="elementskit-deactivation-modal" class="elementskit-modal">
103 <div class="elementskit-modal-content">
104
105 <?php $this->render_modal_header(); ?>
106
107 <div class="elementskit-modal-body">
108 <div id="elementskit-error-message" class="elementskit-error-message" style="display: none;"></div>
109
110 <h2 class="elementskit-modal-title">
111 <?php esc_html_e( 'Before you go, what made you deactivate ElementsKit?', 'elementskit-lite' ); ?>
112 </h2>
113
114 <form id="elementskit-deactivation-form" class="elementskit-form">
115 <?php wp_nonce_field( 'elementskit-deactivation', 'elementskit_nonce' ); ?>
116
117 <div class="form-group">
118 <div class="radio-group">
119 <?php foreach ( $reasons as $reason ) : ?>
120 <?php $this->render_reason_item( $reason ); ?>
121 <?php endforeach; ?>
122 </div>
123
124 <?php $this->render_modal_footer(); ?>
125 </div>
126 </form>
127 </div><!-- .elementskit-modal-body -->
128
129 </div><!-- .elementskit-modal-content -->
130 </div><!-- #elementskit-deactivation-modal -->
131 <?php
132 }
133
134
135 /**
136 * Handle the AJAX feedback-submission request.
137 *
138 * Verifies the nonce and user capabilities, collects payload data,
139 * then dispatches the data to the remote API via {@see send_feedback_data()}.
140 *
141 * Sends a JSON error response on failure; a JSON success response otherwise.
142 *
143 * @since 3.9.5
144 *
145 * @return void Terminates execution via {@see wp_send_json_error()} or
146 * {@see wp_send_json_success()}.
147 */
148 public function handle_feedback() {
149 $this->verify_request();
150
151 $selected_reason = isset( $_POST['reason'] )
152 ? sanitize_text_field( wp_unslash( $_POST['reason'] ) )
153 : '';
154
155 $data = array(
156 'plugin_slug' => 'elementskit',
157 'plugin_name' => 'ElementsKit',
158 'plugin_version' => \ElementsKit_Lite::version(),
159 'user' => array(
160 'email' => $this->get_user_email(),
161 ),
162 'feedback' => array(
163 'reason_key' => isset( $_POST['reason_key'] ) ? sanitize_text_field( wp_unslash( $_POST['reason_key'] ) ) : 'other',
164 'reason_label' => isset( $_POST['reason_label'] ) ? sanitize_text_field( wp_unslash( $_POST['reason_label'] ) ) : $selected_reason,
165 'message' => isset( $_POST['feedback'] )? sanitize_textarea_field( wp_unslash( $_POST['feedback'] ) ) : '',
166 ),
167 'usage' => array(
168 'active_widgets' => $this->get_active_widgets(),
169 'active_modules' => $this->get_active_modules(),
170 'user_type' => $this->get_user_type(),
171 'active_days' => $this->get_days_active(),
172 ),
173 'environment' => array(
174 'multisite_status' => is_multisite(),
175 'wp_version' => get_bloginfo( 'version' ),
176 'php_version' => PHP_VERSION,
177 'elementor_version' => defined( 'ELEMENTOR_VERSION' ) ? ELEMENTOR_VERSION : '',
178 'site_url' => get_site_url(),
179 ),
180 );
181
182 $response = $this->send_feedback_data( $data );
183
184 if ( is_wp_error( $response ) ) {
185 wp_send_json_error( array( 'message' => $response->get_error_message() ) );
186 }
187
188 $response_code = (int) wp_remote_retrieve_response_code( $response );
189 if ( $response_code < 200 || $response_code >= 300 ) {
190 wp_send_json_error(
191 array(
192 'message' => esc_html__( 'Failed to submit feedback.', 'elementskit-lite' ),
193 'code' => $response_code,
194 )
195 );
196 }
197
198 wp_send_json_success(
199 array( 'message' => esc_html__( 'Thank you for your feedback!', 'elementskit-lite' ) )
200 );
201 }
202
203
204 /**
205 * Output the modal header, including the ElementsKit logo SVG and title.
206 *
207 * @since 3.9.5
208 *
209 * @return void
210 */
211 private function render_modal_header() {
212 ?>
213 <div class="elementskit-modal-header">
214 <h2>
215 <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" viewBox="0 0 22 20" fill="none" aria-hidden="true" focusable="false">
216 <path d="M0.773071 12.0093H7.08208C7.38251 12.0093 7.5971 11.8376 7.72586 11.623C7.76878 11.5372 7.8117 11.4084 7.8117 11.2797V8.61873C7.8117 8.18954 7.46835 7.88911 7.08208 7.88911H0.773071C0.343887 7.88911 0.043457 8.23246 0.043457 8.61873V11.2797C0.043457 11.7089 0.386805 12.0093 0.773071 12.0093Z" fill="#F8003C"/>
217 <path d="M14.4639 6.17245C14.4639 5.39991 14.6356 4.6703 14.9789 4.02652C14.9789 3.98361 14.9789 3.98361 14.9789 3.94069L11.803 7.76043C11.4167 8.23253 11.2021 8.74755 11.1163 9.30549C10.9875 10.2068 11.2021 11.151 11.803 11.9235L13.3051 13.7261L14.2922 14.9278L16.3952 17.46L17.554 18.8763L18.1549 19.6059C18.3266 19.8205 18.5841 19.9064 18.8416 19.9493C18.9703 19.9493 19.0991 19.9064 19.2278 19.8634C19.3566 19.8205 19.4424 19.7347 19.5283 19.6488L19.6141 19.563L21.2879 17.9321C21.6313 17.5888 21.6742 17.0308 21.3308 16.6875L20.8158 16.0437L19.0133 13.8549L16.4811 10.8506C16.2665 10.5931 16.1377 10.2497 16.1377 9.90635C16.0948 9.86343 16.0948 9.82052 16.0519 9.7776C15.1077 8.87631 14.4639 7.58876 14.4639 6.17245Z" fill="#27334F"/>
218 <path d="M21.4088 2.70386C21.4088 2.48927 21.323 2.3176 21.1513 2.14592L19.3488 0.300428C19.22 0.171672 19.0483 0.0858395 18.8767 0.0429211C18.7908 0.0429211 18.7479 0 18.6621 0C18.4046 0 18.147 0.128757 17.9754 0.343349L16.3874 2.27468L14.9711 3.9485C14.9711 3.99141 14.9711 3.99142 14.9711 4.03434C14.6277 4.67811 14.4561 5.40773 14.4561 6.18026C14.4561 7.63949 15.0998 8.92704 16.1299 9.78541C16.1728 9.82833 16.1728 9.87125 16.2157 9.91416C16.2157 9.57082 16.3445 9.22747 16.5591 8.92704L21.2372 3.34764C21.3659 3.17597 21.4088 2.91846 21.4088 2.70386Z" fill="#FFAA00"/>
219 <path d="M11.167 15.2715C11.5533 15.2715 11.8975 15.5718 11.8975 16.001V18.6611C11.8975 19.0474 11.5962 19.3916 11.167 19.3916H0.730469C0.344203 19.3916 0 19.0903 0 18.6611V16.001C0 15.7006 0.215196 15.3993 0.515625 15.3135C0.601369 15.2707 0.687694 15.2715 0.773438 15.2715H11.167Z" fill="#F8003C"/>
220 <path d="M11.0117 0.463882C11.4838 0.463882 11.8271 0.804004 11.8271 1.22853V3.86037C11.8271 4.15753 11.6129 4.45515 11.3125 4.54005C11.2267 4.58241 11.1405 4.58205 11.0547 4.58205H6.0127L6.00879 4.584H0.773438C0.387171 4.584 0.0429688 4.28369 0.0429688 3.85451V1.19337C0.0431609 0.80726 0.34439 0.463882 0.773438 0.463882H11.0117Z" fill="#0099AC"/>
221 </svg>
222
223 <?php esc_html_e( 'Quick Feedback', 'elementskit-lite' ); ?>
224 </h2>
225
226 <button type="button" class="elementskit-modal-close" aria-label="<?php esc_attr_e( 'Close', 'elementskit-lite' ); ?>">
227 <span aria-hidden="true">&times;</span>
228 </button>
229 </div><!-- .elementskit-modal-header -->
230 <?php
231 }
232
233 /**
234 * Output a single radio-option item inside the feedback form.
235 *
236 * Each item consists of a radio button, its label, hidden key/label inputs,
237 * and an optional follow-up textarea.
238 *
239 * @since 3.9.5
240 *
241 * @param array $reason {
242 * Associative array describing a single deactivation reason.
243 *
244 * @type string $value The radio button value / display label.
245 * @type string $key Programmatic key sent with the AJAX request.
246 * @type string $label Human-readable label sent with the AJAX request.
247 * @type string $placeholder Placeholder text for the follow-up textarea.
248 * }
249 * @return void
250 */
251 private function render_reason_item( array $reason ) {
252 $value = esc_attr( $reason['value'] );
253 $placeholder = esc_attr( $reason['placeholder'] );
254 $show_textarea = 'temporary_deactivation' === $reason['key'];
255 ?>
256 <div class="radio-item">
257 <label class="radio-option">
258 <input
259 type="radio"
260 name="reason"
261 value="<?php echo esc_attr( $value ); ?>"
262 class="form-control-radio"
263 >
264 <span><?php echo esc_html( $reason['value'] ); ?></span>
265 </label>
266 <input type="hidden" class="reason-key" value="<?php echo esc_attr( $reason['key'] ); ?>" />
267 <input type="hidden" class="reason-label" value="<?php echo esc_attr( $reason['label'] ); ?>" />
268 <?php if ( !$show_textarea ) : ?>
269 <textarea
270 class="radio-feedback"
271 name="feedback_<?php echo esc_attr( $value ); ?>"
272 placeholder="<?php echo esc_attr( $placeholder ); ?>"
273 rows="2"
274 ></textarea>
275 <?php if ( 'plugin_bug' === $reason['key'] ) : ?>
276 <div class="ekit-help-links">
277 <span class="ekit-help-links-title">💡 <?php esc_html_e( 'Need help before deactivating?', 'elementskit-lite' ); ?></span>
278 <a href="https://wpmet.com/support-ticket-form/" target="_blank" rel="noopener noreferrer">
279 <?php esc_html_e( 'Contact Support Team', 'elementskit-lite' ); ?>
280 </a>
281 </div>
282 <?php endif; ?>
283
284 <?php if ( 'performance_issue' === $reason['key'] ) : ?>
285 <div class="ekit-help-links">
286 <span class="ekit-help-links-title">💡 <?php esc_html_e( 'Need help before deactivating?', 'elementskit-lite' ); ?></span>
287 <a href="https://wpmet.com/doc/elementskit/speed-optimization" target="_blank" rel="noopener noreferrer">
288 <?php esc_html_e( 'Check our optimization guide', 'elementskit-lite' ); ?>
289 </a>
290 </div>
291 <?php endif; ?>
292 <?php endif; ?>
293 </div>
294 <?php
295 }
296
297 /**
298 * Output the modal footer containing the action buttons.
299 *
300 * @since 3.9.5
301 *
302 * @return void
303 */
304 private function render_modal_footer() {
305 ?>
306 <div class="elementskit-modal-footer">
307 <button type="button" class="btn btn-secondary elementskit-modal-skip ekit-modal-btn" data-deactivate-link="">
308 <?php esc_html_e( 'Skip & Deactivate', 'elementskit-lite' ); ?>
309 </button>
310 <button type="submit" class="btn btn-primary elementskit-modal-submit ekit-modal-btn">
311 <?php esc_html_e( 'Submit & Deactivate', 'elementskit-lite' ); ?>
312 </button>
313 </div><!-- .elementskit-modal-footer -->
314 <?php
315 }
316
317
318 /**
319 * Verify AJAX request nonce and user capabilities.
320 *
321 * Sends a JSON error response and terminates execution if either check fails.
322 *
323 * @since 3.9.5
324 *
325 * @return void
326 */
327 private function verify_request() {
328 $nonce = isset( $_POST['elementskit_nonce'] )
329 ? sanitize_key( wp_unslash( $_POST['elementskit_nonce'] ) )
330 : '';
331
332 if ( ! wp_verify_nonce( $nonce, 'elementskit-deactivation' ) ) {
333 wp_send_json_error(
334 array( 'message' => esc_html__( 'Security check failed', 'elementskit-lite' ) )
335 );
336 }
337
338 if ( ! current_user_can( 'manage_options' ) ) {
339 wp_send_json_error(
340 array( 'message' => esc_html__( 'Insufficient permissions', 'elementskit-lite' ) )
341 );
342 }
343 }
344
345
346
347
348
349 /**
350 * Send collected feedback data to the ElementsKit remote API.
351 *
352 * @since 3.9.5
353 *
354 * @param array $data Associative array of feedback payload data.
355 * @return array|\WP_Error The raw HTTP response array, or a WP_Error on failure.
356 */
357 private function send_feedback_data( array $data ) {
358 $url = \ElementsKit_Lite::api_url() . 'plugin-unsubscribe/';
359 return wp_remote_post(
360 $url,
361 array(
362 'method' => 'POST',
363 'timeout' => 20,
364 'headers' => array(
365 'Content-Type' => 'application/json',
366 ),
367 'body' => wp_json_encode( $data ),
368 )
369 );
370 }
371
372 /**
373 * Return the number of days the plugin has been active.
374 *
375 * Reads the `elementskit-lite_install_date` option and computes the
376 * difference between that date and the current server time.
377 *
378 * @since 3.9.5
379 *
380 * @return int Number of complete days since installation, or 0 if unknown.
381 */
382 private function get_days_active() {
383 $installed_time = get_option( 'elementskit-lite_install_date' );
384
385 if ( ! $installed_time ) {
386 return 0;
387 }
388
389 $installed_timestamp = strtotime( $installed_time );
390 $current_time = current_time( 'timestamp' ); // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
391
392 return (int) floor( ( $current_time - $installed_timestamp ) / DAY_IN_SECONDS );
393 }
394
395 /**
396 * Return the slugs of all currently active modules.
397 *
398 * @since 3.9.5
399 *
400 * @return string[] Indexed array of active module slugs.
401 */
402 private function get_active_modules() {
403 $module_list = Utils::instance()->get_option( 'module_list', array() );
404 $active_modules = array();
405
406 foreach ( $module_list as $slug => $module ) {
407 if ( isset( $module['status'] ) && 'active' === $module['status'] ) {
408 $active_modules[] = $slug;
409 }
410 }
411
412 return $active_modules;
413 }
414
415 /**
416 * Return the slugs of all currently active widgets.
417 *
418 * @since 3.9.5
419 *
420 * @return string[] Indexed array of active widget slugs.
421 */
422 private function get_active_widgets() {
423 $widget_list = Utils::instance()->get_option( 'widget_list', array() );
424 $active_widgets = array();
425
426 foreach ( $widget_list as $slug => $widget ) {
427 if ( isset( $widget['status'] ) && 'active' === $widget['status'] ) {
428 $active_widgets[] = $slug;
429 }
430 }
431
432 return $active_widgets;
433 }
434
435 /**
436 * Return the current user's license/subscription type.
437 *
438 * Possible return values:
439 * - `'pro_valid'` – Pro plugin is active with a valid licence.
440 * - `'pro'` – Pro plugin is installed but licence is missing or invalid.
441 * - `'free'` – Only the Lite version is installed.
442 *
443 * @since 3.9.5
444 *
445 * @return string One of `'pro_valid'`, `'pro'`, or `'free'`.
446 */
447 private function get_user_type() {
448 // First check whether the Pro plugin is installed at all.
449 // A user without Pro installed is always 'free'.
450 if ( ! $this->is_pro_installed() ) {
451 return 'free';
452 }
453
454 return 'valid' === \ElementsKit_Lite::license_status() ? 'pro_valid' : 'pro';
455 }
456
457 /**
458 * Check whether the ElementsKit Pro plugin is installed (regardless of active state).
459 *
460 * @return bool True if the Pro plugin file exists in the plugins directory.
461 */
462 protected function is_pro_installed() {
463 if ( ! function_exists( 'get_plugins' ) ) {
464 require_once ABSPATH . 'wp-admin/includes/plugin.php';
465 }
466
467 return array_key_exists( 'elementskit/elementskit.php', get_plugins() );
468 }
469
470 /**
471 * Return the admin email address stored in plugin options, if available.
472 *
473 * @since 3.9.5
474 *
475 * @return string A sanitized email address, or an empty string when not set.
476 */
477 private function get_user_email() {
478 $options = get_option( 'elementskit_options', array() );
479
480 if ( empty( $options['settings']['newsletter_email'] ) ) {
481 return '';
482 }
483
484 return sanitize_email( $options['settings']['newsletter_email'] );
485 }
486
487
488 /**
489 * Return the list of available deactivation reasons shown in the modal.
490 *
491 * Each entry is an associative array with the following keys:
492 * - `value` (string) The user-visible radio-button label.
493 * - `key` (string) The programmatic key sent to the API.
494 * - `label` (string) The human-readable label sent to the API.
495 * - `placeholder` (string) Placeholder text for the follow-up textarea.
496 *
497 * @since 3.9.5
498 *
499 * @return array[] List of reason definition arrays.
500 */
501 private function get_deactivation_reasons() {
502 return array(
503 array(
504 'value' => __( 'I no longer need the plugin', 'elementskit-lite' ),
505 'key' => 'no_longer_needed',
506 'label' => 'I no longer need the plugin',
507 'placeholder' => __( 'Tell us more...', 'elementskit-lite' ),
508 ),
509 array(
510 'value' => __( 'I found a better plugin', 'elementskit-lite' ),
511 'key' => 'found_better_plugin',
512 'label' => 'I found a better plugin',
513 'placeholder' => __( 'Which plugin are you using instead?', 'elementskit-lite' ),
514 ),
515 array(
516 'value' => __( "I couldn't get the plugin to work", 'elementskit-lite' ),
517 'key' => 'plugin_bug',
518 'label' => "I couldn't get the plugin to work",
519 'placeholder' => __( 'What specific issue did you face?', 'elementskit-lite' ),
520 ),
521 array(
522 'value' => __( "It's missing a specific feature", 'elementskit-lite' ),
523 'key' => 'missing_feature',
524 'label' => "It's missing a specific feature",
525 'placeholder' => __( 'What feature do you need?', 'elementskit-lite' ),
526 ),
527 array(
528 'value' => __( 'The plugin affects site performance', 'elementskit-lite' ),
529 'key' => 'performance_issue',
530 'label' => 'Slowing down my site',
531 'placeholder' => __( 'Please share details about the performance issues you experienced.', 'elementskit-lite' ),
532 ),
533 array(
534 'value' => __( "It's a temporary deactivation", 'elementskit-lite' ),
535 'key' => 'temporary_deactivation',
536 'label' => "It's a temporary deactivation",
537 'placeholder' => __( 'When will you reactivate it?', 'elementskit-lite' ),
538 ),
539 array(
540 'value' => __( 'Other', 'elementskit-lite' ),
541 'key' => 'other',
542 'label' => 'Other',
543 'placeholder' => __( 'Please tell us why...', 'elementskit-lite' ),
544 ),
545 );
546 }
547 }
548