File: /home/creaqbdc/public_html/wp-content/plugins/essential-blocks/includes/Dependencies/Insights.php
<?php
namespace EssentialBlocks\Dependencies;
use EssentialBlocks\Integrations\BlockUsage;
class Insights
{
/**
* WP Insights Version
*/
const WPINS_VERSION = '3.0.1';
/**
* API URL
*/
const API_URL = 'https://send.wpinsight.com/process-plugin-data';
/**
* Installed Plugin File
*
* @var string
*/
private $plugin_file = null;
/**
* Installed Plugin Name
*
* @var string
*/
private $plugin_name = null;
/**
* How often the event should subsequently
*
* @var string
*/
public $recurrence = 'daily';
private $event_hook = null;
private $has_notice = false;
/**
* Instace of EBPluginInsights
*
* @var Insights
*/
private static $_instance = null;
/**
* Get Instance of EBPluginInsights
*
* @return Insights
*/
public static function get_instance($plugin_file, $args = [])
{
if (is_null(static::$_instance)) {
static::$_instance = new static($plugin_file, $args);
}
return static::$_instance;
}
public $disabled_wp_cron = false;
public $enable_self_cron = false;
public $require_optin = true;
public $include_goodbye_form = true;
public $marketing = true;
public $options = [];
public $notice_options = [];
public $item_id = false;
/**
* Automatically Invoked when initialized.
*
* @param array $args
*/
public function __construct($plugin_file, $args = [])
{
$this->plugin_file = $plugin_file;
$this->plugin_name = basename($this->plugin_file, '.php');
$this->disabled_wp_cron = defined('DISABLE_WP_CRON') && DISABLE_WP_CRON == true;
$this->enable_self_cron = $this->disabled_wp_cron == true ? true : false;
$this->event_hook = 'put_do_weekly_action';
$this->require_optin = isset($args['opt_in']) ? $args['opt_in'] : true;
$this->include_goodbye_form = isset($args['goodbye_form']) ? $args['goodbye_form'] : true;
$this->marketing = isset($args['email_marketing']) ? $args['email_marketing'] : true;
$this->options = isset($args['options']) ? $args['options'] : [];
$this->item_id = isset($args['item_id']) ? $args['item_id'] : false;
/**
* Activation Hook
*/
register_activation_hook($this->plugin_file, [$this, 'activate_this_plugin']);
/**
* Deactivation Hook
*/
register_deactivation_hook($this->plugin_file, [$this, 'deactivate_this_plugin']);
}
/**
* When user agreed to opt-in tracking schedule is enabled.
*
* @since 3.0.0
*/
public function schedule_tracking()
{
if ($this->disabled_wp_cron) {
return;
}
if (! wp_next_scheduled($this->event_hook)) {
wp_schedule_event(time(), $this->recurrence, $this->event_hook);
}
}
/**
* Add the schedule event if the plugin is tracked.
*
* @return void
*/
public function activate_this_plugin()
{
$allow_tracking = $this->is_tracking_allowed();
if (! $allow_tracking) {
return;
}
$this->schedule_tracking();
}
/**
* Remove the schedule event when plugin is deactivated and send the deactivated reason to inishghts if user submitted.
*
* @since 3.0.0
*/
public function deactivate_this_plugin()
{
/**
* Check tracking is allowed or not.
*/
$allow_tracking = $this->is_tracking_allowed();
if (! $allow_tracking) {
return;
}
$body = $this->get_data();
$body['status'] = 'Deactivated';
$body['deactivated_date'] = time();
// Check deactivation reason and add for insights data.
if (false !== get_option('wpins_deactivation_reason_' . $this->plugin_name)) {
$body['deactivation_reason'] = get_option('wpins_deactivation_reason_' . $this->plugin_name);
}
if (false !== get_option('wpins_deactivation_details_' . $this->plugin_name)) {
$body['deactivation_details'] = get_option('wpins_deactivation_details_' . $this->plugin_name);
}
$this->send_data($body);
delete_option('wpins_deactivation_reason_' . $this->plugin_name);
delete_option('wpins_deactivation_details_' . $this->plugin_name);
/**
* Clear the event schedule.
*/
if (! $this->disabled_wp_cron) {
wp_clear_scheduled_hook($this->event_hook);
}
}
/**
* Initial Method to Hook Everything.
*
* @return void
*/
public function init()
{
add_action('wpdeveloper_notice_clicked_for_' . $this->plugin_name, [$this, 'clicked']);
add_action('wpdeveloper_optin_notice_for_' . $this->plugin_name, [$this, 'notice']);
/**
* Deactivation Reason Form and Submit Data to Insights.
*/
add_filter('plugin_action_links_' . plugin_basename($this->plugin_file), [$this, 'deactivate_action_links']);
add_action('admin_print_footer_scripts', [$this, 'notice_script']);
add_action('admin_print_footer_scripts-plugins.php', [$this, 'deactivate_reasons_form_script']);
add_action('admin_print_styles-plugins.php', [$this, 'deactivate_reasons_form_style']);
add_action('wp_ajax_deactivation_form_' . esc_attr($this->plugin_name), [$this, 'deactivate_reasons_form_submit']);
}
/**
* For Redirecting Current Page without Arguments!
*
* @return string
*/
private function redirect_to()
{
$request_uri = ! empty($_SERVER['REQUEST_URI']) ? wp_parse_url(sanitize_url($_SERVER['REQUEST_URI']), PHP_URL_PATH) : '';
$query_string = wp_parse_url(sanitize_url($_SERVER['REQUEST_URI']), PHP_URL_QUERY);
parse_str($query_string, $current_url);
$unset_array = ['dismiss', 'plugin', '_wpnonce', 'later', 'plugin_action', 'marketing_optin'];
foreach ($unset_array as $value) {
if (isset($current_url[$value])) {
unset($current_url[$value]);
}
}
$current_url = http_build_query($current_url);
$redirect_url = $request_uri . '?' . $current_url;
return $redirect_url;
}
/**
* This method forcing the do_tracking method to execute instant.
*
* @return void
*/
public function force_tracking()
{
$this->do_tracking(true);
}
/**
* This method is responsible for all the magic from the front of the plugin.
*
* @since 3.0.0
* @param $force Force tracking if it's not the correct time to track/
*/
public function do_tracking($force = false)
{
/**
* Check URL is set or not.
*/
if (empty(self::API_URL)) {
return;
}
/**
* Check is tracking allowed or not.
*/
if (! $this->is_tracking_allowed()) {
return;
}
/**
* Check is this the correct time to track or not.
* or Force to track.
*/
if (! $this->is_time_to_track() && ! $force) {
return;
}
/**
* Get All Data.
*/
$body = $this->get_data();
/**
* Send all data.
*/
return $this->send_data($body);
}
/**
* Is tracking allowed?
*
* @since 1.0.0
*/
public function is_tracking_allowed()
{
// First, check if the user has changed their mind and opted out of tracking
if ($this->has_user_opted_out()) {
$this->set_is_tracking_allowed(false, $this->plugin_name);
return false;
}
// The wpins_allow_tracking option is an array of plugins that are being tracked
$allow_tracking = get_option('wpins_allow_tracking');
// If this plugin is in the array, then tracking is allowed
if (isset($allow_tracking[$this->plugin_name])) {
return true;
}
return false;
}
/**
* Set a flag in DB If tracking is allowed.
*
* @since 3.0.0
* @param $is_allowed Boolean true if is allowed.
*/
public function set_is_tracking_allowed($is_allowed, $plugin = null)
{
if (empty($plugin)) {
$plugin = $this->plugin_name;
}
/**
* Get All Tracked Plugin List using this Tracker.
*/
$allow_tracking = get_option('wpins_allow_tracking');
/**
* Check user is opted out for tracking or not.
*/
if ($this->has_user_opted_out()) {
if (isset($allow_tracking[$plugin])) {
unset($allow_tracking[$plugin]);
}
} elseif ($is_allowed || ! $this->require_optin) {
/**
* If user has agreed to allow tracking
*/
if (empty($allow_tracking) || ! is_array($allow_tracking)) {
$allow_tracking = [$plugin => $plugin];
} else {
$allow_tracking[$plugin] = $plugin;
}
} else {
if (isset($allow_tracking[$plugin])) {
unset($allow_tracking[$plugin]);
}
}
update_option('wpins_allow_tracking', $allow_tracking, 'no');
}
public static function get_is_tracking_allowed($plugin = ESSENTIAL_BLOCKS_NAME)
{
/**
* Get All Tracked Plugin List using this Tracker.
*/
$allow_tracking = get_option('wpins_allow_tracking');
/**
* Check user is opted out for tracking or not.
*/
return intval(isset($allow_tracking[$plugin]));
}
/**
* Check the user has opted out or not.
*
* @since 3.0.0
* @return Boolean
*/
protected function has_user_opted_out()
{
if (! empty($this->options)) {
foreach ($this->options as $option_name) {
$options = get_option($option_name);
if (! empty($options['wpins_opt_out'])) {
return true;
}
}
}
return false;
}
/**
* Check if it's time to track
*
* @since 3.0.0
*/
public function is_time_to_track()
{
$track_times = get_option('wpins_last_track_time', []);
return ! isset($track_times[$this->plugin_name]) ? true : ((isset($track_times[$this->plugin_name]) && $track_times[$this->plugin_name]) < strtotime('-1 day') ? true : false);
}
/**
* Set tracking time.
*
* @since 3.0.0
*/
public function set_track_time()
{
$track_times = get_option('wpins_last_track_time', []);
$track_times[$this->plugin_name] = time();
update_option('wpins_last_track_time', $track_times, 'no');
}
/**
* This method is responsible for collecting all data.
*
* @since 3.0.0
*/
public function get_data()
{
$body = [
'plugin_slug' => sanitize_text_field($this->plugin_name),
'url' => get_bloginfo('url'),
'site_name' => get_bloginfo('name'),
'site_version' => get_bloginfo('version'),
'site_language' => get_bloginfo('language'),
'charset' => get_bloginfo('charset'),
'wpins_version' => self::WPINS_VERSION,
'php_version' => phpversion(),
'multisite' => is_multisite(),
'file_location' => __FILE__
];
// Collect the email if the correct option has been set
if ($this->marketing) {
if (! function_exists('wp_get_current_user')) {
include ABSPATH . 'wp-includes/pluggable.php';
}
$current_user = wp_get_current_user();
$email = $current_user->user_email;
if (is_email($email)) {
$body['email'] = $email;
}
}
$body['marketing_method'] = $this->marketing;
$body['server'] = isset($_SERVER['SERVER_SOFTWARE']) ? sanitize_text_field($_SERVER['SERVER_SOFTWARE']) : '';
/**
* Collect all active and inactive plugins
*/
if (! function_exists('get_plugins')) {
include ABSPATH . '/wp-admin/includes/plugin.php';
}
$plugins = array_keys(get_plugins());
$active_plugins = is_network_admin() ? array_keys(get_site_option('active_sitewide_plugins', [])) : get_option('active_plugins', []);
foreach ($plugins as $key => $plugin) {
if (in_array($plugin, $active_plugins)) {
unset($plugins[$key]);
}
}
$body['active_plugins'] = $active_plugins;
$body['inactive_plugins'] = $plugins;
/**
* Text Direction.
*/
$body['text_direction'] = (function_exists('is_rtl') ? (is_rtl() ? 'RTL' : 'LTR') : 'NOT SET');
/**
* Get Our Plugin Data.
*
* @since 3.0.0
*/
$plugin = $this->plugin_data();
if (empty($plugin)) {
$body['message'] .= __('We can\'t detect any plugin information. This is most probably because you have not included the code in the plugin main file.', 'essential-blocks');
$body['status'] = 'NOT FOUND';
} else {
if (isset($plugin['Name'])) {
$body['plugin'] = sanitize_text_field($plugin['Name']);
}
if (isset($plugin['Version'])) {
$body['version'] = sanitize_text_field($plugin['Version']);
}
$body['status'] = 'Active';
}
/**
* Get active theme name and version
*
* @since 3.0.0
*/
$theme = wp_get_theme();
if ($theme->Name) {
$body['theme'] = sanitize_text_field($theme->Name);
}
if ($theme->Version) {
$body['theme_version'] = sanitize_text_field($theme->Version);
}
// send block count array
$block_usage = BlockUsage::get_used_blocks_count();
if (is_array($block_usage) && !empty($block_usage)) {
$body['optional_data'] = BlockUsage::get_used_blocks_count();
}
return $body;
}
/**
* Collect plugin data,
* Retrieve current plugin information
*
* @since 3.0.0
*/
public function plugin_data()
{
if (! function_exists('get_plugin_data')) {
include ABSPATH . '/wp-admin/includes/plugin.php';
}
$plugin = get_plugin_data($this->plugin_file);
return $plugin;
}
/**
* Send the data to insights.
*
* @since 3.0.0
*/
public function send_data($body)
{
/**
* Get SITE ID
*/
$site_id_key = "wpins_{$this->plugin_name}_site_id";
$site_id = get_option($site_id_key, false);
$failed_data = [];
$site_url = get_bloginfo('url');
$original_site_url = get_option("wpins_{$this->plugin_name}_original_url", false);
if ($original_site_url === false && version_compare($body['wpins_version'], '3.0.1', '==')) {
$site_id = false;
}
/**
* Send Initial Data to API
*/
if ($site_id == false && $this->item_id !== false && $original_site_url === false) {
if (isset($_SERVER['REMOTE_ADDR']) && ! empty($_SERVER['REMOTE_ADDR'] && $_SERVER['REMOTE_ADDR'] != '127.0.0.1')) {
$country_request = wp_remote_get('http://ip-api.com/json/' . sanitize_text_field($_SERVER['REMOTE_ADDR']) . '?fields=country');
if (! is_wp_error($country_request) && $country_request['response']['code'] == 200) {
$ip_data = json_decode($country_request['body']);
$body['country'] = isset($ip_data->country) ? $ip_data->country : 'NOT SET';
}
}
$body['plugin_slug'] = $this->plugin_name;
$body['url'] = $site_url;
$body['item_id'] = $this->item_id;
$request = $this->remote_post($body);
if (! is_wp_error($request) && $request['response']['code'] == 200) {
$retrieved_body = json_decode(wp_remote_retrieve_body($request), true);
if (is_array($retrieved_body) && isset($retrieved_body['siteId'])) {
update_option($site_id_key, $retrieved_body['siteId'], 'no');
update_option("wpins_{$this->plugin_name}_original_url", $site_url, 'no');
update_option("wpins_{$this->plugin_name}_{$retrieved_body['siteId']}", $body, 'no');
}
} else {
$failed_data = $body;
}
}
$site_id_data_key = "wpins_{$this->plugin_name}_{$site_id}";
$site_id_data_failed_key = "wpins_{$this->plugin_name}_{$site_id}_send_failed";
if ($site_id != false) {
$old_sent_data = get_option($site_id_data_key, []);
$diff_data = $this->diff($body, $old_sent_data);
$failed_data = get_option($site_id_data_failed_key, []);
if (! empty($failed_data) && $diff_data != $failed_data) {
$failed_data = array_merge($failed_data, $diff_data);
}
}
if (! empty($failed_data) && $site_id != false) {
$failed_data['plugin_slug'] = $this->plugin_name;
$failed_data['url'] = $site_url;
$failed_data['site_id'] = $site_id;
if ($original_site_url != false) {
$failed_data['original_url'] = $original_site_url;
}
$request = $this->remote_post($failed_data);
if (! is_wp_error($request)) {
delete_option($site_id_data_failed_key);
$replaced_data = array_merge($old_sent_data, $failed_data);
update_option($site_id_data_key, $replaced_data, 'no');
}
}
if (! empty($diff_data) && $site_id != false && empty($failed_data)) {
$diff_data['plugin_slug'] = $this->plugin_name;
$diff_data['url'] = $site_url;
$diff_data['site_id'] = $site_id;
if ($original_site_url != false) {
$diff_data['original_url'] = $original_site_url;
}
$request = $this->remote_post($diff_data);
if (is_wp_error($request)) {
update_option($site_id_data_failed_key, $diff_data, 'no');
} else {
$replaced_data = array_merge($old_sent_data, $diff_data);
update_option($site_id_data_key, $replaced_data, 'no');
}
}
$this->set_track_time();
if (isset($request) && is_wp_error($request)) {
return $request;
}
if (isset($request)) {
return true;
}
return false;
}
/**
* WP_REMOTE_POST method responsible for send data to the API_URL
*
* @param array $data
* @param array $args
* @return \WP_Error|array|bool|null
*/
protected function remote_post($data = [], $args = [])
{
if (empty($data)) {
return;
}
$args = wp_parse_args(
$args,
[
'method' => 'POST',
'timeout' => 30,
'redirection' => 5,
'httpversion' => '1.1',
'blocking' => true,
'body' => $data,
'user-agent' => 'PUT/1.0.0; ' . get_bloginfo('url')
]
);
$request = wp_remote_post(esc_url(self::API_URL), $args);
if (is_wp_error($request) || (isset($request['response'], $request['response']['code']) && $request['response']['code'] != 200)) {
return new \WP_Error(500, 'Something went wrong.');
}
return $request;
}
/**
* Difference between old and new data
*
* @param array $new_data
* @param array $old_data
* @return array
*/
protected function diff($new_data, $old_data)
{
$data = [];
if (! empty($new_data)) {
foreach ($new_data as $key => $value) {
if (isset($old_data[$key])) {
if ($old_data[$key] == $value) {
continue;
}
}
$data[$key] = $value;
}
}
return $data;
}
/**
* Display the admin notice to users to allow them to opt in
*
* @since 3.0.0
*/
public function notice()
{
/**
* Return if notice is not set.
*/
if (! isset($this->notice_options['notice'])) {
return;
}
/**
* Check is allowed or blocked for notice.
*/
$block_notice = get_option('wpins_block_notice');
if (isset($block_notice[$this->plugin_name])) {
return;
}
if (! current_user_can('manage_options')) {
return;
}
$this->has_notice = true;
$url_yes = add_query_arg([
'plugin' => $this->plugin_name,
'plugin_action' => 'yes'
]);
$url_no = add_query_arg([
'plugin' => $this->plugin_name,
'plugin_action' => 'no'
]);
$url_yes = wp_nonce_url($url_yes, '_wpnonce_optin_' . $this->plugin_name);
$url_no = wp_nonce_url($url_no, '_wpnonce_optin_' . $this->plugin_name);
// Decide on notice text
$notice_text = $this->notice_options['notice'];
$extra_notice_text = $this->notice_options['extra_notice'];
?>
<div class="eb-optin" style="display: flex; align-items: center;">
<div class="eb-optin-logo">
<?php echo wp_kses_post($this->get_thumbnail(ESSENTIAL_BLOCKS_URL . 'assets/images/eb-logo-full.svg')); ?>
</div>
<div class="eb-optin-content">
<p class="notice-text"><?php echo wp_kses_post($notice_text); ?></p>
<p>
<a href="<?php echo esc_url($url_yes); ?>" class="button-primary">
<?php echo esc_html($this->notice_options['yes']); ?>
</a>
<a href="<?php echo esc_url($url_no); ?>" class="button-secondary">
<?php echo esc_html($this->notice_options['no']); ?>
</a>
<a href="#" class="<?php echo 'wpinsights-' . esc_attr($this->plugin_name) . '-collect'; ?>">
<?php echo esc_html($this->notice_options['consent_button_text']); ?>
</a>
</p>
<div class="wpinsights-data" style="display: none;">
<p><?php echo wp_kses_post($extra_notice_text); ?></p>
</div>
</div>
</div>
<?php
}
public function get_thumbnail($image)
{
$output = '<div style="padding: 10px 10px 10px 0px; box-sizing: border-box; height: 35px;" class="wpnotice-thumbnail-wrapper">';
$output .= '<img style="max-width: 100%; max-height: 100%;" src="' . esc_url($image) . '">';
$output .= '</div>';
return wp_kses_post($output);
}
public function notice_script()
{
if ($this->has_notice) {
echo "<script type='text/javascript'>jQuery('.wpinsights-" . esc_attr($this->plugin_name) . "-collect').on('click', function(e) {e.preventDefault();jQuery('.wpinsights-data').slideToggle('fast');});</script>";
}
}
/**
* Set all notice options to customized notice.
*
* @since 3.0.0
* @param array $options
* @return void
*/
public function set_notice_options($options = [])
{
$default_options = [
'consent_button_text' => __('What we collect', 'essential-blocks'),
'yes' => __('Sure, I\'d like to help', 'essential-blocks'),
'no' => __('No Thanks.', 'essential-blocks')
];
$options = wp_parse_args($options, $default_options);
$this->notice_options = $options;
}
/**
* Responsible for track the click from Notice.
*
* @return void
*/
public function clicked($notice = null)
{
if (isset($_GET['_wpnonce']) && isset($_GET['plugin']) && isset($_GET['plugin_action'])) {
if (isset($_GET['tab']) && $_GET['tab'] === 'plugin-information') {
return;
}
if (! wp_verify_nonce($_GET['_wpnonce'], '_wpnonce_optin_' . $this->plugin_name)) {
return;
}
$plugin = sanitize_text_field($_GET['plugin']);
$action = sanitize_text_field($_GET['plugin_action']);
if ($action == 'yes') {
$this->schedule_tracking();
$this->set_is_tracking_allowed(true, $plugin);
if ($this->do_tracking(true)) {
$this->update_block_notice($plugin);
}
} else {
$this->set_is_tracking_allowed(false, $plugin);
$this->update_block_notice($plugin);
}
if (! is_null($notice)) {
$notice->dismiss->dismiss_notice();
}
/**
* Redirect User To the Current URL, but without set query arguments.
*/
wp_safe_redirect($this->redirect_to());
}
}
/**
* Set if we should block the opt-in notice for this plugin
*
* @since 3.0.0
*/
public function update_block_notice($plugin = null)
{
if (empty($plugin)) {
$plugin = $this->plugin_name;
}
$block_notice = get_option('wpins_block_notice');
if (empty($block_notice) || ! is_array($block_notice)) {
$block_notice = [$plugin => $plugin];
} else {
$block_notice[$plugin] = $plugin;
}
update_option('wpins_block_notice', $block_notice, 'no');
}
/**
* AJAX callback when the deactivated form is submitted.
*
* @since 3.0.0
*/
public function deactivate_reasons_form_submit()
{
check_ajax_referer('wpins_deactivation_nonce', 'security');
if (isset($_POST['values'])) {
$values = sanitize_text_field($_POST['values']);
update_option('wpins_deactivation_reason_' . $this->plugin_name, $values, 'no');
}
if (isset($_POST['details'])) {
$details = sanitize_text_field($_POST['details']);
update_option('wpins_deactivation_details_' . $this->plugin_name, $details, 'no');
}
echo 'success';
wp_die();
}
/**
* Filter the deactivation link to allow us to present a form when the user deactivates the plugin
*
* @since 3.0.0
*/
public function deactivate_action_links($links)
{
/**
* Check is tracking allowed or not.
*/
if (! $this->is_tracking_allowed()) {
return $links;
}
if (isset($links['deactivate']) && $this->include_goodbye_form) {
$deactivation_link = $links['deactivate'];
/**
* Change the default deactivate button link.
*/
$deactivation_link = str_replace('<a ', '<div class="wpinsights-goodbye-form-wrapper-' . esc_attr($this->plugin_name) . '"><div class="wpinsights-goodbye-form-bg"></div><span class="wpinsights-goodbye-form" id="wpinsights-goodbye-form"></span></div><a onclick="javascript:event.preventDefault();" id="wpinsights-goodbye-link-' . esc_attr($this->plugin_name) . '" ', $deactivation_link);
$links['deactivate'] = $deactivation_link;
}
return $links;
}
/**
* ALL Deactivate Reasons.
*
* @since 3.0.0
*/
public function deactivation_reasons()
{
$form = [];
$form['heading'] = __('Sorry to see you go 😞', 'essential-blocks');
$form['body'] = __('If you have a moment, please share why you are deactivating this plugin. All submissions are anonymous and we only use this feedback to improve Essential Blocks for Gutenberg.', 'essential-blocks');
$form['options'] = [
__('I no longer need the plugin', 'essential-blocks'),
[
'label' => __('I found a better plugin', 'essential-blocks'),
'extra_field' => __('Please share which plugin', 'essential-blocks')
],
__("I couldn't get the plugin to work", 'essential-blocks'),
__('It\'s a temporary deactivation', 'essential-blocks'),
[
'label' => __('Other', 'essential-blocks'),
'extra_field' => __('Please share the reason', 'essential-blocks'),
'type' => 'textarea'
]
];
return apply_filters('wpins_form_text_' . $this->plugin_name, $form);
}
/**
* Deactivate Reasons Form.
* This form will appears when user wants to deactivate the plugin to send you deactivated reasons.
*
* @since 3.0.0
*/
public function deactivate_reasons_form_style()
{
?>
<style type="text/css">
.wpinsights-form-active-essential-blocks .wpinsights-goodbye-form-bg {
background: rgba(0, 0, 0, .8);
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9;
}
.wpinsights-goodbye-form-wrapper-essential-blocks {
position: relative;
display: none;
}
.wpinsights-form-active-essential-blocks .wpinsights-goodbye-form-wrapper-essential-blocks {
display: flex !important;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
z-index: 99999;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form {
display: none;
}
.wpinsights-form-active-essential-blocks .wpinsights-goodbye-form {
position: relative !important;
width: 550px;
max-width: 80%;
background: #fff;
box-shadow: 2px 8px 23px 3px rgba(0, 0, 0, .2);
border-radius: 3px;
white-space: normal;
overflow: hidden;
display: block;
z-index: 999999;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-head {
background: #fff;
color: #495157;
padding: 18px;
box-shadow: 0 0 8px rgba(0, 0, 0, .1);
font-size: 15px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-head img.emoji {
float: none;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form .wpinsights-goodbye-form-head strong {
font-size: 15px;
text-transform: uppercase;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body {
padding: 8px 18px;
color: #333;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body label {
padding-left: 5px;
color: #6d7882;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body .wpinsights-goodbye-form-caption {
font-weight: 400;
font-size: 15px;
color: #495157;
line-height: 1.4;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body #wpinsights-goodbye-options {
padding-top: 5px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body #wpinsights-goodbye-options ul>li {
margin-bottom: 15px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body #wpinsights-goodbye-options ul>li>div {
display: inline;
padding-left: 3px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body #wpinsights-goodbye-options ul>li>div>input,
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-body #wpinsights-goodbye-options ul>li>div>textarea {
margin: 10px 18px;
padding: 8px;
width: 80%;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .deactivating-spinner {
display: none;
padding-bottom: 20px !important;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .deactivating-spinner .spinner {
float: none;
margin: 4px 4px 0 18px;
vertical-align: bottom;
visibility: visible;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-footer {
padding: 8px 18px;
margin-bottom: 15px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-footer>.wpinsights-goodbye-form-buttons {
display: flex;
align-items: center;
justify-content: space-between;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-footer .wpinsights-submit-btn {
background-color: #a022ff;
-webkit-border-radius: 3px;
border-radius: 3px;
color: #fff;
line-height: 1;
padding: 15px 20px;
font-size: 13px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-footer .wpsp-put-deactivate-btn {
color: #a022ff;
line-height: 1;
padding-right: 10px;
font-size: 13px;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .wpinsights-goodbye-form-footer .wpinsights-deactivate-btn {
font-size: 13px;
color: #a4afb7;
background: none;
float: right;
padding-right: 10px;
width: auto;
text-decoration: underline;
}
.wpinsights-goodbye-form-wrapper-essential-blocks .hide {
display: none;
}
</style>
<?php
}
/**
* Deactivate Reasons Form.
* This form will appears when user wants to deactivate the plugin to send you deactivated reasons.
*
* @since 3.0.0
*/
public function deactivate_reasons_form_script()
{
$form = $this->deactivation_reasons();
$html = '<div class="wpinsights-goodbye-form-head"><strong>' . esc_html($form['heading']) . '</strong></div>';
$html .= '<div class="wpinsights-goodbye-form-body"><p class="wpinsights-goodbye-form-caption">' . esc_html($form['body']) . '</p>';
if (is_array($form['options'])) {
$html .= '<div id="wpinsights-goodbye-options" class="wpinsights-goodbye-options"><ul>';
foreach ($form['options'] as $option) {
if (is_array($option)) {
$id = strtolower(str_replace(' ', '_', esc_attr($option['label'])));
$id = $id . '_' . $this->plugin_name;
$html .= '<li class="has-goodbye-extra">';
$html .= '<input type="radio" name="wpinsights-' . esc_attr($this->plugin_name) . '-goodbye-options" id="' . esc_attr($id) . '" value="' . esc_attr($option['label']) . '" />';
$html .= '<div><label for="' . esc_attr($id) . '">' . esc_attr($option['label']) . '</label>';
if (isset($option['extra_field']) && ! isset($option['type'])) {
$html .= '<input type="text" style="display: none" name="' . esc_attr($id) . '" class="hide" id="' . str_replace(' ', '', esc_attr($option['extra_field'])) . '" placeholder="' . esc_attr($option['extra_field']) . '">';
}
if (isset($option['extra_field']) && isset($option['type'])) {
$html .= '<' . $option['type'] . ' style="display: none" class="hide" type="text" name="' . esc_attr($id) . '" id="' . str_replace(' ', '', esc_attr($option['extra_field'])) . '" placeholder="' . esc_attr($option['extra_field']) . '"></' . $option['type'] . '>';
}
$html .= '</div></li>';
} else {
$id = strtolower(str_replace(' ', '_', esc_attr($option)));
$id = $id . '_' . $this->plugin_name;
$html .= '<li><input type="radio" name="wpinsights-' . esc_attr($this->plugin_name) . '-goodbye-options" id="' . esc_attr($id) . '" value="' . esc_attr($option) . '" /> <label for="' . esc_attr($id) . '">' . esc_attr($option) . '</label></li>';
}
}
$html .= '</ul></div><!-- .wpinsights-' . esc_attr($this->plugin_name) . '-goodbye-options -->';
}
$html .= '</div><!-- .wpinsights-goodbye-form-body -->';
$html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __('Submitting form', 'essential-blocks') . '</p>';
$allowed_html = array_merge([
'input' => [
'type' => [],
'name' => [],
'value' => [],
'placeholder' => [],
'class' => [],
'id' => [],
'style' => []
],
'textarea' => [
'type' => [],
'name' => [],
'value' => [],
'placeholder' => [],
'class' => [],
'id' => [],
'style' => []
],
'label' => [
'for' => []
],
'strong' => [
'for' => []
],
'ul' => [
'class' => []
],
'li' => [
'class' => []
],
'div' => [
'class' => [],
'id' => []
],
'p' => [
'class' => [],
'id' => []
],
'span' => [
'class' => []
]
]);
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$("#wpinsights-goodbye-link-<?php echo esc_attr($this->plugin_name); ?>").on("click", function() {
// We'll send the user to this deactivation link when they've completed or dismissed the form
var url = document.getElementById(
"wpinsights-goodbye-link-<?php echo esc_attr($this->plugin_name); ?>");
$('body').toggleClass('wpinsights-form-active-<?php echo esc_attr($this->plugin_name); ?>');
$(".wpinsights-goodbye-form-wrapper-<?php echo esc_attr($this->plugin_name); ?> #wpinsights-goodbye-form")
.fadeIn();
$(".wpinsights-goodbye-form-wrapper-<?php echo esc_attr($this->plugin_name); ?> #wpinsights-goodbye-form")
.html('<?php echo wp_kses($html, $allowed_html); ?>' +
'<div class="wpinsights-goodbye-form-footer"><div class="wpinsights-goodbye-form-buttons"><a id="wpinsights-submit-form-<?php echo esc_attr($this->plugin_name); ?>" class="wpinsights-submit-btn" href="#"><?php esc_html_e('Submit and Deactivate', 'essential-blocks'); ?></a> <a class="wpsp-put-deactivate-btn" href="' +
url + '"><?php esc_html_e('Skip & Deactivate', 'essential-blocks'); ?></a></div></div>'
);
$('#wpinsights-submit-form-<?php echo esc_attr($this->plugin_name); ?>').on('click', function(
e) {
// As soon as we click, the body of the form should disappear
$("#wpinsights-goodbye-form-<?php echo esc_attr($this->plugin_name); ?> .wpinsights-goodbye-form-body")
.fadeOut();
$("#wpinsights-goodbye-form-<?php echo esc_attr($this->plugin_name); ?> .wpinsights-goodbye-form-footer")
.fadeOut();
// Fade in spinner
$("#wpinsights-goodbye-form-<?php echo esc_attr($this->plugin_name); ?> .deactivating-spinner")
.fadeIn();
e.preventDefault();
var checkedInput = $(
"input[name='wpinsights-<?php echo esc_attr($this->plugin_name); ?>-goodbye-options']:checked"
),
checkedInputVal, details;
if (checkedInput.length > 0) {
checkedInputVal = checkedInput.val();
details = $('input[name="' + checkedInput[0].id + '"], textarea[name="' +
checkedInput[0].id + '"]').val();
}
if (typeof details === 'undefined') {
details = '';
}
if (typeof checkedInputVal === 'undefined') {
checkedInputVal = 'No Reason';
}
var data = {
'action': 'deactivation_form_<?php echo esc_attr($this->plugin_name); ?>',
'values': checkedInputVal,
'details': details,
'security': "<?php echo esc_html(wp_create_nonce('wpins_deactivation_nonce')); ?>",
'dataType': "json"
}
$.post(
ajaxurl,
data,
function(response) {
// Redirect to original deactivation URL
window.location.href = url;
}
);
});
$('#wpinsights-goodbye-options > ul ').on('click', 'li label, li > input', function(e) {
var parent = $(this).parents('li');
parent.siblings().find('label').next('input, textarea').css('display', 'none');
parent.find('label').next('input, textarea').css('display', 'block');
});
// If we click outside the form, the form will close
$('.wpinsights-goodbye-form-bg').on('click', function() {
$("#wpinsights-goodbye-form").fadeOut();
$('body').removeClass(
'wpinsights-form-active-<?php echo esc_attr($this->plugin_name); ?>');
});
});
});
</script>
<?php
}
}