BossBey File Manager
PHP:
8.2.30
OS:
Linux
User:
imagivibe
Root
/
home
/
imagivibe
/
www
/
wp-content
/
plugins
/
robin-image-optimizer
/
admin
/
pages
📤 Upload
📝 New File
📁 New Folder
Close
Editing: class-rio-license.php
<?php /** * License Page class * * Self-contained license management page without Factory Templates dependency. * Reuses existing factory-bootstrap-500 CSS framework. * * @package Robin_Image_Optimizer * @subpackage Admin\Pages */ // Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Class WRIO_License_Page_View * * Handles the license management admin page. */ class WRIO_License_Page_View { /** * Page ID * * @var string */ public $id = 'wrio_license'; /** * Page hook suffix * * @var string|false */ private $page_hook; /** * Premium provider instance * * @var WRIO_Premium_Provider * @phpstan-ignore-next-line property.onlyRead */ private $premium; /** * License instance * * @var WRIO_License * @phpstan-ignore-next-line property.onlyRead */ private $license; /** * Whether premium is activated * * @var bool|null */ private $is_premium; /** * Plan name * * @var string */ public $plan_name; /** * Subscribe widget instance * * @var WRIO_Subscribe_Widget */ private $subscribe_widget; /** * Constructor */ public function __construct() { $this->is_premium = null; $this->plan_name = __( 'Robin image optimizer Premium', 'robin-image-optimizer' ); // Initialize subscribe widget. $this->subscribe_widget = new WRIO_Subscribe_Widget(); add_action( 'admin_menu', [ $this, 'register_page' ], 9 ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); add_action( 'wp_ajax_wrio_license_action', [ $this, 'ajax_handler' ] ); // Register this page in the Factory navigation menu $this->register_in_factory_menu(); } /** * Register this page in the Factory impressive menu system * * This allows the license page to appear in the left navigation bar * alongside other Factory-registered pages. * * @return void */ private function register_in_factory_menu() { global $factory_impressive_page_menu; $page_url = admin_url( 'admin.php?page=' . $this->id ); $factory_impressive_page_menu['robin-image-optimizer'][ $this->id ] = [ 'type' => 'page', 'url' => $page_url, 'title' => __( 'License', 'robin-image-optimizer' ) . ' <span class="dashicons dashicons-admin-network"></span>', 'short_description' => __( 'Product activation', 'robin-image-optimizer' ), 'position' => 10, 'parent' => 'rio_general', ]; } /** * Initialize premium data * * Called late to ensure WRIO_Plugin is available. * * @return void */ private function init_premium() { if ( null !== $this->premium ) { return; } /** * Initializes the premium provider instance. * * @var WRIO_Premium_Provider $premium */ $premium = WRIO_Plugin::app()->premium; $this->premium = $premium; /** * Gets the license instance from premium provider. * * @var WRIO_License $license */ $license = $premium->get_license(); $this->license = $license; $this->is_premium = $premium->is_activate(); } /** * Register the admin page * * @return void */ public function register_page() { // Parent slug follows Factory pattern: {page_id}-{plugin_name} $parent_slug = 'rio_general-robin-image-optimizer'; $this->page_hook = add_submenu_page( $parent_slug, __( 'License', 'robin-image-optimizer' ), __( 'License', 'robin-image-optimizer' ), 'manage_options', $this->id, [ $this, 'render_page' ], 90 // Position before About Us (which uses 100) ); } /** * Enqueue page assets * * @param string $hook Current admin page hook. * @return void */ public function enqueue_assets( $hook ) { if ( $this->page_hook !== $hook ) { return; } wp_enqueue_script( 'wrio-license-manager', WRIO_PLUGIN_URL . '/admin/assets/js/wrio-license-manager.js', [ 'jquery' ], WRIO_Plugin::app()->getPluginVersion(), true ); // Enqueue the Factory bootstrap core CSS (provides .btn, .form-control, etc.) wp_enqueue_style( 'wrio-bootstrap-core', WRIO_PLUGIN_URL . '/libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css', [], WRIO_Plugin::app()->getPluginVersion() ); // Enqueue the license manager CSS from Factory templates wp_enqueue_style( 'wrio-license-manager', WRIO_PLUGIN_URL . '/libs/factory/templates/assets/css/license-manager.css', [ 'wrio-bootstrap-core' ], WRIO_Plugin::app()->getPluginVersion() ); // Enqueue the impressive page template CSS for full layout wp_enqueue_style( 'wrio-impressive-template', WRIO_PLUGIN_URL . '/libs/factory/templates/pages/templates/impressive/assets/css/impressive.page.template.css', [ 'wrio-bootstrap-core' ], WRIO_Plugin::app()->getPluginVersion() ); // Enqueue subscribe widget CSS. wp_enqueue_style( 'wrio-subscribe-widget', WRIO_PLUGIN_URL . '/admin/assets/css/wrio-subscribe-widget.css', [], WRIO_Plugin::app()->getPluginVersion() ); // Hide internal pages from sidebar (Custom Folders, Nextgen Gallery) wp_add_inline_style( 'wrio-impressive-template', '#io_folders_statistic-robin-image-optimizer-tab, #io_nextgen_gallery_statistic-robin-image-optimizer-tab { display: none !important; }' ); } /** * Handle AJAX license actions * * @return void */ public function ajax_handler() { // Verify nonce if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ), 'wrio_license_action' ) ) { wp_send_json_error( [ 'message' => __( 'Security check failed.', 'robin-image-optimizer' ) ] ); } // Check capabilities if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( [ 'message' => __( 'You do not have permission to perform this action.', 'robin-image-optimizer' ) ] ); } $this->init_premium(); $action = isset( $_POST['license_action'] ) ? sanitize_text_field( wp_unslash( $_POST['license_action'] ) ) : ''; $license_key = isset( $_POST['licensekey'] ) ? trim( wp_unslash( $_POST['licensekey'] ) ) : ''; $allowed_actions = [ 'activate', 'deactivate', 'unsubscribe' ]; if ( empty( $action ) || ! in_array( $action, $allowed_actions, true ) ) { wp_send_json_error( [ 'message' => __( 'Invalid action.', 'robin-image-optimizer' ) ] ); } try { switch ( $action ) { case 'activate': if ( empty( $license_key ) ) { wp_send_json_error( [ 'message' => __( 'Please enter a license key.', 'robin-image-optimizer' ) ] ); } $this->premium->activate( $license_key ); $message = __( 'Your license has been successfully activated.', 'robin-image-optimizer' ); break; case 'deactivate': $this->premium->deactivate(); $message = __( 'Your license has been deactivated.', 'robin-image-optimizer' ); break; case 'unsubscribe': $this->premium->cancel_paid_subscription(); $message = __( 'Your subscription has been cancelled.', 'robin-image-optimizer' ); break; default: wp_send_json_error( [ 'message' => __( 'Unknown action.', 'robin-image-optimizer' ) ] ); } wp_send_json_success( [ 'message' => $message ] ); } catch ( Exception $e ) { wp_send_json_error( [ 'message' => $e->getMessage() ] ); } } /** * Render the admin page * * @return void */ public function render_page() { $this->init_premium(); $min_height = $this->calculate_menu_height(); ?> <div id="WBCR" class="wrap"> <div class="wbcr-factory-templates-759-impressive-page-template factory-bootstrap-500 factory-fontawesome-000"> <div class="wbcr-factory-page wbcr-factory-page-<?php echo esc_attr( $this->id ); ?>"> <?php $this->render_header(); ?> <div class="wbcr-factory-left-navigation-bar"> <?php $this->render_page_menu(); ?> </div> <div class="wbcr-factory-page-inner-wrap"> <div class="wbcr-factory-content-section wbcr-fullwidth"> <div class="wbcr-factory-content" style="min-height:<?php echo esc_attr( (string) $min_height ); ?>px"> <div id="wrio-license-wrapper" data-loader="<?php echo esc_url( admin_url( 'images/spinner.gif' ) ); ?>" data-nonce="<?php echo esc_attr( wp_create_nonce( 'wrio_license_action' ) ); ?>"> <?php $this->render_license_form(); ?> </div> </div> </div> </div> </div> <div class="clearfix"></div> </div> </div> <?php } /** * Calculate minimum height for content based on menu items * * @return int */ private function calculate_menu_height() { global $factory_impressive_page_menu; $menu_scope = 'robin-image-optimizer'; $min_height = 0; if ( isset( $factory_impressive_page_menu[ $menu_scope ] ) ) { foreach ( $factory_impressive_page_menu[ $menu_scope ] as $page ) { if ( ! isset( $page['parent'] ) || empty( $page['parent'] ) ) { $min_height += 77; } } } return $min_height; } /** * Render the page header * * @return void */ private function render_header() { ?> <div class="wbcr-factory-page-header"> <div class="wbcr-factory-header-logo"> <?php echo esc_html( WRIO_Plugin::app()->getPluginTitle() ); ?> <span class="version"><?php echo esc_html( WRIO_Plugin::app()->getPluginVersion() ); ?></span> <span class="dash">—</span> </div> <div class="wbcr-factory-header-title"> <h2><?php esc_html_e( 'Page', 'robin-image-optimizer' ); ?>: <?php esc_html_e( 'License', 'robin-image-optimizer' ); ?></h2> </div> <div class="wbcr-factory-control"> <?php do_action( 'wbcr_factory_pages_impressive_header', WRIO_Plugin::app()->getPluginName() ); ?> </div> </div> <?php } /** * Render the left navigation menu * * @return void */ private function render_page_menu() { global $factory_impressive_page_menu; $menu_scope = 'robin-image-optimizer'; $self_page_id = $this->id; if ( ! isset( $factory_impressive_page_menu[ $menu_scope ] ) ) { return; } $page_menu = $factory_impressive_page_menu[ $menu_scope ]; // Sort by position (descending - higher position = higher in menu) uasort( $page_menu, function ( $a, $b ) { return $b['position'] <=> $a['position']; } ); ?> <ul> <?php // First, render parent pages foreach ( $page_menu as $page_screen => $page ) : if ( ! empty( $page['parent'] ) ) { continue; } $active_tab = ( $page_screen === $self_page_id ) ? ' wbcr-factory-active-tab' : ''; ?> <li class="wbcr-factory-nav-tab<?php echo esc_attr( $active_tab ); ?>"> <a href="<?php echo esc_url( $page['url'] ); ?>" id="<?php echo esc_attr( $page_screen ); ?>-tab" class="wbcr-factory-tab__link js-wbcr-factory-tab__link"> <div class="wbcr-factory-tab__title"> <?php echo wp_kses( $page['title'], [ 'span' => [ 'class' => [] ] ] ); ?> </div> <?php if ( ! empty( $page['short_description'] ) ) : ?> <div class="wbcr-factory-tab__short-description"> <?php echo esc_html( $page['short_description'] ); ?> </div> <?php endif; ?> </a> </li> <?php endforeach; ?> <?php // Then, render child pages foreach ( $page_menu as $page_screen => $page ) : if ( empty( $page['parent'] ) ) { continue; } $active_tab = ( $page_screen === $self_page_id ) ? ' wbcr-factory-active-tab' : ''; ?> <li class="wbcr-factory-nav-tab<?php echo esc_attr( $active_tab ); ?>"> <a href="<?php echo esc_url( $page['url'] ); ?>" id="<?php echo esc_attr( $page_screen ); ?>-tab" class="wbcr-factory-tab__link js-wbcr-factory-tab__link"> <div class="wbcr-factory-tab__title"> <?php echo wp_kses( $page['title'], [ 'span' => [ 'class' => [] ] ] ); ?> </div> <?php if ( ! empty( $page['short_description'] ) ) : ?> <div class="wbcr-factory-tab__short-description"> <?php echo esc_html( $page['short_description'] ); ?> </div> <?php endif; ?> </a> </li> <?php endforeach; ?> </ul> <?php } /** * Get license type for CSS class * * @return string free|gift|trial|paid */ private function get_license_type() { if ( ! $this->is_premium || null === $this->license ) { return 'free'; } if ( $this->license->is_lifetime() ) { return 'gift'; } if ( $this->license->get_expiration_time( 'days' ) < 1 ) { return 'trial'; } return 'paid'; } /** * Get hidden license key (first 8 + last 4 characters) * * @return string */ private function get_hidden_license_key() { if ( ! $this->is_premium || null === $this->license ) { return ''; } return $this->license->get_masked_key(); } /** * Get unified expiration display string * * @return string */ private function get_expiration_display() { if ( ! $this->is_premium || null === $this->license ) { return __( 'N/A', 'robin-image-optimizer' ); } return $this->license->get_expiration_display(); } /** * Render the license form * * @return void */ private function render_license_form() { $license_type = $this->get_license_type(); $plan_title = __( 'Free', 'robin-image-optimizer' ); $has_pro = null !== $this->premium && null !== $this->premium->get_plan_id(); if ( $has_pro ) { $plan_title = __( 'Pro', 'robin-image-optimizer' ); } $license_status_label = __( 'License', 'robin-image-optimizer' ); ?> <div id="license-manager" class="factory-bootstrap-500 onp-page-wrap <?php echo esc_attr( $license_type ); ?>-license-manager-content"> <?php if ( ! $has_pro ) : ?> <?php $this->render_upgrade_banner(); ?> <?php endif; ?> <div class="onp-container"> <div class="license-details"> <h3> <?php echo esc_html( $license_status_label ); ?> <span class="license-info-badge <?php echo esc_attr( 'license-info-badge--plan-' . ( $has_pro ? 'pro' : 'free' ) ); ?>"> <?php echo esc_html( $plan_title ); ?> </span> <?php if ( $this->is_premium ) : ?> <span class="license-info-badge license-info-badge--expiration"> <?php echo esc_html( $this->get_expiration_display() ); ?> </span> <?php endif; ?> </h3> </div> <div class="license-input"> <form action="" method="post"> <?php if ( $this->is_premium ) : ?> <p><?php esc_html_e( 'Have a key to activate the premium version? Paste it here:', 'robin-image-optimizer' ); ?></p> <?php else : ?> <p><?php esc_html_e( 'Have a key to activate the plugin? Paste it here:', 'robin-image-optimizer' ); ?></p> <?php endif; ?> <div class="license-key-wrap"> <input type="text" id="license-key" name="licensekey" value="" class="form-control" placeholder="<?php echo esc_html( $this->get_hidden_license_key() ); ?>" /> <?php if ( $this->is_premium ) : ?> <button data-action="deactivate" class="button button-primary wrio-license-btn" type="button" id="license-submit"> <?php esc_html_e( 'Deactivate', 'robin-image-optimizer' ); ?> </button> <?php else : ?> <button data-action="activate" class="button button-primary wrio-license-btn" type="button" id="license-submit"> <?php esc_html_e( 'Activate', 'robin-image-optimizer' ); ?> </button> <?php endif; ?> </div> <?php $this->render_learnmore_section(); ?> <div id="license-form-error-container"></div> <?php $this->render_freemius_migration_notice(); ?> </form> </div> </div> <?php $this->subscribe_widget->render(); ?> </div> <?php } /** * Render the upgrade banner for free users * * @return void */ private function render_upgrade_banner() { $support = WRIO_Plugin::app()->get_support(); $pricing_url = $support->get_pricing_url( true, 'license_banner' ); ?> <div class="wrio-license-upgrade-banner"> <div class="wrio-license-upgrade-icon"> <span>⚡</span> </div> <div class="wrio-license-upgrade-content"> <h2 class="wrio-license-upgrade-title"><?php esc_html_e( 'Supercharge Your Image Optimization', 'robin-image-optimizer' ); ?></h2> <p class="wrio-license-upgrade-subtitle"><?php esc_html_e( "You're using the free version. Upgrade to unlock unlimited conversions and premium features.", 'robin-image-optimizer' ); ?></p> <div class="wrio-license-upgrade-features"> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'Unlimited AVIF', 'robin-image-optimizer' ); ?></span> </div> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'Custom Folders Optimization', 'robin-image-optimizer' ); ?></span> </div> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'NextGen Gallery Support', 'robin-image-optimizer' ); ?></span> </div> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'Priority Support', 'robin-image-optimizer' ); ?></span> </div> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'More Compression Modes', 'robin-image-optimizer' ); ?></span> </div> <div class="wrio-license-upgrade-feature"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path> </svg> <span><?php esc_html_e( 'Super Page Cache Pro', 'robin-image-optimizer' ); ?></span> </div> </div> <a href="<?php echo esc_url( $pricing_url ); ?>" class="wrio-license-upgrade-button" target="_blank" rel="noopener"> <?php esc_html_e( 'View Pro Plans', 'robin-image-optimizer' ); ?> → </a> </div> </div> <?php } /** * Render learn more section * * @return void */ private function render_learnmore_section() { $support = WRIO_Plugin::app()->get_support(); if ( ! $this->is_premium ) : ?> <p style="margin-top: 10px;"> <?php printf( wp_kses( /* translators: %1$s: opening link tag, %2$s: closing link tag */ __( 'Can\'t find your key? Go to %1$sthis page%2$s and login using the e-mail address associated with your purchase.', 'robin-image-optimizer' ), [ 'a' => [ 'href' => [], 'target' => [], 'rel' => [], ], ] ), '<a href="' . esc_url( $support->get_contacts_url( true, 'license_page' ) ) . '" target="_blank" rel="noopener">', '</a>' ); ?> </p> <?php endif; } /** * Render migration notice for Freemius license holders * * @return void */ private function render_freemius_migration_notice() { if ( ! $this->is_premium || null === $this->license || $this->license->get_source() !== WRIO_License::SOURCE_FREEMIUS ) { return; } ?> <div class="wrio-migration-notice"> <p> <strong><?php esc_html_e( 'Action Required:', 'robin-image-optimizer' ); ?></strong> <?php esc_html_e( 'Your license was issued through our previous licensing system (Freemius). Please contact support to receive a new Themeisle license key for continued access to updates and support.', 'robin-image-optimizer' ); ?> </p> <p> <a href="<?php echo esc_url( WRIO_Plugin::app()->get_support()->get_contacts_url( true, 'license_migration' ) ); ?>" target="_blank" rel="noopener" class="button button-primary"> <?php esc_html_e( 'Contact Support', 'robin-image-optimizer' ); ?> </a> </p> </div> <?php } }
Save
Cancel