478 lines
16 KiB
PHP
478 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* Class Wbte_Accessibility_Banner
|
|
*
|
|
* This class is responsible for displaying the Accessibility CTA banner.
|
|
*
|
|
* @package Users_Customers_Import_Export_For_WP_WooCommerce
|
|
* @since 2.7.3
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
if ( ! class_exists( 'Wbte_Accessibility_Banner' ) ) {
|
|
|
|
/**
|
|
* Class Wbte_Accessibility_Banner
|
|
*/
|
|
class Wbte_Accessibility_Banner {
|
|
|
|
/**
|
|
* The plugin prefix for nonces.
|
|
*
|
|
* @since 2.7.3
|
|
* @var string
|
|
*/
|
|
private static $plugin_prefix = 'wt_u_iew';
|
|
|
|
/**
|
|
* The accessibility widget plugin file path.
|
|
*
|
|
* @since 2.7.3
|
|
* @var string
|
|
*/
|
|
private static $plugin_file = 'accessibility-widget/accessibility-widget.php';
|
|
|
|
/**
|
|
* Option to store the reminder count and snooze until time.
|
|
* remind_count (1,2) and snooze_until (unix time). Deleted when banner dismissed forever on 3rd remind.
|
|
*
|
|
* @since 2.7.3
|
|
* @var string
|
|
*/
|
|
private static $remind_option = 'cya11y_accessyes_banner_remind_state';
|
|
|
|
/**
|
|
* Option to store the banner hidden status.
|
|
*
|
|
* @since 2.7.3
|
|
* @var string
|
|
*/
|
|
private static $banner_hidden_option = 'cya11y_hide_accessyes_cta_banner';
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public function __construct() {
|
|
include_once ABSPATH . 'wp-admin/includes/plugin.php';
|
|
$installed_plugins = get_plugins();
|
|
|
|
if ( array_key_exists( self::$plugin_file, $installed_plugins ) || self::is_within_remind_snooze() ) {
|
|
return;
|
|
}
|
|
|
|
add_action( 'load-index.php', array( $this, 'register_dashboard_banner_hooks' ) );
|
|
add_action( 'wp_ajax_wbte_accessibility_dismiss_banner', array( $this, 'handle_dismiss_banner' ) );
|
|
add_action( 'wp_ajax_wbte_accessibility_install_plugin', array( $this, 'install_plugin' ) );
|
|
add_action( 'wp_ajax_wbte_accessibility_remind_later', array( $this, 'handle_remind_later' ) );
|
|
}
|
|
|
|
/**
|
|
* Register banner notice and scripts only on the main admin dashboard.
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public function register_dashboard_banner_hooks() {
|
|
add_action( 'admin_notices', array( $this, 'show_banner_notice' ) );
|
|
add_action( 'admin_print_footer_scripts', array( $this, 'enqueue_admin_scripts' ) );
|
|
}
|
|
|
|
/**
|
|
* Whether the banner is hidden until snooze_until.
|
|
*
|
|
* @return bool
|
|
*/
|
|
private static function is_within_remind_snooze() {
|
|
$data = get_option( self::$remind_option, array() );
|
|
if ( ! is_array( $data ) || empty( $data['snooze_until'] ) ) {
|
|
return false;
|
|
}
|
|
return time() < absint( $data['snooze_until'] );
|
|
}
|
|
|
|
/**
|
|
* Handle setting the option when user clicks "Not Interested".
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public static function handle_dismiss_banner() {
|
|
check_ajax_referer( self::$plugin_prefix, '_wpnonce' );
|
|
if ( ! current_user_can( 'manage_options' ) ) {
|
|
wp_send_json_error();
|
|
}
|
|
update_option( self::$banner_hidden_option, true );
|
|
delete_option( self::$remind_option );
|
|
wp_send_json_success();
|
|
}
|
|
|
|
/**
|
|
* Remind later: 7d → 30d → then permanent hide.
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public static function handle_remind_later() {
|
|
check_ajax_referer( self::$plugin_prefix, '_wpnonce' );
|
|
if ( ! current_user_can( 'manage_options' ) ) {
|
|
wp_send_json_error();
|
|
}
|
|
|
|
$data = get_option( self::$remind_option, array() );
|
|
$count = ( is_array( $data ) && isset( $data['remind_count'] ) ) ? absint( $data['remind_count'] ) : 0;
|
|
++$count;
|
|
|
|
if ( $count >= 3 ) {
|
|
update_option( self::$banner_hidden_option, true );
|
|
delete_option( self::$remind_option );
|
|
wp_send_json_success();
|
|
return;
|
|
}
|
|
|
|
$days = ( 1 === $count ) ? 7 : 30;
|
|
|
|
update_option(
|
|
self::$remind_option,
|
|
array(
|
|
'remind_count' => $count,
|
|
'snooze_until' => time() + ( $days * DAY_IN_SECONDS ),
|
|
)
|
|
);
|
|
|
|
wp_send_json_success();
|
|
}
|
|
|
|
/**
|
|
* Handle plugin installation (download with optional activate).
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public static function install_plugin() {
|
|
try {
|
|
check_ajax_referer( self::$plugin_prefix, '_wpnonce' );
|
|
|
|
$response = array(
|
|
'status' => false,
|
|
'message' => esc_html__( 'Something went wrong. Please try again.', 'users-customers-import-export-for-wp-woocommerce' ),
|
|
);
|
|
|
|
if ( ! current_user_can( 'install_plugins' ) ) {
|
|
$response['message'] = esc_html__( 'You do not have sufficient permissions to install plugins.', 'users-customers-import-export-for-wp-woocommerce' );
|
|
wp_send_json( $response );
|
|
return;
|
|
}
|
|
|
|
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
|
|
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
|
|
|
|
$plugin_slug = 'accessibility-widget';
|
|
$api = plugins_api( 'plugin_information', array( 'slug' => $plugin_slug ) );
|
|
|
|
if ( is_wp_error( $api ) ) {
|
|
$response['message'] = $api->get_error_message();
|
|
wp_send_json( $response );
|
|
return;
|
|
}
|
|
|
|
if ( ! isset( $api->download_link ) ) {
|
|
$response['message'] = esc_html__( 'Plugin download link not found.', 'users-customers-import-export-for-wp-woocommerce' );
|
|
wp_send_json( $response );
|
|
return;
|
|
}
|
|
|
|
$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
|
|
$result = $upgrader->install( $api->download_link );
|
|
|
|
if ( is_wp_error( $result ) ) {
|
|
$response['message'] = $result->get_error_message();
|
|
wp_send_json( $response );
|
|
return;
|
|
}
|
|
|
|
if ( $result ) {
|
|
$activate_response = self::activate_plugin();
|
|
if ( $activate_response['status'] ) {
|
|
$response['status'] = true;
|
|
} else {
|
|
$response['message'] = $activate_response['msg'];
|
|
}
|
|
update_option( self::$banner_hidden_option, true );
|
|
delete_option( self::$remind_option );
|
|
}
|
|
|
|
wp_send_json( $response );
|
|
} catch ( Exception $e ) {
|
|
wp_send_json(
|
|
array(
|
|
'status' => false,
|
|
'message' => $e->getMessage(),
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle plugin activation.
|
|
*
|
|
* @since 2.7.3
|
|
* @return array{status: bool, msg: string}
|
|
*/
|
|
public static function activate_plugin() {
|
|
$result = array(
|
|
'status' => false,
|
|
'msg' => '',
|
|
);
|
|
|
|
if ( ! current_user_can( 'activate_plugins' ) ) {
|
|
$result['msg'] = esc_html__( 'You do not have sufficient permissions to activate plugins.', 'users-customers-import-export-for-wp-woocommerce' );
|
|
return $result;
|
|
}
|
|
|
|
if ( file_exists( WP_PLUGIN_DIR . '/' . self::$plugin_file ) ) {
|
|
$activation_result = activate_plugin( self::$plugin_file );
|
|
if ( is_wp_error( $activation_result ) ) {
|
|
$result['status'] = false;
|
|
$result['msg'] = esc_html__( 'Activation failed. Please try again.', 'users-customers-import-export-for-wp-woocommerce' );
|
|
} else {
|
|
$result['status'] = true;
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Display the accessibility banner.
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public function show_banner_notice() {
|
|
$plugin_modal_link = admin_url( 'plugin-install.php?tab=plugin-information&plugin=accessibility-widget&TB_iframe=true' );
|
|
|
|
?>
|
|
<div id="wbte_accessibility_banner" class="notice">
|
|
<div class="wbte_accessibility_banner_main">
|
|
<img src="<?php echo esc_url( plugin_dir_url( __FILE__ ) . 'assets/images/accessyes.svg' ); ?>" alt="<?php esc_attr_e( 'Accessibility Widget', 'users-customers-import-export-for-wp-woocommerce' ); ?>" style="width: 48px; height: 48px;">
|
|
<div class="wbte_accessibility_banner_content">
|
|
<p class="wbte_accessibility_banner_content_title">
|
|
<?php
|
|
printf(
|
|
/* translators: 1: a tag opening, 2: a tag closing */
|
|
esc_html__( 'Make your site inclusive with %1$s AccessiYes accessibility widget. %2$s', 'users-customers-import-export-for-wp-woocommerce' ),
|
|
'<a href="' . esc_url( $plugin_modal_link ) . '" class="thickbox" style="text-decoration: none;">',
|
|
'</a>'
|
|
);
|
|
?>
|
|
</p>
|
|
<p style="font-size: 14px;">
|
|
<?php
|
|
esc_html_e( 'A lightweight accessibility widget to improve accessibility and usability for every users. Set it up in minutes for free.', 'users-customers-import-export-for-wp-woocommerce' );
|
|
?>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="wbte_accessibility_banner_actions">
|
|
<button class="button button-primary" id="wbte_accessibility_banner_install_btn">
|
|
<span class="dashicons dashicons-update wbte_accessibility_banner_install_btn_loader"></span>
|
|
<span class="wbte_accessibility_banner_install_btn_text">
|
|
<?php esc_html_e( 'Install & activate', 'users-customers-import-export-for-wp-woocommerce' ); ?>
|
|
</span>
|
|
</button>
|
|
<a href="#" class="wbte_accessibility_banner_maybe_ltr">
|
|
<?php esc_html_e( 'Remind me later', 'users-customers-import-export-for-wp-woocommerce' ); ?>
|
|
</a>
|
|
</div>
|
|
<span class="wbte_accessibility_banner_dismiss_btn">
|
|
<?php esc_html_e( 'Dismiss', 'users-customers-import-export-for-wp-woocommerce' ); ?>
|
|
<span class="dashicons dashicons-no-alt"></span>
|
|
</span>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Enqueue admin footer scripts for banner actions.
|
|
*
|
|
* @since 2.7.3
|
|
*/
|
|
public static function enqueue_admin_scripts() {
|
|
$ajax_url = admin_url( 'admin-ajax.php' );
|
|
$nonce = wp_create_nonce( self::$plugin_prefix );
|
|
$error_msg = esc_js( __( 'Something went wrong. Please try again.', 'users-customers-import-export-for-wp-woocommerce' ) );
|
|
?>
|
|
<style>
|
|
#wbte_accessibility_banner { padding: 20px; border-left-color: #2271b1; position: relative; }
|
|
.wbte_accessibility_banner_main { display: flex; gap: 12px; align-items: flex-start; }
|
|
.wbte_accessibility_banner_content { flex: 1; }
|
|
.wbte_accessibility_banner_content p { margin: 0; padding: 0; }
|
|
p.wbte_accessibility_banner_content_title{ font-size: 18px; font-weight: 700; margin-bottom: 4px; }
|
|
.wbte_accessibility_banner_actions { display: flex; gap: 16px; align-items: center; margin-left: 60px; margin-top: 16px; }
|
|
#wbte_accessibility_banner_install_btn { font-size: 14px; font-weight: 700; background-color: #2271b1; color: #fff; border-radius: 6px; padding: 6px 24px; line-height: 1.5; display: flex; align-items: center; justify-content: center; }
|
|
#wbte_accessibility_banner_install_btn:hover { background-color: #135e96; }
|
|
.wbte_accessibility_banner_install_btn_text{ display: flex; align-items: center; gap: 4px; }
|
|
.wbte_accessibility_banner_install_btn_loader { animation: wbte_ab_rotation 2s infinite linear; display: none; margin: 3px 5px 0 0; vertical-align: top; }
|
|
@keyframes wbte_ab_rotation {
|
|
from { transform: rotate(0deg); }
|
|
to { transform: rotate(359deg); }
|
|
}
|
|
#wbte_accessibility_banner.wbte_accessibility_banner_loading .wbte_accessibility_banner_loader { position: absolute; inset: 0; background: rgba( 0, 0, 0, 0.6 ); border-radius: 4px; display: flex; align-items: center; justify-content: center; z-index: 1; }
|
|
#wbte_accessibility_banner.wbte_accessibility_banner_loading .wbte_accessibility_banner_loader .spinner { margin: 0; float: none; visibility: visible; }
|
|
.wbte_accessibility_banner_dismiss_btn{ position: absolute; right: 10px; top: 10px; cursor: pointer; }
|
|
.wbte_accessibility_banner_maybe_ltr{ margin-left: 15px; color: #646970; text-decoration: underline; }
|
|
|
|
@media (max-width: 782px) {
|
|
#wbte_accessibility_banner{ flex-direction: column; align-items: flex-start; }
|
|
}
|
|
</style>
|
|
<script>
|
|
( function( $ ) {
|
|
'use strict';
|
|
|
|
var wbteAccessyesNotify = {
|
|
success: function( message ) {
|
|
if ( typeof wbte_sc_notify_msg !== 'undefined' ) {
|
|
wbte_sc_notify_msg.success( message );
|
|
} else if ( typeof wbte_uimpexp_notify_msg !== 'undefined' ) {
|
|
wbte_uimpexp_notify_msg.success( message );
|
|
} else {
|
|
window.alert( message );
|
|
}
|
|
},
|
|
error: function( message ) {
|
|
if ( typeof wbte_sc_notify_msg !== 'undefined' ) {
|
|
wbte_sc_notify_msg.error( message );
|
|
} else if ( typeof wbte_uimpexp_notify_msg !== 'undefined' ) {
|
|
wbte_uimpexp_notify_msg.error( message );
|
|
} else {
|
|
window.alert( message );
|
|
}
|
|
}
|
|
};
|
|
|
|
$( document ).ready( function() {
|
|
const installBtn = $( '#wbte_accessibility_banner_install_btn' );
|
|
const btnTextSpan = installBtn.find( '.wbte_accessibility_banner_install_btn_text' );
|
|
const originalBtnHtml = btnTextSpan.html();
|
|
const banner = $( '#wbte_accessibility_banner' );
|
|
|
|
function setButtonLoading( isLoading ) {
|
|
if ( isLoading ) {
|
|
$( '.wbte_accessibility_banner_install_btn_loader' ).css( 'display', 'inline-block' );
|
|
btnTextSpan.text( '<?php echo esc_js( __( 'Installing...', 'users-customers-import-export-for-wp-woocommerce' ) ); ?>' );
|
|
installBtn.prop( 'disabled', true );
|
|
} else {
|
|
$( '.wbte_accessibility_banner_install_btn_loader' ).css( 'display', 'none' );
|
|
btnTextSpan.html( originalBtnHtml );
|
|
installBtn.prop( 'disabled', false );
|
|
}
|
|
}
|
|
|
|
function hideBanner() {
|
|
banner.slideUp( 200 );
|
|
}
|
|
|
|
function showBannerLoader() {
|
|
if ( banner.hasClass( 'wbte_accessibility_banner_loading' ) ) {
|
|
return;
|
|
}
|
|
banner.addClass( 'wbte_accessibility_banner_loading' ).append(
|
|
'<div class="wbte_accessibility_banner_loader"><span class="spinner"></span></div>'
|
|
);
|
|
banner.find( '.wbte_accessibility_banner_loader .spinner' ).css( 'visibility', 'visible' );
|
|
}
|
|
|
|
function removeBannerLoader() {
|
|
banner.removeClass( 'wbte_accessibility_banner_loading' ).find( '.wbte_accessibility_banner_loader' ).remove();
|
|
}
|
|
|
|
banner.on( 'click', '.wbte_accessibility_banner_dismiss_btn', function(e) {
|
|
e.preventDefault();
|
|
|
|
showBannerLoader();
|
|
$.ajax( {
|
|
url: '<?php echo esc_url( $ajax_url ); ?>',
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
action: 'wbte_accessibility_dismiss_banner',
|
|
_wpnonce: '<?php echo esc_js( $nonce ); ?>'
|
|
},
|
|
success: function( response ) {
|
|
removeBannerLoader();
|
|
if ( response.success ) {
|
|
hideBanner();
|
|
}
|
|
},
|
|
error: function() {
|
|
removeBannerLoader();
|
|
wbteAccessyesNotify.error( '<?php echo esc_js( $error_msg ); ?>' );
|
|
}
|
|
} );
|
|
} );
|
|
|
|
banner.on( 'click', '.wbte_accessibility_banner_maybe_ltr', function( e ) {
|
|
e.preventDefault();
|
|
showBannerLoader();
|
|
$.ajax( {
|
|
url: '<?php echo esc_url( $ajax_url ); ?>',
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
action: 'wbte_accessibility_remind_later',
|
|
_wpnonce: '<?php echo esc_js( $nonce ); ?>'
|
|
},
|
|
success: function( response ) {
|
|
removeBannerLoader();
|
|
if ( response.success ) {
|
|
hideBanner();
|
|
}
|
|
},
|
|
error: function() {
|
|
removeBannerLoader();
|
|
wbteAccessyesNotify.error( '<?php echo esc_js( $error_msg ); ?>' );
|
|
}
|
|
} );
|
|
} );
|
|
|
|
installBtn.on( 'click', function( event ) {
|
|
event.preventDefault();
|
|
|
|
setButtonLoading( true );
|
|
|
|
$.ajax( {
|
|
url: '<?php echo esc_url( $ajax_url ); ?>',
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
action: 'wbte_accessibility_install_plugin',
|
|
_wpnonce: '<?php echo esc_js( $nonce ); ?>'
|
|
},
|
|
success: function( response ) {
|
|
if ( response.status ) {
|
|
setButtonLoading( false );
|
|
hideBanner();
|
|
|
|
wbteAccessyesNotify.success( '<?php echo esc_js( __( 'Plugin installed successfully.', 'users-customers-import-export-for-wp-woocommerce' ) ); ?>' );
|
|
} else {
|
|
setButtonLoading( false );
|
|
const msg = ( response.message && response.message.length ) ? response.message : '<?php echo esc_js( $error_msg ); ?>';
|
|
wbteAccessyesNotify.error( msg );
|
|
}
|
|
},
|
|
error: function() {
|
|
setButtonLoading( false );
|
|
wbteAccessyesNotify.error( '<?php echo esc_js( $error_msg ); ?>' );
|
|
}
|
|
} );
|
|
} );
|
|
} );
|
|
} )( jQuery );
|
|
</script>
|
|
<?php
|
|
}
|
|
}
|
|
new Wbte_Accessibility_Banner();
|
|
}
|