ב הוא חיבור של הרב יהושע בועז שתוכנו מראי מקומות למקורותشسdggרות הל555ה התafhgfh
במסgרות ה gh//شی הוא חיבור של הרב יהושע בועז שתוכנו מראי מקומות למקורותהתנדaghhhhו12ין יעל, המעציfghfghfע
/
www-data
/
sites
/
naresh-newwordpress
/
wp-content
/
plugins
/
icegram
/
lite
/
classes
/
feedback
/
Upload FileeE
HOME
<?php if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'IG_Feedback_V_1_2_8' ) ) { /** * IG Feedback * * The IG Feedback class adds functionality to get quick interactive feedback from users. * There are different types of feedabck widget like Stars, Emoji, Thubms Up/ Down, Number etc. * * @class IG_Feedback_V_1_2_8 * @since 1.0.0 * @copyright Copyright (c) 2019, Icegram * @license https://opensource.org/licenses/gpl-license GNU Public License * @package feedback */ class IG_Feedback_V_1_2_8 { /** * Version of Feedback Library * * @since 1.0.13 * @var string */ public $version = '1.2.8'; /** * The API URL where we will send feedback data. * * @since 1.0.0 * @var string */ public $api_url = 'https://api.icegram.com/store/feedback/'; // Production /** * Name for this plugin. * * @since 1.0.0 * @var string */ public $name; /** * Unique slug for this plugin. * * @since 1.0.0 * @var string */ public $plugin; /** * Unique slug for this plugin. * * @since 1.0.0 * @var string */ public $ajax_action; /** * Plugin Abbreviation * * @since 1.0.0 * @var string */ public $plugin_abbr; /** * Enable/Disable Dev Mode * * @var bool */ public $is_dev_mode = true; /** * Set feedback event * * @var string */ public $event_prefix; /** * Footer HTML */ public $footer = '<span class="ig-powered-by">Made With 💜 by <a href="https://www.icegram.com/" target="_blank">Icegram</a></span>'; /** * Primary class constructor. * * @param string $name Plugin name. * @param string $plugin Plugin slug. * * @since 1.0.0 */ public function __construct( $name = '', $plugin = '', $plugin_abbr = 'ig_fb', $event_prefix = 'igfb.', $is_dev_mode = false ) { $this->name = $name; $this->plugin = $plugin; $this->plugin_abbr = $plugin_abbr; $this->event_prefix = $event_prefix; $this->ajax_action = $this->plugin_abbr . '_submit-feedback'; $this->is_dev_mode = $is_dev_mode; // Don't run deactivation survey on dev sites. if ( ! $this->can_show_feedback_widget() ) { return; } add_action( 'wp_ajax_' . $this->ajax_action, array( $this, 'submit_feedback' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); /** * Show 5 star review notice to user * * @since 1.0.12 */ add_action( 'admin_notices', array( &$this, 'show_review_notice' ) ); } /** * Ask for user review * * @since 1.0.12 */ public function show_review_notice() { if ( ! defined( 'DOING_AJAX' ) && is_admin() ) { $enable_review_notice = apply_filters( $this->plugin_abbr . '_enable_review_notice', true ); $can_ask_user_for_review = true; if ( $enable_review_notice ) { $current_user_id = get_current_user_id(); $review_done_option = $this->plugin_abbr . '_feedback_review_done'; $no_bug_option = $this->plugin_abbr . '_feedback_do_not_ask_again'; $already_did_option = $this->plugin_abbr . '_feedback_already_did'; $maybe_later_option = $this->plugin_abbr . '_feedback_maybe_later'; $review_done_time_option = $review_done_option . '_time'; $no_bug_time_option = $no_bug_option . '_time'; $already_did_time_option = $already_did_option . '_time'; $maybe_later_time_option = $maybe_later_option . '_time'; $no_bug_days_before = 1; $no_bug_value = get_user_meta( $current_user_id, $no_bug_option, true ); $no_bug_time_value = get_user_meta( $current_user_id, $no_bug_time_option, true ); $review_done_value = get_user_meta( $current_user_id, $review_done_option, true ); $review_done_time_value = get_user_meta( $current_user_id, $review_done_time_option, true ); if ( ! empty( $no_bug_time_value ) && 0 !== $no_bug_time_value ) { $no_bug_time_diff = time() - $no_bug_time_value; $no_bug_days_before = floor( $no_bug_time_diff / 86400 ); // 86400 seconds == 1 day } $already_did_value = get_user_meta( $current_user_id, $already_did_option, true ); $already_did_time_value = get_user_meta( $current_user_id, $already_did_time_option, true ); $maybe_later_days_before = 1; $maybe_later_value = get_user_meta( $current_user_id, $maybe_later_option, true ); $maybe_later_time_value = get_user_meta( $current_user_id, $maybe_later_time_option, true ); if ( $maybe_later_value && ! empty( $maybe_later_time_value ) && 0 !== $maybe_later_time_value ) { $maybe_later_time_diff = time() - $maybe_later_time_value; $maybe_later_days_before = floor( $maybe_later_time_diff / 86400 ); // 86400 seconds == 1 day } // Is user fall in love with our plugin in 15 days after when they said may be later? // But, make sure we are asking user only after 15 days. // We are good people. Respect the user decision. if ( $review_done_value || $no_bug_value || $already_did_value || ( $maybe_later_value && $maybe_later_days_before < 15 ) || $already_did_value ) { $can_ask_user_for_review = false; } $review_data = array( 'review_done_value' => $review_done_value, 'review_done_time_value' => $review_done_time_value, 'no_bug_value' => $no_bug_value, 'no_bug_time_value' => $no_bug_time_value, 'maybe_later_value' => $maybe_later_value, 'maybe_later_time_value' => $maybe_later_time_value, 'already_did_value' => $already_did_value, 'already_did_time_value' => $already_did_time_value, ); $can_ask_user_for_review = apply_filters( $this->plugin_abbr . '_can_ask_user_for_review', $can_ask_user_for_review, $review_data ); if ( $can_ask_user_for_review ) { $current_page_url = ''; if ( ! empty( $_SERVER['HTTP_HOST'] ) && ! empty( $_SERVER['REQUEST_URI'] ) ) { $current_page_url = esc_url_raw( '//' . wp_unslash( $_SERVER['HTTP_HOST'] ) . wp_unslash( $_SERVER['REQUEST_URI'] ) ); } $got_feedback = false; /************** Update Review Status */ $nonce = ! empty( $_GET['ig_feedback_nonce'] ) ? sanitize_text_field( wp_unslash( $_GET['ig_feedback_nonce'] ) ) : ''; $nonce_verified = wp_verify_nonce( $nonce, 'review' ); $action = ''; if ( $nonce_verified ) { $action = ! empty( $_GET['ig_feedback_action'] ) ? sanitize_text_field( wp_unslash( $_GET['ig_feedback_action'] ) ) : ''; if ( ! empty( $action ) && $this->is_valid_action( $action ) ) { update_user_meta( $current_user_id, $action, 1 ); update_user_meta( $current_user_id, $action . '_time', time() ); // Got the review request? // Redirect them to review page if ( $action === $review_done_option ) { $url = ! empty( $_GET['review_url'] ) ? esc_url_raw( wp_unslash( $_GET['review_url'] ) ) : ''; if ( ! empty( $url ) ) { ?> <meta http-equiv="refresh" content="0; url=<?php echo esc_url( $url ); ?>"/> <?php } } } $got_feedback = true; } /************** Update Review Status (End) */ if ( ! $got_feedback ) { $review_url = "https://wordpress.org/support/plugin/{$this->plugin}/reviews/"; $icon_url = plugin_dir_url( __FILE__ ) . 'assets/images/icon-64.png'; /* translators: %s: Plugin name */ $message = __( sprintf( "<span><p>We hope you're enjoying <b>%s</b> plugin! Could you please do us a BIG favor and give us a 5-star rating on WordPress to help us spread the word and boost our motivation?</p>", $this->name ), $this->plugin ); $message_data = array( 'review_url' => $review_url, 'icon_url' => $icon_url, 'message' => $message, ); $message_data = apply_filters( $this->plugin_abbr . '_review_message_data', $message_data ); $message = ! empty( $message_data['message'] ) ? $message_data['message'] : ''; $review_url = ! empty( $message_data['review_url'] ) ? $message_data['review_url'] : ''; $icon_url = ! empty( $message_data['icon_url'] ) ? $message_data['icon_url'] : ''; $nonce = wp_create_nonce( 'review' ); $review_url = add_query_arg( 'review_url', $review_url, add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $review_done_option, $current_page_url ) ) ); $maybe_later_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $maybe_later_option, $current_page_url ) ); $already_did_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $already_did_option, $current_page_url ) ); $no_bug_url = add_query_arg( 'ig_feedback_nonce', $nonce, add_query_arg( 'ig_feedback_action', $no_bug_option, $current_page_url ) ); ?> <style type="text/css"> .ig-feedback-notice-links li { display: inline-block; margin-right: 15px; } .ig-feedback-notice-links li a { display: inline-block; color: #10738b; text-decoration: none; padding-left: 26px; position: relative; } .ig-feedback-notice { display: flex; align-items: center; } .ig-feedback-plugin-icon { float: left; margin-right: 0.5em; } </style> <?php echo '<div class="notice notice-success ig-feedback-notice">'; echo '<span class="ig-feedback-plugin-icon"> <img src="' . esc_url( $icon_url ) . '" alt="Logo"/></span>'; echo wp_kses_post( $message ); echo "<ul class='ig-feedback-notice-links'>"; echo sprintf( '<li><a href="%s" class="px-4 py-2 ml-6 mr-2 align-middle cursor-pointer button button-primary bg-indigo-600" target="_blank" data-rated="' . esc_attr__( 'Thank You :) ', $this->plugin ) . '"><span class="dashicons dashicons-external"></span> Ok, you deserve it</a></li> <li><a href="%s"><span class="dashicons dashicons-calendar-alt"></span> Maybe later</a></li><li><a href="%s"><span class="dashicons dashicons-smiley"></span> I already did!</a></li><li><a href="%s"><span class="dashicons dashicons-no"></span> Don\'t ask me again</a></li>', esc_url( $review_url ), esc_url( $maybe_later_url ), esc_url( $already_did_url ), esc_url( $no_bug_url ) ); echo '</ul></span>'; echo '</div>'; } } } } } /** * Is valid action? * * @param string $action * * @return bool * * @since 1.0.14 */ public function is_valid_action( $action = '' ) { if ( empty( $action ) ) { return false; } $available_actions = array( '_feedback_review_done', '_feedback_already_did', '_feedback_maybe_later', '_feedback_do_not_ask_again', ); foreach ( $available_actions as $available_action ) { if ( strpos( $action, $available_action ) !== false ) { return true; } } return false; } /** * Render Deactivation Feedback * * @since 1.0.0 */ public function render_deactivate_feedback() { add_action( 'admin_print_footer_scripts', array( $this, 'js' ), 20 ); add_action( 'admin_print_scripts', array( $this, 'css' ) ); add_action( 'admin_footer', array( $this, 'modal' ) ); } /** * Load Javascripts * * @since 1.0.1 * * @modify 1.1.0 */ public function enqueue_scripts() { $can_load = apply_filters( $this->plugin_abbr . '_can_load_sweetalert_js', false ); if ( $can_load ) { wp_enqueue_script( 'sweetalert', plugin_dir_url( __FILE__ ) . 'assets/js/sweetalert2.min.js', array( 'jquery' ) ); } } /** * Load Styles * * @since 1.0.1 */ public function enqueue_styles() { $can_load = apply_filters( $this->plugin_abbr . '_can_load_sweetalert_css', false ); if ( $can_load ) { wp_register_style( "sweetalert_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/sweetalert2.min.css', array(), $this->version ); wp_enqueue_style( "sweetalert_{$this->version}" ); wp_register_style( "animate_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/animate.min.css', array(), $this->version ); wp_enqueue_style( "animate_{$this->version}" ); wp_register_style( "ig-feedback-star-rating_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/star-rating.min.css', array(), $this->version ); wp_enqueue_style( "ig-feedback-star-rating_{$this->version}" ); wp_register_style( "ig-feedback-emoji_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/emoji.min.css', array(), $this->version ); wp_enqueue_style( "ig-feedback-emoji_{$this->version}" ); wp_register_style( "ig-feedback_{$this->version}", plugin_dir_url( __FILE__ ) . 'assets/css/feedback.min.css', array(), $this->version ); wp_enqueue_style( "ig-feedback_{$this->version}" ); } } /** * Prepare Widget Params * * @param array $params * * @return array * * @since 1.0.3 */ public function prepare_widget_params( $params = array() ) { $default_params = array( 'event' => 'feedback', 'title' => 'How do you rate ' . $this->plugin, 'position' => 'top-end', 'width' => 300, 'set_transient' => true, 'allowOutsideClick' => false, 'allowEscapeKey' => true, 'showCloseButton' => true, 'confirmButtonText' => 'Ok', 'backdrop' => true, 'delay' => 3, // In Seconds 'consent_text' => 'You are agree to our terms and condition', 'email' => $this->get_contact_email(), 'name' => '', 'consent' => false, ); $params = wp_parse_args( $params, $default_params ); return $params; } /** * Render Widget * * @param array $params * * @since 1.0.0 */ public function render_widget( $params = array() ) { $params = $this->prepare_widget_params( $params ); $title = $params['title']; $slug = sanitize_title( $title ); $event = $this->event_prefix . $params['event']; $html = ! empty( $params['html'] ) ? $params['html'] : ''; ?> <script> function doSend(rating, details) { var data = { action: '<?php echo esc_js( $this->ajax_action ); ?>', feedback: { type: '<?php echo esc_js( $params['type'] ); ?>', slug: '<?php echo esc_js( $slug ); ?>', title: '<?php echo esc_js( $title ); ?>', value: rating, details: details }, event: '<?php echo esc_js( $event ); ?>', // Add additional information misc: { plugin: '<?php echo esc_js( $this->plugin ); ?>', plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>', is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>', set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>' //system_info: enable_system_info }, security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>' }; return jQuery.post(ajaxurl, data); } function showWidget(delay) { setTimeout(function () { Swal.mixin({ footer: '<?php echo wp_kses_post( $this->footer ); ?>', position: '<?php echo esc_js( $params['position'] ); ?>', width: <?php echo esc_js( $params['width'] ); ?>, animation: false, focusConfirm: false, allowEscapeKey: '<?php echo esc_js( $params['allowEscapeKey'] ); ?>', showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>', allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>', showLoaderOnConfirm: true, confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>', backdrop: '<?php echo (int) esc_js( $params['backdrop'] ); ?>' }).queue([ { title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>', html: '<?php echo wp_kses_post( $html ); ?>', customClass: { popup: 'animated fadeInUpBig' }, onOpen: () => { var clicked = false; var selectedReaction = ''; jQuery('.ig-emoji').hover(function () { reaction = jQuery(this).attr('data-reaction'); jQuery('#emoji-info').text(reaction); }, function () { if (!clicked) { jQuery('#emoji-info').text(''); } else { jQuery('#emoji-info').text(selectedReaction); } }); jQuery('.ig-emoji').on('click', function () { clicked = true; jQuery('.ig-emoji').removeClass('active'); jQuery(this).addClass('active'); selectedReaction = jQuery(this).attr('data-reaction'); jQuery('#emoji-info').text(reaction); }); }, preConfirm: () => { var rating = jQuery("input[name='rating']:checked").val(); var details = ''; if (rating === undefined) { Swal.showValidationMessage('Please give your input'); return; } return doSend(rating, details); } }, ]).then(response => { if (response.hasOwnProperty('value')) { Swal.fire({ type: 'success', width: <?php echo esc_js( $params['width'] ); ?>, title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>', showConfirmButton: false, position: '<?php echo esc_js( $params['position'] ); ?>', timer: 1500, animation: false }); } }); }, delay * 1000); } var delay = <?php echo esc_js( $params['delay'] ); ?>; showWidget(delay); </script> <?php } /** * Render star feedback widget * * @param array $params * * @since 1.0.1 */ public function render_stars( $params = array() ) { ob_start(); ?> <div class="rating"> <!--elements are in reversed order, to allow "previous sibling selectors" in CSS--> <input class="ratings" type="radio" name="rating" value="5" id="5"><label for="5">☆</label> <input class="ratings" type="radio" name="rating" value="4" id="4"><label for="4">☆</label> <input class="ratings" type="radio" name="rating" value="3" id="3"><label for="3">☆</label> <input class="ratings" type="radio" name="rating" value="2" id="2"><label for="2">☆</label> <input class="ratings" type="radio" name="rating" value="1" id="1"><label for="1">☆</label> </div> <?php $html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) ); $params['html'] = $html; $this->render_widget( $params ); } /** * Render Emoji Widget * * @param array $params * * @since 1.0.1 */ public function render_emoji( $params = array() ) { ob_start(); ?> <div class="emoji"> <!--elements are in reversed order, to allow "previous sibling selectors" in CSS--> <input class="emojis" type="radio" name="rating" value="love" id="5"/><label for="5" class="ig-emoji" data-reaction="Love">😍</label> <input class="emojis" type="radio" name="rating" value="smile" id="4"/><label for="4" class="ig-emoji" data-reaction="Smile">😊</label> <input class="emojis" type="radio" name="rating" value="neutral" id="3"/><label for="3" class="ig-emoji" data-reaction="Neutral">😐</label> <input class="emojis" type="radio" name="rating" value="sad" id="1"/><label for="2" class="ig-emoji" data-reaction="Sad">😠</label> <input class="emojis" type="radio" name="rating" value="angry" id="1"/><label for="1" class="ig-emoji" data-reaction="Angry">😡</label> </div> <div id="emoji-info"></div> <?php $html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) ); $params['html'] = $html; $this->render_widget( $params ); } /** * Render General Feedback Sidebar Button Widget * * @since 1.0.3 */ public function render_general_feedback( $params = array() ) { $params = $this->prepare_widget_params( $params ); ob_start(); ?> <div class="ig-general-feedback" id="ig-general-feedback-<?php echo esc_attr( $this->plugin ); ?>"> <form class="ig-general-feedback" id="ig-general-feedback"> <p class="ig-feedback-data-name"> <label class="ig-label">Name</label><br/> <input type="text" name="feedback_data[name]" id="ig-feedback-data-name" value="<?php echo esc_attr( $params['name'] ); ?>"/> </p> <p class="ig-feedback-data-email"> <label class="ig-label"">Email</label><br/> <input type="email" name="feedback_data[email]" id="ig-feedback-data-email" value="<?php echo esc_attr( $params['email'] ); ?>"/> </p> <p class="ig-feedback-data-message"> <label class="ig-label"">Feedback</label><br/> <textarea name="feedback_data[details]" id="ig-feedback-data-message"></textarea> </p> <?php if ( isset( $params['consent'] ) && true === $params['consent'] ) { ?> <p> <input type="checkbox" name="feedback_data[collect_system_info]" checked="checked" id="ig-feedback-data-consent"/><?php echo esc_html( $params['consent_text'] ); ?> </p> <?php } ?> </form> </div> <?php $html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) ); $params['html'] = $html; $title = $params['title']; $slug = sanitize_title( $title ); $event = $this->event_prefix . $params['event']; $html = ! empty( $params['html'] ) ? $params['html'] : ''; $escape_allowed_tags = $this->get_escape_allowed_tags(); ob_start(); ?> <script type="text/javascript"> jQuery(document).ready(function ($) { function doSend(details, meta, system_info) { var data = { action: '<?php echo esc_js( $this->ajax_action ); ?>', feedback: { type: '<?php echo esc_js( $params['type'] ); ?>', slug: '<?php echo esc_js( $slug ); ?>', title: '<?php echo esc_js( $title ); ?>', details: details }, event: '<?php echo esc_js( $event ); ?>', // Add additional information misc: { plugin: '<?php echo esc_js( $this->plugin ); ?>', plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>', is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>', set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>', meta_info: meta, system_info: system_info }, security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>' }; return jQuery.post(ajaxurl, data); } function validateEmail(email) { var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; if (!emailReg.test(email)) { return false; } else { return true; } } var feedbackButtonClass = 'ig-feedback-button-<?php echo esc_js( $this->plugin ); ?>'; $('#wpwrap').append('<div class="ig-es-feedback-button ' + feedbackButtonClass + '">Feedback</div>'); $('.' + feedbackButtonClass).on('click', function () { Swal.mixin({ footer: '<?php echo wp_kses_post( $this->footer ); ?>', position: '<?php echo esc_js( $params['position'] ); ?>', width: <?php echo esc_js( $params['width'] ); ?>, animation: false, focusConfirm: false, allowEscapeKey: true, showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>', allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>', showLoaderOnConfirm: true, confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>', backdrop: '<?php echo (int) $params['backdrop']; ?>' }).queue([ { title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>', html: '<?php echo wp_kses( $html, $escape_allowed_tags ); ?>', customClass: { popup: 'animated fadeInUpBig' }, onOpen: () => { }, preConfirm: () => { var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>'); var $form = $overlay.find('form'); var email = $form.find('#ig-feedback-data-email').val(); var name = $form.find('#ig-feedback-data-name').val(); var message = $form.find('#ig-feedback-data-message').val(); var consent = $form.find('#ig-feedback-data-consent').attr('checked'); if (email !== '' && !validateEmail(email)) { Swal.showValidationMessage('Please enter valid email'); return; } if (message === '') { Swal.showValidationMessage('Please enter your message'); return; } var system_info = true; if (consent === 'checked') { system_info = true; } var meta = { name: name, email: email }; return doSend(message, meta, system_info); } }, ]).then(response => { if (response.hasOwnProperty('value')) { Swal.fire({ type: 'success', width: <?php echo esc_js( $params['width'] ); ?>, title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>', showConfirmButton: false, position: '<?php echo esc_js( $params['position'] ); ?>', timer: 1500, animation: false }); } }); }); }); </script> <?php } /** * Render Facebook Widget * * @since 1.0.9 */ public function render_fb_widget( $params ) { $params = $this->prepare_widget_params( $params ); $title = $params['title']; $widget_tyoe = ! empty( $params['widget_tyoe'] ) ? $params['widget_tyoe'] : 'question'; $slug = sanitize_title( $title ); $event = $this->event_prefix . $params['event']; $html = ! empty( $params['html'] ) ? $params['html'] : ''; $confirm_button_link = ! empty( $params['confirmButtonLink'] ) ? $params['confirmButtonLink'] : ''; $cancel_button_link = ! empty( $params['cancelButtonLink'] ) ? $params['cancelButtonLink'] : ''; $show_cancel_button = ! empty( $params['showCancelButton'] ) ? 'true' : 'false'; $cancel_button_text = ! empty( $params['cancelButtonText'] ) ? $params['cancelButtonText'] : 'Cancel'; ?> <script> Swal.mixin({ type: '<?php echo esc_js( $widget_tyoe ); ?>', position: '<?php echo esc_js( $params['position'] ); ?>', width: <?php echo esc_js( $params['width'] ); ?>, animation: false, focusConfirm: true, allowEscapeKey: true, showCancelButton: <?php echo esc_js( $show_cancel_button ); ?>, confirmButtonColor: '#0e9f6e', cancelButtonColor: '#5850ec', cancelButtonText: '<?php echo wp_kses_post( $cancel_button_text ); ?>', showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>', allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>', showLoaderOnConfirm: true, confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>', backdrop: '<?php echo (int) $params['backdrop']; ?>' }).queue([ { title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>', html: '<?php echo wp_kses_post( $html ); ?>', customClass: { popup: 'animated fadeInUpBig' }, preConfirm: () => { window.open( '<?php echo esc_url( $confirm_button_link ); ?>', '_blank' // <- This is what makes it open in a new window. ); } } ]).then(response => { if (response.hasOwnProperty('value')) { Swal.fire({ type: 'success', width: <?php echo esc_js( $params['width'] ); ?>, title: "Thank You!", showConfirmButton: false, position: '<?php echo esc_js( $params['position'] ); ?>', timer: 1500, animation: false }); } else if(response.dismiss == 'cancel') { window.open( '<?php echo esc_url( $cancel_button_link ); ?>', '_blank' // <- This is what makes it open in a new window. ); } }); </script> <?php } /** * Render Poll widget * * @param array $params * * @since 1.1.0 */ public function render_poll_widget( $params = array() ) { $params = $this->prepare_widget_params( $params ); $fields = ! empty( $params['fields'] ) ? $params['fields'] : array(); if ( empty( $fields ) ) { return; } $default_values = ! empty( $params['default_values'] ) ? $params['default_values'] : array(); $allow_multiple = ! empty( $params['allow_multiple'] ) ? $params['allow_multiple'] : false; $title = $params['title']; if ( ! empty( $params['slug'] ) ) { $slug = $params['slug']; } else { $slug = sanitize_title( $title ); } $event = $this->event_prefix . $params['event']; $desc = ! empty( $params['desc'] ) ? $params['desc'] : ''; $display_as = ! empty( $params['display_as'] ) ? $params['display_as'] : 'inline'; $system_info = isset( $params['system_info'] ) ? $params['system_info'] : true; ob_start(); ?> <div class="ig-general-feedback" id="ig-general-feedback-<?php echo esc_attr( $this->plugin ); ?>"> <form class="ig-general-feedback" id="ig-general-feedback"> <?php if ( ! empty( $title ) ) { ?> <h2><?php echo wp_kses_post( $title ); ?></h2> <?php } ?> <?php if ( ! empty( $desc ) ) { ?> <p><?php echo wp_kses_post( $desc ); ?></p> <?php } ?> <p class="ig-general-feedback mb-3"> <?php foreach ( $fields as $index => $field ) { $field_type = $field['type']; $field_name = $field['name']; $field_value = ! empty( $field['value'] ) ? $field['value'] : ''; $field_placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : ''; $field_required = isset ( $field['required'] ) ? $field['required'] : false; switch ( $field_type ) { case 'textarea': ?> <p class="ig-feedback-data-poll-message mb-3" id="ig-feedback-data-poll-message"> <textarea name="feedback_data[<?php echo esc_attr( $field_name ); ?>]" id="ig-feedback-data-poll-additional-message" placeholder="<?php echo esc_attr( $field_placeholder ); ?>"></textarea> </p> <br/> <?php break; case 'radio': case 'checkbox': ?> <label> <input type="<?php echo esc_attr( $field_type ); ?>" name="feedback_data[<?php echo esc_attr( $field_name ); ?>]" value="<?php echo esc_attr( $field_value ); ?>" <?php echo ( ! empty( $default_values[ $field_name ] ) && $field_value === $default_values[ $field_name ] ) ? 'checked' : ''; ?> class="<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field" <?php echo $field_required ? 'required' : ''; ?>> <?php echo wp_kses_post( $field['label'] ); ?> </label> <br/> <?php break; default: ?> <label> <input type="<?php echo esc_attr( $field_type ); ?>" name="feedback_data[<?php echo esc_attr( $field_name ); ?>]" value="<?php echo esc_attr( $field['value'] ); ?>" class="<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field"> <?php echo wp_kses_post( $field['label'] ); ?> </label> <br/> <?php } ?> <?php if ( 'other' === $field['value'] ) { ?> <div class="ig_feedback_text_wrapper"> <textarea id="feedback_text" name="feedback[feedback_text]" class="form-textarea text-sm w-2/3 mt-3 mb-1 border-gray-400 w-3/5 hidden" placeholder="<?php echo esc_attr__( 'Tell us more about your desired feature', $this->plugin ); ?>"></textarea> </div> <?php } } ?> </p> <?php if ( 'inline' === $display_as ) { ?> <button type="submit" class="button"> <?php echo esc_html__( 'Submit your feedback', $this->plugin ); ?> </button> <br/> <br/> <?php } ?> </form> </div> <?php $html = str_replace( array( "\r", "\n" ), '', trim( ob_get_clean() ) ); $event = $this->event_prefix . $params['event']; if ( 'inline' === $display_as ) { $this->render_inline_feedback_widget( $html, $params ); } elseif ( 'popup' === $display_as ) { $this->render_popup_feedback_widget( $html, $params ); } ?> <script type="text/javascript"> function doSend(data) { var system_info = <?php echo $system_info ? 'true' : 'false'; ?>; var requestData = { action: '<?php echo esc_js( $this->ajax_action ); ?>', feedback: { type: '<?php echo esc_js( $params['type'] ); ?>', slug: '<?php echo esc_js( $slug ); ?>', data: data }, event: '<?php echo esc_js( $event ); ?>', // Add additional information misc: { plugin: '<?php echo esc_js( $this->plugin ); ?>', plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>', is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>', set_transient: '<?php echo esc_js( $params['set_transient'] ); ?>', system_info: system_info }, security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>' }; return jQuery.post(ajaxurl, requestData, null, 'json'); } </script> <?php } /** * Render inline feedback widget * * @since 1.2.7 * * @param array $params * @param string $html * @return void */ public function render_inline_feedback_widget( $html, $params ) { $escape_allowed_tags = $this->get_escape_allowed_tags(); ?> <style type="text/css"> .ig-feedback-inline h2{ font-size:2em; padding: 0.5em 0; } .ig-feedback-inline{ border:none; width:80%; margin: 1em auto !important; /* background:#fbe2597d; */ } .ig-feedback-inline button{ background: green !important; color: #FFF !important; } .ig-feedback-inline radio{ line-height:1em; } .ig-feedback-logo{ float:right; } .ig-feedback-inline label{ font-size: 1.2em; padding-bottom: 0.1em; } .ig-feedback-inline .button{ padding: 0.7em; font-size: 1.2em; border-radius: 0; } </style> <div class="notice ig-feedback-notice ig-feedback-inline"> <div class="ig-feedback-logo"> <img src="<?php echo esc_url( plugin_dir_url( __FILE__ ) ); ?>../../admin/assets/images/icon-64.png"> </div> <?php echo wp_kses( $html, $escape_allowed_tags ); ?> </div> <script type="text/javascript"> jQuery(document).ready(function ($) { $('.<?php echo esc_attr( $this->plugin_abbr ); ?>-feedback-field').on('change', function(){ let value = $(this).val(); if ( 'other' === value ) { $('#feedback_text').removeClass('hidden'); } else { $('#feedback_text').addClass('hidden'); } }); var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>'); var $form = $overlay.find('form'); $($form).on('submit', function(e){ e.preventDefault(); let selected_feature = $form.find("input[name='feedback_data[feature]']:checked").val(); let form_data = { questions_response : { selected_feature: selected_feature } } if ( selected_feature === 'other' ) { form_data.other_feature = $form.find('textarea[name="feedback[feedback_text]"]').val(); } var request = doSend( form_data ); request.done(response => { if (response.status && response.status === 'success') { let success_text = '<?php echo esc_html__( 'Your feedback submitted successfully.', $this->plugin ); ?>'; $('.ig-feedback-notice').html('<p>' + success_text + '</p>'); } else { let error_text = '<?php echo esc_html__( 'An error has occured. Please try again.', $this->plugin ); ?>'; $('.ig-feedback-notice').removeClass('notice-success').addClass('notice-error').append('<p>' + error_text + '</p>'); } }).fail( response => { let error_text = '<?php echo esc_html__( 'An error has occured. Please try again.', $this->plugin ); ?>'; $('.ig-feedback-notice').removeClass('notice-success').addClass('notice-error').append('<p>' + error_text + '</p>'); }); }); }); </script> <?php } /** * Render popup feedback widget * * @since 1.2.7 * * @param string $html * @param array $params * @return void */ public function render_popup_feedback_widget( $html, $params ) { $escape_allowed_tags = $this->get_escape_allowed_tags(); ?> <script type="text/javascript"> jQuery(document).ready(function ($) { Swal.mixin({ footer: '', position: '<?php echo esc_js( $params['position'] ); ?>', width: <?php echo esc_js( $params['width'] ); ?>, animation: false, focusConfirm: false, allowEscapeKey: true, showCloseButton: '<?php echo esc_js( $params['showCloseButton'] ); ?>', allowOutsideClick: '<?php echo esc_js( $params['allowOutsideClick'] ); ?>', showLoaderOnConfirm: true, confirmButtonText: '<?php echo wp_kses_post( $params['confirmButtonText'] ); ?>', backdrop: '<?php echo (int) $params['backdrop']; ?>' }).queue([ { title: '<p class="ig-feedback-title"><?php echo esc_js( $params['title'] ); ?></p>', html: '<?php echo wp_kses( $html, $escape_allowed_tags ); ?>', customClass: { popup: 'animated fadeInUpBig' }, onOpen: () => { }, preConfirm: () => { var $overlay = $('#ig-general-feedback-<?php echo esc_js( $this->plugin ); ?>'); var $form = $overlay.find('form'); if ( ! jQuery($form)[0].checkValidity()) { Swal.showValidationMessage('<?php echo esc_html__( 'Please select option', $this->plugin ); ?>'); return; } var poll_options = $form.find("input[name='feedback_data[poll_options]']:checked").val(); var message = $form.find("#ig-feedback-data-poll-additional-message").val(); var data = { poll_option: poll_options, additional_feedback: message }; var meta = {}; return doSend(data); } }, ]).then(response => { if (response.hasOwnProperty('value')) { Swal.fire({ type: 'success', width: <?php echo esc_js( $params['width'] ); ?>, title: '<?php echo esc_attr__( 'Thank You!', $this->plugin ); ?>', showConfirmButton: false, position: '<?php echo esc_js( $params['position'] ); ?>', timer: 1500, animation: false }); } }); }); </script> <?php } /** * Get Feedback API url * * @param $is_dev_mode * * @return string * * @since 1.0.1 */ public function get_api_url( $is_dev_mode ) { if ( $is_dev_mode ) { $this->api_url = 'http://192.168.0.130:9094/store/feedback/'; } return $this->api_url; } /** * Deactivation Survey javascript. * * @since 1.0.0 */ public function js() { if ( ! $this->is_plugin_page() ) { return; } $title = 'Why are you deactivating ' . $this->name . '?'; $slug = sanitize_title( $title ); $event = $this->event_prefix . 'plugin.deactivation'; ?> <script type="text/javascript"> jQuery(function ($) { var $deactivateLink = $('#the-list').find('[data-slug="<?php echo esc_js( $this->plugin ); ?>"] span.deactivate a'), $overlay = $('#ig-deactivate-survey-<?php echo esc_js( $this->plugin ); ?>'), $form = $overlay.find('form'), formOpen = false, consent = $('#ig-deactivate-survey-help-consent-<?php echo esc_js( $this->plugin ); ?>'); function togglePersonalInfoFields(show) { if (show) { $form.find('#ig-deactivate-survey-info-name').show(); $form.find('#ig-deactivate-survey-info-email-address').show(); $form.find('#ig-deactivate-survey-consent-additional-data').show(); } else { $form.find('#ig-deactivate-survey-info-name').hide(); $form.find('#ig-deactivate-survey-info-email-address').hide(); $form.find('#ig-deactivate-survey-consent-additional-data').hide(); } }; function loader($show) { if ($show) { $form.find('#ig-deactivate-survey-loader').show(); } else { $form.find('#ig-deactivate-survey-loader').hide(); } } function validateEmail(email) { var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; if (!emailReg.test(email)) { return false; } else { return true; } }; // Plugin listing table deactivate link. $deactivateLink.on('click', function (event) { event.preventDefault(); $overlay.css('display', 'table'); formOpen = true; $form.find('.ig-deactivate-survey-option:first-of-type input[type=radio]').focus(); }); // Survey radio option selected. $form.on('change', 'input[type=radio]', function (event) { event.preventDefault(); $form.find('input[type=text], .error').hide(); $form.find('.ig-deactivate-survey-option').removeClass('selected'); $(this).closest('.ig-deactivate-survey-option').addClass('selected').find('input[type=text]').show(); if (consent.attr('checked') === 'checked') { togglePersonalInfoFields(true); } }); // Survey Skip & Deactivate. $form.on('click', '.ig-deactivate-survey-deactivate', function (event) { event.preventDefault(); let deactivationURL = $deactivateLink.attr('href'); let skipSurveyURL = deactivationURL + '&survey_status=skipped'; location.href = skipSurveyURL; }); // Help Consent togglePersonalInfoFields(false); loader(false); consent.on('click', function () { if (consent.attr('checked') === 'checked') { togglePersonalInfoFields(true); } else { togglePersonalInfoFields(false); } }); // Survey submit. $form.submit(function (event) { event.preventDefault(); loader(true); if (!$form.find('input[type=radio]:checked').val()) { $form.find('.ig-deactivate-survey-footer').prepend('<span class="error"><?php echo esc_js( __( 'Please select an option', $this->plugin ) ); ?></span>'); return; } var system_info = false; var name = ''; var email = ''; if (consent.attr('checked') === 'checked') { name = $form.find('#ig-deactivate-survey-info-name').val(); email = $form.find('#ig-deactivate-survey-info-email-address').val(); if (email === '' || !validateEmail(email)) { alert('Please enter valid email'); return; } system_info = true; } var meta = { name: name, email: email }; var data = { action: '<?php echo esc_js( $this->ajax_action ); ?>', feedback: { type: 'radio', title: '<?php echo esc_js( $title ); ?>', slug: '<?php echo esc_js( $slug ); ?>', value: $form.find('.selected input[type=radio]').attr('data-option-slug'), details: $form.find('.selected input[type=text]').val() }, event: '<?php echo esc_js( $event ); ?>', // Add additional information misc: { plugin: '<?php echo esc_js( $this->plugin ); ?>', plugin_abbr: '<?php echo esc_js( $this->plugin_abbr ); ?>', is_dev_mode: '<?php echo esc_js( $this->is_dev_mode ); ?>', set_cookie: '', meta_info: meta, system_info: system_info }, security: '<?php echo esc_js( wp_create_nonce( $this->plugin_abbr . '-admin-ajax-nonce' ) ); ?>' }; var submitSurvey = $.post(ajaxurl, data); submitSurvey.always(function () { location.href = $deactivateLink.attr('href'); }); }); // Exit key closes survey when open. $(document).keyup(function (event) { if (27 === event.keyCode && formOpen) { $overlay.hide(); formOpen = false; $deactivateLink.focus(); } }); }); </script> <?php } /** * Survey CSS. * * @since 1.0.0 */ public function css() { if ( ! $this->is_plugin_page() ) { return; } ?> <style type="text/css"> .ig-deactivate-survey-modal { display: none; table-layout: fixed; position: fixed; z-index: 9999; width: 100%; height: 100%; text-align: center; font-size: 14px; top: 0; left: 0; background: rgba(0, 0, 0, 0.8); } .ig-deactivate-survey-wrap { display: table-cell; vertical-align: middle; } .ig-deactivate-survey { background-color: #fff; max-width: 550px; margin: 0 auto; padding: 30px; text-align: left; } .ig-deactivate-survey .error { display: block; color: red; margin: 0 0 10px 0; } .ig-deactivate-survey-title { display: block; font-size: 18px; font-weight: 700; text-transform: uppercase; border-bottom: 1px solid #ddd; padding: 0 0 18px 0; margin: 0 0 18px 0; } .ig-deactivate-survey-options { border-bottom: 1px solid #ddd; padding: 0 0 18px 0; margin: 0 0 18px 0; } .ig-deactivate-survey-info-data { padding: 0 0 18px 0; margin: 10px 10px 10px 30px; } .ig-deactivate-survey-info-name, .ig-deactivate-survey-info-email-address { width: 230px; margin: 10px; } .ig-deactivate-survey-title span { color: #999; margin-right: 10px; } .ig-deactivate-survey-desc { display: block; font-weight: 600; margin: 0 0 18px 0; } .ig-deactivate-survey-option { margin: 0 0 10px 0; } .ig-deactivate-survey-option-input { margin-right: 10px !important; } .ig-deactivate-survey-option-details { display: none; width: 90%; margin: 10px 0 0 30px; } .ig-deactivate-survey-footer { margin-top: 18px; } .ig-deactivate-survey-deactivate { float: right; font-size: 13px; color: #ccc; text-decoration: none; padding-top: 7px; } .ig-deactivate-survey-loader { vertical-align: middle; padding: 10px; } </style> <?php } /** * Survey modal. * * @since 1.0.0 */ public function modal() { if ( ! $this->is_plugin_page() ) { return; } $email = $this->get_contact_email(); $options = array( 1 => array( 'title' => esc_html__( 'I no longer need the plugin', $this->plugin ), 'slug' => 'i-no-longer-need-the-plugin', ), 2 => array( 'title' => esc_html__( 'I\'m switching to a different plugin', $this->plugin ), 'slug' => 'i-am-switching-to-a-different-plugin', 'details' => esc_html__( 'Please share which plugin', $this->plugin ), ), 3 => array( 'title' => esc_html__( 'I couldn\'t get the plugin to work', $this->plugin ), 'slug' => 'i-could-not-get-the-plugin-to-work', ), 4 => array( 'title' => esc_html__( 'It\'s a temporary deactivation', $this->plugin ), 'slug' => 'it-is-a-temporary-deactivation', ), 5 => array( 'title' => esc_html__( 'Other', $this->plugin ), 'slug' => 'other', 'details' => esc_html__( 'Please share the reason', $this->plugin ), ), ); ?> <div class="ig-deactivate-survey-modal" id="ig-deactivate-survey-<?php echo esc_js( $this->plugin ); ?>"> <div class="ig-deactivate-survey-wrap"> <form class="ig-deactivate-survey" method="post"> <span class="ig-deactivate-survey-title"><span class="dashicons dashicons-testimonial"></span><?php echo ' ' . esc_html__( 'Quick Feedback', $this->plugin ); ?></span> <span class="ig-deactivate-survey-desc"><?php echo esc_html__( sprintf( 'If you have a moment, please share why you are deactivating %s:', $this->name ), $this->plugin ); ?></span> <div class="ig-deactivate-survey-options"> <?php foreach ( $options as $id => $option ) : ?> <div class="ig-deactivate-survey-option"> <label for="ig-deactivate-survey-option-<?php echo esc_attr( $this->plugin ); ?>-<?php echo esc_attr( $id ); ?>" class="ig-deactivate-survey-option-label"> <input id="ig-deactivate-survey-option-<?php echo esc_attr( $this->plugin ); ?>-<?php echo esc_attr( $id ); ?>" class="ig-deactivate-survey-option-input" type="radio" name="code" value="<?php echo esc_attr( $id ); ?>" data-option-slug="<?php echo esc_attr( $option['slug'] ); ?>"/> <span class="ig-deactivate-survey-option-reason"><?php echo esc_attr( $option['title'] ); ?></span> </label> <?php if ( ! empty( $option['details'] ) ) : ?> <input class="ig-deactivate-survey-option-details" type="text" placeholder="<?php echo esc_attr( $option['details'] ); ?>"/> <?php endif; ?> </div> <?php endforeach; ?> </div> <div class="ig-deactivate-survey-help-consent"> <input id="ig-deactivate-survey-help-consent-<?php echo esc_attr( $this->plugin ); ?>" class="ig-deactivate-survey-option-input" type="checkbox" name="code" data-option-slug="<?php echo esc_attr( $option['slug'] ); ?>"/><b><?php echo esc_html__( 'Yes, I give my consent to track plugin usage and contact me back to make this plugin works!', $this->plugin ); ?></b> </div> <div class="ig-deactivate-survey-info-data"> <input type="text" class="ig-deactivate-survey-info-name" id="ig-deactivate-survey-info-name" placeholder="Enter Name" name="ig-deactivate-survey-info-name" value=""/> <input type="text" class="ig-deactivate-survey-info-email-address" id="ig-deactivate-survey-info-email-address" name="ig-deactivate-survey-info-email-address" value="<?php echo esc_js( $email ); ?>"/> </div> <div class="ig-deactivate-survey-footer"> <button type="submit" class="ig-deactivate-survey-submit button button-primary button-large"><?php echo sprintf( esc_html__( 'Submit %s Deactivate', $this->plugin ), '&' ); ?></button> <img class="ig-deactivate-survey-loader" id="ig-deactivate-survey-loader" src="<?php echo esc_url( plugin_dir_url( __FILE__ ) ); ?>/assets/images/loading.gif"/> <a href="#" class="ig-deactivate-survey-deactivate"><?php echo sprintf( esc_html__( 'Skip %s Deactivate', $this->plugin ), '&' ); ?></a> </div> </form> </div> </div> <?php } /** * Can we show feedback widget in this environment * * @return bool */ public function can_show_feedback_widget() { // Is development mode? Enable it. if ( $this->is_dev_mode ) { return true; } // Don't show on dev setup if dev mode is off. if ( $this->is_dev_url() ) { return false; } return true; } /** * Checks if current admin screen is the plugins page. * * @return bool * @since 1.0.0 */ public function is_plugin_page() { $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false; if ( empty( $screen ) ) { return false; } return ( ! empty( $screen->id ) && in_array( $screen->id, array( 'plugins', 'plugins-network' ), true ) ); } /** * Checks if current site is a development one. * * @return bool * * @since 1.0.0 */ public function is_dev_url() { $url = network_site_url( '/' ); $is_local_url = false; // Trim it up $url = strtolower( trim( $url ) ); // Need to get the host...so let's add the scheme so we can use parse_url if ( false === strpos( $url, 'http://' ) && false === strpos( $url, 'https://' ) ) { $url = 'http://' . $url; } $url_parts = parse_url( $url ); $host = ! empty( $url_parts['host'] ) ? $url_parts['host'] : false; // Discard our development environment if ( '192.168.0.112' === $host ) { return false; } if ( ! empty( $url ) && ! empty( $host ) ) { if ( false !== ip2long( $host ) ) { if ( ! filter_var( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) { $is_local_url = true; } } elseif ( 'localhost' === $host ) { $is_local_url = true; } $tlds_to_check = array( '.dev', '.local', ':8888' ); foreach ( $tlds_to_check as $tld ) { if ( false !== strpos( $host, $tld ) ) { $is_local_url = true; continue; } } if ( substr_count( $host, '.' ) > 1 ) { $subdomains_to_check = array( 'dev.', '*.staging.', 'beta.', 'test.' ); foreach ( $subdomains_to_check as $subdomain ) { $subdomain = str_replace( '.', '(.)', $subdomain ); $subdomain = str_replace( array( '*', '(.)' ), '(.*)', $subdomain ); if ( preg_match( '/^(' . $subdomain . ')/', $host ) ) { $is_local_url = true; continue; } } } } return $is_local_url; } /** * Store plugin feedback data into option * * @param $plugin_abbr * @param $event * @param $data * * @since 1.0.1 */ public function set_feedback_data( $plugin_abbr, $event, $data = array() ) { $feedback_option = $plugin_abbr . '_feedback_data'; $feedback_data = maybe_unserialize( get_option( $feedback_option, array() ) ); $data['created_on'] = gmdate( 'Y-m-d H:i:s' ); $feedback_data[ $event ][] = $data; update_option( $feedback_option, $feedback_data ); } /** * Get plugin feedback data * * @param $plugin_abbr * * @return mixed|void * * @since 1.0.1 */ public function get_feedback_data( $plugin_abbr ) { $feedback_option = $plugin_abbr . '_feedback_data'; return get_option( $feedback_option, array() ); } /** * Get event specific feedback data * * @param $plugin_abbr * @param $event * * @return array|mixed */ public function get_event_feedback_data( $plugin_abbr, $event ) { $feedback_data = $this->get_feedback_data( $plugin_abbr ); $event_feedback_data = ! empty( $feedback_data[ $event ] ) ? $feedback_data[ $event ] : array(); return $event_feedback_data; } /** * Check whether event tracked or not. * * @param $plugin_abbr * @param $event * * @return bool * * @since 1.1.0 */ public function is_event_tracked( $plugin_abbr = '', $event = '' ) { if ( empty( $plugin_abbr ) || empty( $event ) ) { return false; } $feedback_data = $this->get_feedback_data( $plugin_abbr ); if ( count( $feedback_data ) > 0 ) { $events = array_keys( $feedback_data ); foreach ( $events as $key => $value ) { if ( strpos( $value, $event ) ) { return true; } } } return false; } /** * Set event into transient * * @param $event * @param int $expiry in days */ public function set_event_transient( $event, $expiry = 45 ) { set_transient( $event, 1, time() + ( 86400 * $expiry ) ); } /** * Check whether event transient is set or not. * * @param $event * * @return bool * * @since 1.0.1 */ public function is_event_transient_set( $event ) { return get_transient( $event ); } /** * Get contact email * * @return string * * @since 1.0.8 */ public function get_contact_email() { $email = ''; // Get logged in User Email Address $current_user = wp_get_current_user(); if ( $current_user instanceof WP_User ) { $email = $current_user->user_email; } // If email empty, get admin email if ( empty( $email ) ) { $email = get_option( 'admin_email' ); } return $email; } /** * Hook to ajax_action * * Send feedback to server */ public function submit_feedback() { check_ajax_referer( $this->plugin_abbr . '-admin-ajax-nonce', 'security' ); $data = ! empty( $_POST ) ? $_POST : array(); $data['site'] = esc_url( home_url() ); $plugin = ! empty( $data['misc']['plugin'] ) ? $data['misc']['plugin'] : 'ig_feedback'; $plugin_abbr = ! empty( $data['misc']['plugin_abbr'] ) ? $data['misc']['plugin_abbr'] : 'ig_feedback'; $is_dev_mode = ! empty( $data['misc']['is_dev_mode'] ) ? $data['misc']['is_dev_mode'] : false; $set_transient = ! empty( $data['misc']['set_transient'] ) ? $data['misc']['set_transient'] : false; $system_info = ( isset( $data['misc']['system_info'] ) && $data['misc']['system_info'] === 'true' ) ? true : false; $meta_info = ! empty( $data['misc']['meta_info'] ) ? $data['misc']['meta_info'] : array(); unset( $data['misc'] ); $default_meta_info = array( 'plugin' => sanitize_key( $plugin ), 'locale' => get_locale(), 'wp_version' => get_bloginfo( 'version' ), 'php_version' => PHP_VERSION, ); $meta_info = wp_parse_args( $meta_info, $default_meta_info ); $additional_info = array(); $additional_info = apply_filters( $plugin_abbr . '_additional_feedback_meta_info', $additional_info, $system_info ); // Get Additional meta information if ( is_array( $additional_info ) && count( $additional_info ) > 0 ) { $meta_info = array_merge( $meta_info, $additional_info ); } $data['meta'] = $meta_info; $data = wp_unslash( $data ); $args = array( 'timeout' => 15, 'sslverify' => false, 'body' => $data, 'blocking' => false, ); $this->set_feedback_data( $plugin_abbr, $data['event'], $data['feedback'] ); // Set Cookie if ( $set_transient ) { $this->set_event_transient( $data['event'] ); } $response = wp_remote_post( $this->get_api_url( $is_dev_mode ), $args ); $result['status'] = 'success'; if ( $response instanceof WP_Error ) { $error_message = $response->get_error_message(); $result['status'] = 'error'; $result['message'] = $error_message; } die( json_encode( $result ) ); } /** * Get list of tags allowed in escaping * * @return array $ig_es_escape_allowed_tags */ public function get_escape_allowed_tags() { $ig_escape_allowed_tags = apply_filters( $this->plugin_abbr . '_escape_allowed_tags', array() ); return $ig_escape_allowed_tags; } /** * Render Quick Feedback Widget * * @param $params * * @since 4.1.0 */ public function render_feedback_widget( $params ) { if ( ! $this->can_show_feedback_widget() ) { return; } $default_params = array( 'set_transient' => true, 'force' => false, 'show_once' => false, ); $params = wp_parse_args( $params, $default_params ); if ( ! empty( $params['event'] ) ) { $event = $this->event_prefix . $params['event']; $force = ! empty( $params['force'] ) ? $params['force'] : false; $can_show = false; if ( $force ) { $can_show = true; } else { if ( ! $this->is_event_transient_set( $event ) ) { $can_show = true; $feedback_data = $this->get_event_feedback_data( $this->plugin_abbr, $event ); if ( count( $feedback_data ) > 0 ) { $show_once = $params['show_once']; $feedback_data = array_reverse( $feedback_data ); $last_feedback_given_on = $feedback_data[0]['created_on']; // If event feedback given within 45 days or show event only once? // Don't show now if ( $show_once || ( strtotime( $last_feedback_given_on ) > strtotime( '-45 days' ) ) ) { $can_show = false; } } } } if ( $can_show ) { if ( 'star' === $params['type'] ) { $this->render_stars( $params ); } elseif ( 'emoji' === $params['type'] ) { $this->render_emoji( $params ); } elseif ( 'feedback' === $params['type'] ) { $this->render_general_feedback( $params ); } elseif ( 'fb' === $params['type'] ) { /** * We are not calling home for this event and we want to show * this Widget only once. So, we are storing feedback data now. */ $this->set_feedback_data( $this->plugin_abbr, $event ); $this->render_fb_widget( $params ); } elseif ( 'poll' === $params['type'] ) { if ( $params['show_once'] ) { $this->set_feedback_data( $this->plugin_abbr, $event ); } $this->render_poll_widget( $params ); } } } } } } // End if().