settings = $settings; $this->rollback = $rollback; } /** * Register Admin Menus. */ public function add_admin_menu() { $this->hook_suffix = add_menu_page( __( 'Ahtesham Web Vitals Booster', 'ahtesham-web-vitals-booster' ), __( 'Web Vitals Booster', 'ahtesham-web-vitals-booster' ), 'manage_options', 'ahtesham-web-vitals-booster', array( $this, 'render_admin_page' ), 'dashicons-performance', 59 ); add_submenu_page( 'ahtesham-web-vitals-booster', __( 'Dashboard & Overview', 'ahtesham-web-vitals-booster' ), __( 'Dashboard', 'ahtesham-web-vitals-booster' ), 'manage_options', 'ahtesham-web-vitals-booster', array( $this, 'render_admin_page' ) ); add_submenu_page( 'ahtesham-web-vitals-booster', __( 'Optimization Settings', 'ahtesham-web-vitals-booster' ), __( 'Settings', 'ahtesham-web-vitals-booster' ), 'manage_options', 'awvb-settings', array( $this, 'render_settings_page' ) ); add_submenu_page( 'ahtesham-web-vitals-booster', __( 'Diagnostics & Health', 'ahtesham-web-vitals-booster' ), __( 'Diagnostics', 'ahtesham-web-vitals-booster' ), 'manage_options', 'awvb-diagnostics', array( $this, 'render_diagnostics_page' ) ); } /** * Enqueue Admin CSS & JS. * * @param string $hook */ public function enqueue_admin_assets( $hook ) { if ( false === strpos( $hook, 'ahtesham-web-vitals-booster' ) && false === strpos( $hook, 'awvb-' ) ) { return; } wp_enqueue_style( 'awvb-admin-css', AWVB_PLUGIN_URL . 'assets/css/admin.css', array(), AWVB_VERSION ); wp_enqueue_script( 'awvb-admin-js', AWVB_PLUGIN_URL . 'assets/js/admin.js', array( 'jquery' ), AWVB_VERSION, true ); wp_localize_script( 'awvb-admin-js', 'awvbAdminData', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'awvb_admin_nonce' ), 'strings' => array( 'saving' => __( 'Saving...', 'ahtesham-web-vitals-booster' ), 'saveChanges' => __( 'Save Optimization Settings', 'ahtesham-web-vitals-booster' ), ), ) ); } /** * Add AWVB quick-action node to the WordPress Admin Bar. * * @param WP_Admin_Bar $wp_admin_bar */ public function add_admin_bar_node( $wp_admin_bar ) { if ( ! current_user_can( 'manage_options' ) ) { return; } $wp_admin_bar->add_node( array( 'id' => 'awvb-menu', 'title' => ' Web Vitals', 'href' => admin_url( 'admin.php?page=ahtesham-web-vitals-booster' ), ) ); $wp_admin_bar->add_node( array( 'id' => 'awvb-purge-cache', 'parent' => 'awvb-menu', 'title' => __( 'Purge All Caches', 'ahtesham-web-vitals-booster' ), 'href' => '#', ) ); $wp_admin_bar->add_node( array( 'id' => 'awvb-bar-settings', 'parent' => 'awvb-menu', 'title' => __( 'Settings', 'ahtesham-web-vitals-booster' ), 'href' => admin_url( 'admin.php?page=awvb-settings' ), ) ); } /** * Render main Dashboard view. */ public function render_admin_page() { $settings = $this->settings; $rollback = $this->rollback; include AWVB_PLUGIN_DIR . 'admin/views/dashboard.php'; } /** * Render Settings view. */ public function render_settings_page() { $settings = $this->settings; $rollback = $this->rollback; include AWVB_PLUGIN_DIR . 'admin/views/settings.php'; } /** * Render Diagnostics view. */ public function render_diagnostics_page() { $diagnostics = AWVB_Diagnostics::run_diagnostics(); $export_text = AWVB_Diagnostics::generate_export_report(); include AWVB_PLUGIN_DIR . 'admin/views/diagnostics.php'; } /** * AJAX: Save Settings with automatic backup snapshot. */ public function ajax_save_settings() { check_ajax_referer( 'awvb_admin_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Permission denied.', 'ahtesham-web-vitals-booster' ) ) ); } $this->rollback->create_backup( 'Auto snapshot before settings save' ); $raw_data = isset( $_POST['awvb_settings'] ) ? (array) $_POST['awvb_settings'] : array(); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $success = $this->settings->update( $raw_data ); $browser_cache = ! empty( $raw_data['browser_caching'] ); AWVB_Cache::update_htaccess_rules( $browser_cache ); if ( $success ) { wp_send_json_success( array( 'message' => __( 'Optimization settings saved successfully! Snapshot created.', 'ahtesham-web-vitals-booster' ) ) ); } else { wp_send_json_success( array( 'message' => __( 'Settings updated (no changes detected).', 'ahtesham-web-vitals-booster' ) ) ); } } /** * AJAX: Apply 1-Click Preset (Safe or Balanced). */ public function ajax_apply_preset() { check_ajax_referer( 'awvb_admin_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Permission denied.', 'ahtesham-web-vitals-booster' ) ) ); } $preset = isset( $_POST['preset'] ) ? sanitize_key( $_POST['preset'] ) : 'safe'; $this->rollback->create_backup( 'Preset applied: ' . ucfirst( $preset ) ); $new_defaults = AWVB_Settings::get_default_settings( $preset ); $this->settings->update( $new_defaults ); wp_send_json_success( array( 'message' => sprintf( __( '%s preset applied successfully!', 'ahtesham-web-vitals-booster' ), ucfirst( $preset ) ) ) ); } /** * AJAX: Restore Backup Snapshot. */ public function ajax_restore_backup() { check_ajax_referer( 'awvb_admin_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Permission denied.', 'ahtesham-web-vitals-booster' ) ) ); } $backup_id = isset( $_POST['backup_id'] ) ? sanitize_text_field( wp_unslash( $_POST['backup_id'] ) ) : ''; $res = $this->rollback->restore_backup( $backup_id ); if ( is_wp_error( $res ) ) { wp_send_json_error( array( 'message' => $res->get_error_message() ) ); } else { wp_send_json_success( array( 'message' => __( 'Configuration snapshot restored!', 'ahtesham-web-vitals-booster' ) ) ); } } /** * AJAX: Clean Expired Transients. */ public function ajax_clean_transients() { check_ajax_referer( 'awvb_admin_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Permission denied.', 'ahtesham-web-vitals-booster' ) ) ); } $cleaned = AWVB_Database::clean_expired_transients(); wp_send_json_success( array( 'message' => sprintf( __( 'Cleaned %d expired transients safely!', 'ahtesham-web-vitals-booster' ), $cleaned ) ) ); } /** * AJAX: Purge All Caches. */ public function ajax_purge_cache() { check_ajax_referer( 'awvb_admin_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Permission denied.', 'ahtesham-web-vitals-booster' ) ) ); } AWVB_Cache_Plugins::purge_all_detected_caches(); delete_transient( 'awvb_diagnostics_cache' ); wp_send_json_success( array( 'message' => __( 'All site and plugin caches purged successfully!', 'ahtesham-web-vitals-booster' ) ) ); } }